跨站请求伪造(CSRF)攻击的进阶利用与防御绕过技术详解
字数 1618 2025-11-10 05:35:50
跨站请求伪造(CSRF)攻击的进阶利用与防御绕过技术详解
1. 知识点描述
跨站请求伪造(CSRF)是一种攻击技术,攻击者诱骗已登录用户在不知情的情况下执行非本意的操作(如修改密码、转账等)。其核心利用的是浏览器的同源策略不阻止跨域请求发送的特性(仅限制响应读取)。进阶CSRF攻击关注如何绕过常见防御措施(如Token验证、Referer检查、SameSite Cookie等),并扩展攻击场景(如结合其他漏洞或特殊请求类型)。
2. CSRF攻击的基本原理
关键条件:
- 用户已登录目标网站(Cookie/Session有效)。
- 用户访问恶意页面(如钓鱼邮件中的链接)。
- 恶意页面自动发送跨域请求(如通过
<img>、表单、JavaScript)。 - 目标网站未校验请求的合法性(如缺少Token或Referer验证)。
简单示例:
<!-- 恶意页面内嵌表单,用户访问后自动提交 -->
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="10000">
<input type="hidden" name="to" value="attacker_account">
</form>
<script>document.forms[0].submit();</script>
3. 进阶利用技术
3.1 绕过Token验证
-
Token泄露:
- 若网站存在XSS漏洞,攻击者可通过XSS窃取Token,再构造CSRF请求。
- 或通过网络嗅探(HTTP页面传输Token)、子域名漏洞(Token共享域不严格)获取Token。
-
Token绑定不严:
- 若Token仅绑定会话而非具体操作,可重复使用(如一次获取多次提交)。
- 攻击者先通过合法请求获取Token,再嵌入恶意请求。
3.2 绕过Referer检查
-
Referer为空或伪造:
- 某些浏览器隐私模式或插件会清除Referer。
- 通过HTTPS→HTTP降级或
<meta name="referrer" content="no-referrer">屏蔽Referer。 - 利用开放重定向(如
https://target.com/redirect?url=evil.com)使Referer看似合法。
-
子域名绕过:
- 若检查逻辑为“Referer包含目标域名”,攻击者可控制子域名(如
https://attacker.target.com)构造请求。
- 若检查逻辑为“Referer包含目标域名”,攻击者可控制子域名(如
3.3 利用JSONP绕过SameSite Cookie
- SameSite=Lax/Strict可阻止部分CSRF,但JSONP接口可能豁免(历史遗留API)。
- 攻击者通过
<script>标签调用目标网站的JSONP接口,利用浏览器自动携带Cookie的特性执行操作:
<script src="https://bank.com/api/transfer?callback=malicious"></script>
4. 扩展攻击场景
4.1 结合HTTP请求走私
- 通过请求走私(HTTP Request Smuggling)将CSRF请求“隐藏”在合法请求中,绕过前端防护。
4.2 文件上传CSRF
- 若上传功能仅校验Session而未校验Token,可构造表单自动上传恶意文件:
<form action="https://site.com/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file" value="evil.exe">
</form>
4.3 使用Fetch API构造复杂请求
- 通过JavaScript的
fetch发送POST/JSON请求(需CORS宽松配置):
fetch("https://api.target.com/change_profile", {
method: "POST",
credentials: "include", // 携带Cookie
body: JSON.stringify({email: "attacker@evil.com"})
});
5. 防御措施与绕过应对
5.1 强化Token机制
- Token绑定用户会话+操作参数(如目标账户金额),每次请求更新。
- 避免通过URL传输Token(防止泄露)。
5.2 严格Referer验证
- 检查Referer是否来源于同一域名,拒绝空Referer(需权衡兼容性)。
5.3 SameSite Cookie+额外验证
- 关键操作(如转账)需二次认证(密码、OTP)。
5.4 自定义头验证
- 通过前端JavaScript添加自定义头(如
X-Requested-With: XMLHttpRequest),后端验证其存在性(依赖CORS策略禁止恶意页面跨域添加头)。
6. 总结
CSRF进阶利用的核心在于理解防御逻辑的薄弱点(如Token管理、Referer依赖、Cookie作用域),并结合其他漏洞(XSS、重定向)或技术(JSONP、请求走私)突破限制。防御需采用多层次校验(Token+Referer+SameSite+业务逻辑),避免单一依赖。