CSRF漏洞渗透测试

介绍CSRF漏洞

CSRF(Cross-site request forgery,跨站请求构造)是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任网站。与XSS攻击相比,CSRF攻击往往不大流行也难以防范,所以被认为比XSS更具危险性。

CSRF漏洞的原理

其实可以这样理解CSRF:攻击者利用目标用户的身份,以目标用户的名义执行某些非法操作。CSRF能够做的事情包括:以目标用户的名义发送邮件、发消息,盗取目标用户的账号,甚至购买商品,虚拟货币转账,这会泄露个人隐私并威胁到了目标用户的财产安全。
CSRF的攻击过程有以下两个重点。
1、目标用户已经登录了网站,能够执行网站的功能。
2、目标用户访问了攻击者构造的URL。

利用DVWA靶场进行CSRF漏洞测试

安装DVWA靶场可参考网上博客
dvwa安装、配置、使用教程(Linux)(windows同样适用)

打开PhpStudy安装配置好DVWA后可以在浏览器地址栏输入
https://127.0.0.1/DVWA-master/login.php(DVWA-master为我个人文件夹名称)
跳转到登录界面
CSRF漏洞渗透测试_第1张图片
DVWA靶场初始登录账号admin,密码password。
登录成功后进入主界面
CSRF漏洞渗透测试_第2张图片
靶场初始难度是impossible,调整一下难度
CSRF漏洞渗透测试_第3张图片

Low级CSRF测试

调整好难度之后进行测试,可以从测试源码中看到low级难度下网站对于CSRF攻击没有任何防备。
Low难度源代码:

' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); // Feedback for the user echo "
Password Changed.
"; } else { // Issue with passwords matching echo "
Passwords did not match.
"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); }

CSRF漏洞渗透测试_第4张图片
先进行一次密码修改,显示修改成功。
接下来CSRF攻击手段有两个方式:
DVWA靶场采用GET型输入,所以我们可以直接在URL上修改密码:
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=111111&password_conf=111111&Change=Change#
将URL进行包装之后发给别人并诱导其点开,就可以成功修改密码。

但目前很多网站不支持GET型输入而采用POST型输入方式,那么我们可以采用BurpSuit抓包进行CSRF的渗透测试。
输入我们想要修改的密码,然后进行抓包
CSRF漏洞渗透测试_第5张图片
BurpSuir自带CSRF测试工具,右键单击空白处出现相关工具再点击CSRF Poc生成
CSRF漏洞渗透测试_第6张图片
从生成的HTML中我们可以看到,本次是将密码修改成root,不过修改密码的各种信息都设置成了hidden状态,只显示了提交按钮
CSRF漏洞渗透测试_第7张图片
点击用浏览器测试,复制URL到浏览器中,会发现只有一个按钮,单击后密码就会修改成功
CSRF漏洞渗透测试_第8张图片
同理我们可以将这个页面美化丰富后,发给别人诱导其点击,从而完成CSRF攻击。

Medium级CSRF测试

修改测试级别为Medium后会发现页面没有变化,可以查看一下这个难度下CSRF的源代码:
Medium难度:

' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); // 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.
"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>

分析Medium与Low之间区别我们会发现,Medium难度多了一条判断语句,即判断目标请求来源的Referer,当与本机符合之后再执行密码修改的操作。
这时再用上述方法进行密码修改就会提示失败
CSRF漏洞渗透测试_第9张图片
在进行BurpSuit抓包,注意观察抓到的Referer是什么
CSRF漏洞渗透测试_第10张图片
继续CSRF Poc生成,这时我们可以复制生成的HTML代码,然后将代码放到PhpStudy目录下的WWW文件夹中,后缀改成html
CSRF漏洞渗透测试_第11张图片
然后在浏览器中直接运行也可以进行密码修改
CSRF漏洞渗透测试_第12张图片
原理就是其认证Referer来源自本浏览器,所以可以执行修改命令
另外可以自己手动输入Referer
直接在URL上进行密码修改,然后抓包可以看到没有显示Referer
CSRF漏洞渗透测试_第13张图片
手动输入Referer
CSRF漏洞渗透测试_第14张图片
放包提示修改成功。

至于High难度增加了token的认证,需要向服务器注入脚本,可以采用XSS攻击和CSRF攻击相结合进行渗透,而impossible难度则进行了用户的认证。

CSRF漏洞防范:

1.验证请求的Referer值,如果Referer是以自己网站开头的域名,说明请求来自网站自己,否则拒绝请求,不过该方法存在绕过可能。
2.在请求中加入攻击者无法伪造的信息,例如加入一个随机生成的token,请求时在服务器端验证token,这种方法安全性较Referer高一些。
3.对请求进行用户验证,即要求用户再度确认一下,例如再次输入密码,以防止CSRF攻击。
注意:CSRF攻击前提是用户登录过网站,并在本机上产生了cookie,且用同一浏览器打开了伪装的链接。

你可能感兴趣的:(安全)