0x01 漏洞描述
CSRF 为 “跨站请求伪造”,是一种劫持其他用户进行非法请求的攻击方式,主要用于越权操作,与 XSS 相比更具有危险性。
0x02 审计要点
1、首先要熟悉框架对 CSRF 的防护方案,一般审计时可查看增删改请求重是否有 token、 formtoken 等关键字以及是否有对请求的 Referer 有进行校验。
2、手动测试时,如果有 token 等关键则替换 token 值为自定义值并重放请求,如果没有则替换请求Referer 头为自定义链接或置空。重放请求看是否可以成功返回数据从而判断是否存在 CSRF 漏洞。
0x03 典型漏洞代码
这是一段密码修改的 PHP 程序,我们可以看出当 password_new 与 password_conf 一致时,程序就会进行修改密码的操作,这时如果我们构造这样一个 URL:
将 URL 发送给一个该网站的用户,当他点击了这个链接后,他的密码就会自动修改为 password。在现实环境中,黑客往往会把攻击流程做得更隐秘一些,例如制作一个页面,代码如下:
这样就可以做到隐秘得进行攻击了。
0x04 防御方案
1、STP(Synchronizer Token Pattern,令牌同步模式),这种防御机制是当用户发送请求时,服务器端应用将token 嵌入HTML表格中,并发送给客户端。客户端提交HTML表格,会将令牌发送到服务端,令牌的验证是由服务端执行的。令牌可以通过任何方式生成,只要确保其随机性和唯一性。这样就能够确保攻击者发送请求的时候,由于没有该令牌而无法通过验证。
2、检查Referer字段。HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,一般情况下,Referer 字段应该与请求地址位于同一域名下。而如果是 CSRF 攻击传递来的请求,Referer 字段会是包含恶意攻击载荷的地址,通过这种判断能够识别出 CSRF 攻击。这种防御手段的关键点在于如何建立合适的校验机制。
3、添加校验token。CSRF 的本质是攻击者通过欺骗用户去访问自己设置的地址,所以如果在所有用户进行敏感操作时,要求用户浏览器提供未保存在Cookie中且攻击者无法伪造的数据作为校验,那么攻击者就无法再进行 CSRF 攻击。这种方式通常是在请求时增加一个加密的字符串token,当客户端提交请求时,这个字符串token也被一并提交上去以供校验。当用户进行正常的访问时,客户端的浏览器能够正确得到并传回这个字符串token。
还有很多其他方式,比如验证码机制、自定义http请求头方式、Origin字段等,但是这些方法都存在各自的问题,如友好度差、存在机制绕过的可能等,因而只是作为辅助防御方式使用。
点赞,转发,在看
点击关注
学习技术
反入侵实验室
原文始发于微信公众号(反入侵实验室):0基础入门代码审计-4 CSRF
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论