CSRF常见攻防姿势总结
[Penetration Testing]
攻击点
referrer绕过
- 无验证
- http: //xxx.weibo.com(.cdxy.me)
- (http: //cdxy.me?)http: //xxx.weibo.com
捕捉token
如token通过get方法在url中显示时,常见方法是通过referrer偷token
利用
本身来说CSRF漏洞是广泛存在的,一般将其归类为“低危”,但只要利用的姿势够牛,CSRF也会有大作为。
除了常见的“刷粉丝”“发消息”“改信息”“蠕虫”等,还可以配合其他漏洞解锁更多好玩的利用姿势。
账号关联
如果绑定请求未做csrf防护,攻击者可以构造恶意请求让用户绑定了攻击者的账号。这样攻击者登录他自己的账号后就可以得到用户在其他平台的权限。
一种蠕虫
第三方登录
XSS+CSRF
使用XSS+AJAX自动触发CSRF,免除了CSRF里“用户打开链接之后才会触发”的利用缺陷。
防护
核心思想
有关CSRF的防御的核心思想可以总结为一句话: 在请求里cookies以外的位置,放入攻击者所不能伪造和复现的信息
三个条件
该“信息”需要满足以下三个条件:
- 随机性——不可预测
- 一次性——每次请求后要更新,不能共用、复用
- 保密性——敏感操作使用post,防止参数在url中泄露
针对2 3两条的理解,请参考这个漏洞: 聊着聊着我就上了你……的微信(两处都可以劫持微信登录的漏洞)
防护方法
服务端
- 检查referrer
- 验证token
- 在html头自定义属性并验证
其中第三项原理和token类似,只是位置不同,它在HTTP头中自定义的属性里。
比如:通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放入其中。这种方式的另一个好处是不必担心参数值在url中泄露
客户端
可使用js做一定程度上的防御,可以提高攻击成本,详细请参考 利用Window.Opener绕过CSRF保护
其他逻辑策略
- 在执行关键操作时(如修改密码,修改绑定邮箱手机等),除了要做CSRF的token防护之外,还应该要求重新输入当前账号密码,并加入验证码。
- 关键操作只接受post请求,只接受https请求