CSRF 跨站点请求伪造
Low
实验原理:服务端代码
' . mysql_error() . '' ); // Feedback for the user echo "Password Changed."; } else { // Issue with passwords matching echo "Passwords did not match."; } mysql_close(); } // Generate Anti-CSRF token generateSessionToken();
可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
漏洞分析
要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token。
试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击,下面是代码。1、构造链接
A) 最基础的:
Meduim
实验原理:
' . mysql_error() . '' ); // Feedback for the user echo "Password Changed."; } else { // Issue with passwords matching echo "Passwords did not match."; } } else { // Didn't come from a trusted source echo "That request didn't look correct."; } mysql_close(); }
检查string中是否含有pattern(不区分大小写),如果有返回True,反之False。
可以看到,Medium级别的代码检查了保留变量 HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.153.130),希望通过这种机制抵御CSRF攻击。漏洞利用
过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.153.130)
我们可以将攻击页面命名为192.168.153.130.html(页面被放置在攻击者的服务器里,这里是10.4.253.2)就可以绕过了High
服务器端核心代码
' . mysql_error() . '' ); // Feedback for the user echo "Password Changed."; } else { // Issue with passwords matching echo "Passwords did not match."; } mysql_close(); } // Generate Anti-CSRF token generateSessionToken(); ?>
可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
漏洞利用 要绕过High级别的反CSRF机制,关键是要获取token,要利用受害者的cookie去修改密码的页面获取关键的token。 试着去构造一个攻击页面,将其放置在攻击者的服务器,引诱受害者访问,从而完成CSRF攻击,下面是代码。攻击思路
是当受害者点击进入这个页面,脚本会通过一个看不见框架偷偷访问修改密码的页面,获取页面中的token,并向服务器发送改密请求,以完成CSRF攻击。
而现在的浏览器是不允许跨域请求的
这里简单解释下跨域,我们的框架iframe访问的地址是http://192.168.43.38/dvwa/vulnerabilities/csrf
,位于服务器192.168.43.38上,而我们的攻击页面位于黑客服务器x.x.x.x上,两者的域名不同,域名B下的所有页面都不允许主动获取域名A下的页面内容,除非域名A下的页面主动发送信息给域名B的页面,所以我们的攻击脚本是不可能取到改密界面中的user_token。 由于跨域是不能实现的,所以我们要将攻击代码注入到目标服务器192.168.43.38中,才有可能完成攻击。下面利用High级别的XSS漏洞协助获取Anti-CSRF token(因为这里的XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRF token)。