跨站请求伪造(Cross Site Request Forgery,CSRF)
Hacker ⽤户可以伪造admin ⽤户的转账请求,强制admin ⽤户,转账给任意⽤户。
基本概念
CSRF 是⼀种攻击,它强制终端⽤户在当前对其进⾏身份验证后的Web 应⽤程序上执⾏⾮本意操作的攻击。
CSRF 攻击的重点在于更改状态的请求,⽽不是盗取数据,因为攻击者⽆法查看伪造请求的响应。
借助于社⼯的⼀些帮助,例如,通过电⼦邮件或聊天发送链接,攻击者可以诱骗⽤户执⾏攻击者选择的操作。如果受害者是普通⽤户,则成功的CSRF 攻击可以强制⽤户执⾏更改状态的请求,例如转移资⾦、修改密码等操作。如果受害者是管理账户,CSRF 攻击会危及整个Web 应⽤程序。
关键点
受害者没有退出登录。
CSRF 是⼀种欺骗受害者提交恶意请求的攻击。它继承了受害者的身份和特权,代表受害者执⾏⾮本意的、恶意的操作。
对于⼤多数站点,浏览器请求会⾃动发送与站点关联的所有凭据,例如⽤户的会话Cookie,IP 地址,Windows 域凭据等。因此,如果⽤户已对当前站点进⾏了身份验证,则该站点没有办法区分⼀个请求是受害者发送的合法请求还是攻击者伪造受害者身份发送的⾮法请求。
CSRF 的场景复现
模拟银⾏⽹站
chrome/firefox/360极速版,三个不同浏览器使用不同账户登录:
admin/123456
hello/123456
hacker/123456
恶意⽹站
admin点击链接后:
hello用户点击链接后:
构造CSRF 攻击连接
get方式:
通过 标签构造GET 请求。这个GET 请求来⾃于受害者的浏览器,是⽤户发起的转账请求。受害者访问⽹站的时候加载了 标签。浏览器会根据 标签中的 SRC 属性,请求服务器资源(GET),会⾃动带上身份认证信息(Cookie,用户被切换为hacker了)。
CSRF 场景建模
post方式:
宝⼑在⼿,谁与争锋
与XSS 漏洞相结合
攻击者可以利⽤XSS 触发CSRF 攻击。因为,可以利⽤JS 发送HTTP 请求。
经过研究受害⽹站的业务流程,可以构造如下代码:
恶意代码触发,创建了wenxin/123456账户!
CSRF 漏洞的防御
⽆效的防御
使⽤秘密的Cookie(直接就可以使用了,无需解密)
仅接收POST 请求
多步交易
多步交易,有可能会被恶意攻击者预测。
URL 重写
⽤户的身份信息会暴露在URL 中不建议通过引⼊另外⼀个漏洞来解决当前漏洞
HTTPS
所有安全机制的前提
有效的防御
验证 Referer 字段
当前URL 的上⼀个URL是否可以伪造?
添加Token 验证
⼀串随机字符串每⼀次客户端的请求,服务器都要刷新Token服务器创建了⼀个Token 值,存储在服务器中并且下发到浏览器下次浏览器请求,需要提交该Token 值,服务器根据浏览器提交的Token 与服务器中存储的Token进⾏⽐对如果⼆者⼀致,说明请求是正常业务流程。如果⼆者不⼀致,说明请求有可能来⾃于恶意的攻击者。Token 的设计,在PHP 中通常利⽤SESSION 机制来实现。
⼆次验证
在关键操作之前,再输⼊密码或者验证码。