摘要跨站请求伪造CSRF是一种利用用户对已登录网站的信任来执行非本意操作的攻击方式。本文将从同源策略和Cookie机制等基础概念入手深入剖析CSRF的攻击原理、常见类型GET/POST及实例并进一步探讨JSONP劫持、CORS劫持等进阶攻击手法。最后文章将系统梳理CSRF的防御策略旨在帮助开发者构建更安全的Web应用。一、 前置知识Cookie、Session与同源策略理解CSRF必须从浏览器维持用户状态和实现安全隔离的机制说起。Cookie与SessionCookie是服务器发送到用户浏览器并保存在本地的一小块数据常用于保持用户的登录状态。Session则是服务器为每个用户会话创建的数据存储用于跟踪用户状态。CSRF攻击的核心在于利用浏览器在请求中自动携带Cookie的机制来伪装成已认证用户的身份。同源策略这是浏览器最核心的安全策略它规定了一个源的文档或脚本如何与另一个源的资源进行交互。所谓“同源”要求协议、域名、端口三者完全相同。同源策略限制了不同源的脚本读取Cookie等敏感数据是防御XSS和CSRF等攻击的基石。但如果网站存在逻辑漏洞攻击者可以诱使用户的浏览器“代为”发起请求从而绕过同源策略的某些限制。二、 CSRF攻击原理深度解析CSRFCross-Site Request Forgery即跨站请求伪造。攻击者诱导受害者进入第三方网站在受害者不知情的情况下以受害者的身份向被攻击网站发送恶意请求。攻击的三个必要条件漏洞存在目标网站存在一个可被预测和伪造的敏感操作请求如修改密码、转账且该请求不验证请求的真实意图。用户登录受害者已登录目标网站并在浏览器中生成了有效的会话Cookie。诱导触发受害者访问了攻击者构造的恶意页面或链接。攻击流程简述用户登录信任网站A网站A在用户浏览器设置Cookie。用户在不登出A的情况下访问了恶意网站B。网站B的页面中包含一个指向网站A的恶意请求如一个自动提交的表单或一个img标签的src。用户的浏览器在访问B时会自动携带网站A的Cookie向A发起这个恶意请求。网站A的服务器接收到带有正确Cookie的请求误以为是用户的正常操作执行了该请求如修改密码、转账。常见攻击场景修改密码、添加用户、转账支付、关注/订阅操作等。三、 CSRF攻击类型与实例根据请求方式CSRF主要分为GET型和POST型。1. GET型CSRF这是最简单、最常见的一种。敏感操作通过URL参数传递攻击者只需构造一个包含目标URL的链接或资源标签如img、iframe即可。实例一个修改密码的请求为http://target.com/change_pass?new_pass123。攻击者可以构造一个包含此链接的图片img srchttp://target.com/change_pass?new_passhacker123。用户一旦访问嵌入此图片的页面密码在不知情下被修改。2. POST型CSRF当网站使用POST方法提交表单时攻击难度稍增但依然可利用。攻击者需要构造一个隐藏的表单并通过JavaScript自动提交。实例银行转账使用POST表单。攻击者可以构造一个隐藏的form目标地址为银行的转账接口并预设好收款账户和金额。当用户访问恶意页面时脚本自动提交表单。注意早期一些后端代码使用$_REQUESTPHP获取参数它同时接收GET和POST的数据。此时即便前端改为POST用GET请求如图片src依然可以触发漏洞。正确的做法是严格区分$_GET和$_POST。四、 CSRF进阶跨域资源劫持当CSRF攻击的目标是“读取”数据而非“写入”操作时它演变为跨域资源劫持。其核心在于绕过同源策略读取本应受保护的数据。1. JSONP劫持JSONP是一种早期用于跨域数据请求的技术。它通过script标签的src属性加载跨域数据服务器将数据包装在客户端指定的回调函数中返回。漏洞原理如果JSONP接口对请求来源Referer校验不严或者回调函数名可预测攻击者就可以在自己的页面中构造script标签指定回调函数来窃取数据。防御严格校验Referer使用不可预测的Token尽管JSONP本身设计不支持自定义Header但可在回调参数中加入Token。2. CORS劫持CORS是现代跨域解决方案的标准。服务器通过设置响应头如Access-Control-Allow-Origin来声明允许哪些源访问资源。漏洞原理服务器CORS配置不当可能导致漏洞。例如Access-Control-Allow-Origin: *且Access-Control-Allow-Credentials: true允许携带Cookie的任意源访问。Access-Control-Allow-Origin反射了请求中的Origin头即来自任何域的请求都返回该域为允许源。对Origin的校验存在逻辑缺陷如前缀/后缀匹配错误。防御严格配置CORS策略避免使用通配符*与凭证Credentials: true的组合对Origin进行精确的白名单校验。3. OAuth劫持OAuth是常用的第三方授权协议。在授权流程中服务端会生成一个授权码code并通过重定向URIredirect_uri返回给客户端。漏洞原理如果对redirect_uri的校验不严格如仅校验主域但其子域可被攻击者控制攻击者可以将redirect_uri设置为一个自己可控的页面如包含外部图片的帖子。当用户授权后code会随着请求被带到这个页面攻击者可以从HTTP Referer头部或页面内容中窃取code从而劫持用户身份。防御严格校验redirect_uri确保它与客户端注册的地址完全匹配使用state参数防止CSRF。五、 CSRF漏洞挖掘思路寻找CSRF漏洞本质上是寻找那些缺乏足够身份验证的敏感操作端点。寻找敏感操作关注所有涉及状态改变的“增、删、改”操作特别是用户身份相关的修改信息、绑定/解绑、关注/取关、支付、密码重置等。检查防护缺失抓取关键操作的数据包观察是否有以下情况没有任何Token或验证码参数。删除或篡改Referer头后请求依然成功。尝试绕过防护如果存在Token等防护可尝试删除/置空Token服务器是否仍然处理请求Token共享用用户A的Token去请求用户B的操作是否成功解码/预测TokenToken是否为时间戳、用户ID的简单编码如Base64, MD5请求方法转换将POST请求改为GET请求是否可行窃取Token是否存在XSS、不安全的跳转等漏洞可用来窃取Token六、 CSRF防御最佳实践防御CSRF需要在服务器端实施多层次、纵深的安全策略。Anti-CSRF Token最有效、最常用在用户会话中生成一个随机、不可预测的Token。在渲染表单或发起敏感请求时将此Token嵌入如隐藏表单字段、自定义HTTP头。服务器在处理请求时校验这个Token是否与会话中的一致。这是目前主流的防御方案。同源检测检查Referer/Origin头部验证请求是否来自合法的、预期的源。这是一种简单有效的辅助手段但需注意Referer可能被浏览器禁用或篡改。二次确认增加验证码在关键操作如转账、修改密码前要求用户输入验证码。这能彻底杜绝CSRF但会影响用户体验通常用于高风险操作。重新认证在进行敏感操作前要求用户再次输入密码。安全的会话管理使用安全的Cookie属性HttpOnly防止JavaScript读取、Secure仅通过HTTPS传输、SameSite限制第三方Cookie发送是防御CSRF的强力属性。设置合理的会话超时时间。遵循安全设计原则区分请求方法遵循RESTful规范GET请求只用于获取数据永不修改数据POST/PUT/DELETE用于修改数据。避免使用$_REQUEST在服务器端明确使用$_GET或$_POST来获取参数。总结CSRF攻击利用了Web应用对用户浏览器的过度信任。最根本的防御之道是让服务器有能力区分“用户本意的请求”和“攻击者伪造的请求”。综合使用Anti-CSRF Token、SameSite Cookie属性并在关键操作辅以验证码或二次认证是构建坚固防线的最佳组合。博主心得学习网络安全理解攻击原理是为了更好地构建防御。CSRF作为一个经典的Web漏洞其原理清晰但变种和结合其他漏洞如XSS、JSONP的攻击手法层出不穷。作为开发者应在设计之初就将安全考虑进去作为安全爱好者则应保持好奇在合规的靶场中不断练习做到知其然更知其所以然。