Cross-Site Request Forgery跨站请求伪造漏洞,简称CSRF或XSRF,强制最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作,浏览器的安全策略是允许当前页面发送到任何地址的请求,所以用户在浏览无法控制的资源时,攻击者可以控制页面的内容来控制浏览器发送它精心构造的请求。
CSRF和SSRF的相似处在于请求伪造,区别在于CSRF伪造的请求是针对用户,SSRF针对的是服务器;和XSS相似处在跨站,都需要诱导用户点击恶意链接/文件,区别在于攻击效果及原理:CSRF基于Web的隐式身份验证机制,XSS本质是一种注入漏洞。漏洞原理如下:
根据请求方式的不同可以将漏洞分为:
1)资源包含(GET)
2)基于表单(POST)
3)XMLHttpRequest
1)冒充身份:订阅/关注/转发/投票操作,删除文件,更改配置等
2)帐户接管:密码修改,邮箱绑定,第三方帐户关联
3)其他:登录/注册/注销/注册
4)安全设计原则:CSRF登录后令牌未更新、登出后未注销等
2.2 缺少CSRF保护(Lack)
最简单的漏洞类型,没有任何针对CSRF的防护,也是挖掘中最常见的情形:关注每一个关键操作的请求包,若参数中没有CSRF令牌参数,篡改referer仍然返回正常,则大概率存在CSRF漏洞。
2.3 CSRF防护绕过(Bypass)
针对CSRF的两种防御分别有bypass手段:
1)Referer绕过
2)CSRF-token绕过:
1)邮箱绑定——账户接管
KhanAcademy可汗学院邮箱绑定处未设置header头和token校验:
抓取post,构造XHR发包的HTML文件poc.html:
将poc.html文件放在自己的服务器上,诱使受害者点击HTML文件,F12查看实则借用受害者权限向服务器发送请求:
查看绑定邮箱,已经篡改为攻击者邮箱,下面可通过此邮箱进行密码修改,从而接管任意账户,这也是CSRF实战攻击的一般流程。
2)空Referer绕过
Xvideo网站评论处未使用token机制,仅验证了referer且未验证空referer情况(无referer字段),利用data:协议绕过,如我们访问
data:text/html,<script>top.location.href='http://www.google.com/';</script>则会显示referer为空,所以构造payload:
拦截查看请求包:
返回包显示,请求成功:
3)CSRF——其他漏洞的辅助
Self-XSS+CSRF=Reflected-XSS
评论、登录、文件上传等处的Self-XSS,结合CSRF可变为反射型XSS,如评论处:
触发XSS:
还有经典的登录XSS:
编写payload:
触发XSS:
1) 验证header字段
常见的是Referer和Origin,Referer容易绕过,且会包含有一些敏感信息,可能会侵犯用
户的隐私,而Origin字段代表最初请求,更建议使用。
2) Token令牌机制
当前最成熟的防御机制,但若存在验证逻辑及配置问题则存在绕过风险。Token的生成机制通常和session标识符挂钩,将用户的token与session标识符在服务端进行匹配。当下已经有很多开源库和中间件都可以实现token生成。
3) 验证自定义header
如基于cookie的csrf保护,验证cookie中的某些值和参数必须相等