admin 发表于 5 天前

跨站请求伪造(CSRF)——无声的指令劫持与防御

跨站请求伪造(CSRF)——无声的指令劫持与防御摘要:跨站请求伪造(CSRF,Cross-Site Request Forgery)是一种利用用户已登录身份在后台执行非本意操作的攻击技术。与XSS不同,CSRF不需要窃取Cookie,而是直接“借用”用户的合法会话,在用户不知情的情况下发起转账、修改密码、发表恶意内容等请求。本文将深入分析CSRF的攻击原理,通过渗透测试演示其利用方式,并重点介绍基于Token、SameSite Cookie和二次验证的成熟防御策略。关键词:黑客网站攻击;CSRF;跨站请求伪造;渗透测试;会话劫持;SameSite;Anti-CSRF Token一、引言在许多黑客入侵事件中,攻击者无需破解密码,也无需注入恶意脚本,而是利用用户浏览器自动携带Cookie的特性,构造一个“合法”的伪造请求。例如,用户在登录银行网站后,点击攻击者发送的恶意链接,自己的账户就被转出了资金——这就是CSRF攻击的典型场景。由于CSRF利用了Web应用对用户身份信任机制的缺陷,长期以来位列OWASP Top 10严重漏洞之一。二、CSRF攻击原理2.1 漏洞根源CSRF的核心在于:Web应用仅依赖Cookie验证用户身份,而未对请求的发起来源进行校验。浏览器在向目标网站发送请求时,会自动携带该域下的所有Cookie(包括会话标识)。攻击者可以在第三方网站构造如下表单或图片标签:html



<img src="http://bank.com/transfer?to=attacker&amount=10000" style="display:none">
当已登录银行网站的用户访问包含该图片的恶意页面时,浏览器会向bank.com发起GET请求,并自动附上用户的Cookie。服务器收到请求后认为这是合法用户的操作,执行转账。2.2 CSRF的四个必要条件
[*]用户已登录目标网站,且会话Cookie未过期。
[*]目标网站的某个请求(通常为状态改变操作)存在CSRF漏洞。
[*]攻击者能够构造出完全合法的请求参数。
[*]用户通过浏览器访问攻击者控制的页面(或同域下的XSS配合)。
2.3 攻击类型
[*]GET型CSRF:通过<img>、<iframe>、<script>标签自动发起GET请求。
[*]POST型CSRF:构造自动提交的表单或使用JavaScript的fetch/XMLHttpRequest发送POST请求(需注意CORS限制,但传统表单没有跨域限制)。
[*]JSON型CSRF:利用<form enctype="text/plain">或fetch发送JSON格式数据,绕过简单的校验。
三、渗透测试视角:POST型CSRF攻击链条场景:某社交网站修改邮箱的请求为:text



POST https://social.com/api/change_emailContent-Type: application/x-www-form-urlencodedCookie: session=abc123email=new@attacker.com
该请求没有额外的防CSRF机制。步骤1:构造攻击页面
攻击者创建恶意HTML(托管在evil.com):html



<html><body><form id="csrf" action="https://social.com/api/change_email" method="POST">    <input type="hidden" name="email" value="hacked@evil.com"></form><script>document.getElementById("csrf").submit();</script></body></html>
步骤2:诱骗用户访问
通过钓鱼邮件或短链接将用户引导至evil.com。页面加载后表单自动提交,浏览器携带用户在social.com的有效Cookie。步骤3:后果
受害者的邮箱被修改为攻击者控制的地址,随后攻击者可使用“忘记密码”功能重置账户密码,完成黑客账户渗透。更隐蔽的方式:使用<iframe>或<img>搭配自动提交的JavaScript,全程无感知。四、CSRF与其他攻击的区别



攻击类型利用目标是否需要窃取数据前置条件
CSRF执行用户非本意操作否用户已登录
XSS窃取Cookie或执行恶意脚本是注入点
会话固定强制使用攻击者已知的会话ID否用户登录前设置Session

对于黑客网站攻击来说,CSRF常与XSS配合:XSS窃取页面中的CSRF Token后,再发起带正确Token的CSRF请求,从而绕过防御。五、CSRF防御完整方案防御CSRF的核心思想:在请求中加入攻击者无法伪造的额外验证信息。5.1 Anti-CSRF Token(同步令牌模式)
[*]原理:服务器在渲染页面时生成一个随机Token,嵌入到表单隐藏字段或请求头中。提交请求时,服务器验证Token是否匹配。
[*]实现:html



<input type="hidden" name="csrf_token" value="随机字符串">
Token应与用户会话绑定,每次会话不同或仅一次性使用。
[*]要求:Token不能通过Cookie传输,且需保证不可猜测(使用cryptographically secure random)。
5.2 SameSite Cookie属性(现代浏览器最强防御)
[*]Set-Cookie: session=xxx; SameSite=Lax:允许同站和顶级导航的GET请求携带Cookie,但禁止第三方站点的POST请求携带。
[*]SameSite=Strict:完全禁止第三方请求携带Cookie。
[*]SameSite=None; Secure:允许跨站携带,但仅限HTTPS,且需要显式声明。
[*]设置SameSite=Lax或Strict可天然防御绝大多数CSRF攻击,但需注意旧浏览器兼容性。
5.3 验证Referer或Origin头
[*]检查请求的Origin头(存在)或Referer头是否为合法域名白名单。
[*]缺点:用户可配置浏览器不发送Referer,或者某些环境(如HTTPS降级)会丢失;且不可完全依赖,可作为纵深防线。
5.4 自定义请求头(针对API)
[*]要求所有状态变更的请求必须包含自定义头,如X-Requested-With: XMLHttpRequest。由于浏览器不会在跨域简单请求中自动添加自定义头,且CORS预检会阻止未授权的跨域请求,因此可有效防御。
[*]注意:CORS策略需配置为只允许受信任源,否则攻击者仍可通过fetch添加自定义头(需要CORS预检,但若服务器允许任意源则危险)。
5.5 二次验证
[*]对于高风险操作(如转账、修改密码、删除账号),要求用户输入密码、验证码或进行双因素认证(2FA)。这是最彻底的防护,但用户体验稍差。
5.6 使用基于SameSite的Cookie + CSRF Token双重保障现代应用推荐:所有会话Cookie设置SameSite=Lax;同时为敏感API启用CSRF Token。对于不支持SameSite的旧浏览器,Token提供回退保护。六、检测CSRF漏洞的方法
[*]手工测试:删除或修改请求中的csrf_token参数,看是否仍能成功。
[*]关闭Cookie referer限制:使用Burp Suite生成CSRF POC,测试跨域提交。
[*]自动化扫描:使用OWASP ZAP、Acunetix、CSRF Tester等工具识别无Token的敏感请求。
[*]代码审计:检查所有POST、PUT、DELETE等状态变更接口是否验证Token或Referer。
七、总结与最佳实践CSRF是一种“借力打力”的攻击方式,攻击者不需要窃取任何用户凭证,只需构造一个请求并诱使受害者点击。防御CSRF最有效且简单的措施是设置Cookie的SameSite属性为Lax或Strict,并为所有状态变更API强制校验Anti-CSRF Token。对于高安全场景,应叠加Referer验证和二次认证。开发人员和渗透测试人员需时刻铭记:任何只依赖Cookie识别身份的请求都可能成为CSRF的攻击目标。通过多层防御,可有效防止这类黑客入侵手段。
页: [1]
查看完整版本: 跨站请求伪造(CSRF)——无声的指令劫持与防御