跨站请求伪造(CSRF)挖掘技巧及实战案例全汇总
- 2019 年 10 月 10 日
- 筆記

1、漏洞理解
Cross-Site Request Forgery跨站请求伪造漏洞,简称CSRF或XSRF,强制最终用户在当前对其进行身份验证的Web应用程序上执行不需要的操作,浏览器的安全策略是允许当前页面发送到任何地址的请求,所以用户在浏览无法控制的资源时,攻击者可以控制页面的内容来控制浏览器发送它精心构造的请求。
CSRF和SSRF的相似处在于请求伪造,区别在于CSRF伪造的请求是针对用户,SSRF针对的是服务器;和XSS相似处在跨站,都需要诱导用户点击恶意链接/文件,区别在于攻击效果及原理:CSRF基于Web的隐式身份验证机制,XSS本质是一种注入漏洞。漏洞原理如下:

根据请求方式的不同可以将漏洞分为:
1)资源包含(GET)
2)基于表单(POST)
3)XMLHttpRequest
2、挖掘技巧
2.1 常见功能
CSRF广义上存在于任何增删改操作中,根据经验常见的有:
1)冒充身份:订阅/关注/转发/投票操作,删除文件,更改配置等
2)帐户接管:密码修改,邮箱绑定,第三方帐户关联
3)其他:登录/注册/注销/注册
4)安全设计原则:CSRF登录后令牌未更新、登出后未注销等
2.2 缺少CSRF保护(Lack)
最简单的漏洞类型,没有任何针对CSRF的防护,也是挖掘中最常见的情形:关注每一个关键操作的请求包,若参数中没有CSRF令牌参数,篡改referer仍然返回正常,则大概率存在CSRF漏洞。
2.3 CSRF防护绕过(Bypass)
针对CSRF的两种防御分别有bypass手段:
1)Referer绕过
- 空referer绕过:其他协议(data:)或https跳http
- 包含referer:若只检查是否包含网址,只需在我们的网站上创建一个文件/文件夹即可,如 https://www.yoursite.com/https://www.theirsite.com/
2)CSRF-token绕过:
- 删除令牌:删除cookie/参数中token,免服务器验证
- 令牌共享:创建两个帐户,替换token看是否可以互相共用;
- 篡改令牌值:有时系统只会检查CSRF令牌的长度;
- 解码CSRF令牌:尝试进行MD5或Base64编码
- 修改请求方法:post改为get
- 窃取token:重定向、XSS、web缓存欺骗、clickjacking等都可能导致token泄露
3、实战案例:
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:

4、漏洞防御:
1) 验证header字段
常见的是Referer和Origin,Referer容易绕过,且会包含有一些敏感信息,可能会侵犯用
户的隐私,而Origin字段代表最初请求,更建议使用。
2) Token令牌机制
当前最成熟的防御机制,但若存在验证逻辑及配置问题则存在绕过风险。Token的生成机制通常和session标识符挂钩,将用户的token与session标识符在服务端进行匹配。当下已经有很多开源库和中间件都可以实现token生成。
3) 验证自定义header
如基于cookie的csrf保护,验证cookie中的某些值和参数必须相等