1.4 跨站请求伪造漏洞(CSRF)
0x01 漏洞描述
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。攻击者通过伪造来自受信任用户的请求,达到增加、删除、篡改网站内容的目的。
0x02 常见应用场景
一个成功的CSRF漏洞攻击的场景,需要由"三个部分"来构成。
- 有一个没有进行二次校验措施的前台或后台的数据修改、新增、删除等数据交互请求的漏洞存在;
- 伪装数据操作请求的恶意链接或者页面;
- 诱使用户主动访问、点击恶意链接,触发非法操作;
0x03 漏洞危害
CSRF漏洞是借助受害者的cookie来进行攻击者想要的恶意操作,攻击者并不是拿到了受害者cookie,对于服务器返回的结果也无法解析查看,攻击者的攻击就是让服务器执行了自己想要的操作指令或业务流程。
最常见的攻击场景为:攻击者冒充用户/管理员伪造请求,进行网页篡改;用户修改、添加用户、密码修改;发送帖子、消息等非法操作。
0x04 修复意见
- 验证HTTP Referer字段;
- 关键业务操作使用图形验证码进行二次确认验,只接受 POST 请求,GET请求应只浏览而不改变服务器端资源;
- 过滤用户输入,不允许发布含有站内操作URL的链接;
- 增加csrftoken验证,csrftoken可以在用户登陆后产生并放于 session 之中,然后在每次请求时把csrftoken从 session 中拿出,与请求中的csrftoken进行比对。对于GET请求,csrftoken将附在请求地址之后,对于POST请求来说,要在form的最后加上
<input type="hidden" name="csrftoken" value="tokenvalue"/>
; - 在 HTTP 头中自定义属性并验证,该方法同csrftoken,同为随机值校验,但是这里并不是把csrftoken以参数的形式置于HTTP请求之中,而是把它放到 HTTP头中自定义的属性里;
- 在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie。