介绍
这种漏洞一般不需要通过代码审计来发掘直接黑盒最方便。跨站请求伪造(Cross-Site Request Forgery, CSRF)是一种使已登录用户在不知情的情况下执行
某种动作的攻击。因为攻击者看不到伪造请求的响应结果,所以 CSRF 攻击主要用来执行动作,而非窃取
用户数据。当受害者是一个普通用户时, CSRF 可以实现在其不知情的情况下转移用户资金、发送邮件等操
作;但是如果受害者是一个具有管理员权限的用户时 CSRF 则可能威胁到整个 Web 系统的安全。
漏洞示例
由于开发人员对 CSRF 的了解不足,错把“经过认证的浏览器发起的请求”当成“经过认证的用户发起的请
求”,当已认证的用户点击攻击者构造的恶意链接后就“被”执行了相应的操作。例如,一个博客删除文章
是通过如下方式实现的:
GET http://blog.com/article/delete.jsp?id=102
当攻击者诱导用户点击下面的链接时,如果该用户登录博客网站的凭证尚未过期,那么他便在不知情的情
况下删除了 id 为 102 的文章,简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本
身是用户自愿发出的。
审计策略
此类漏洞一般都会在框架中解决修复,所以在审计 csrf 漏洞时。首先要熟悉框架对 CSRF 的防护方案,
一般审计时可查看增删改请求重是否有 token、 formtoken 等关键字以及是否有对请求的 Referer 有进
行校验。手动测试时,如果有 token 等关键则替换 token 值为自定义值并重放请求,如果没有则替换请求
Referer 头为自定义链接或置空。重放请求看是否可以成功返回数据从而判断是否存在 CSRF 漏洞。
修复方案
Referer 校验,对 HTTP 请求的 Referer 校验,如果请求 Referer 的地址不在允许的列表中,则拦截
请求。
Token 校验,服务端生成随机 token,并保存在本次会话 cookie 中,用户发起请求时附带 token 参
数,服务端对该随机数进行校验。如果不正确则认为该请求为伪造请求拒绝该请求。
Formtoken 校验, Formtoken 校验本身也是 Token 校验,只是在本次表单请求有效。
对于高安全性操作则可使用验证码、短信、密码等二次校验措施
增删改请求使用 POST 请求