
Wooyun Legacy
- 83 installs
- 1.7k repo stars
- Updated July 14, 2026
- tanweai/wooyun-legacy
Helps with ai & agent building tasks during AI-assisted development.
About
wooyun-legacy is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- wooyun-legacy
- AI & Agent Building
- AI-coding skill
Wooyun Legacy by the numbers
- 83 all-time installs (skills.sh)
- +1 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #5,144 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/tanweai/wooyun-legacy --skill wooyun-legacyAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 83 |
|---|---|
| repo stars | ★ 1.7k |
| Last updated | July 14, 2026 |
| Repository | tanweai/wooyun-legacy ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
WooYun 业务逻辑漏洞方法论
22,132 个真实漏洞案例 · 6 个领域 · 33 类漏洞
Extended trigger keywords (not in description due to length limits): Implicit black-box testing: "看看这个功能有没有问题"、"这个流程有漏洞吗"、"怎么绕过这个限制"、"订单/支付/退款流程测试"、"这个系统安全吗"、"接口有没有风险"、"check this API"、"is this flow secure"、"review this for issues". Tools & techniques: 抓包分析、Burp Suite、拦截请求、修改参数、重放攻击、并发测试、遍历ID、爆破、薅羊毛、刷单、套利、风控绕过、短信轰炸、接口滥用、未授权接口、任意文件、数据泄露、信息收集、子域名、目录扫描、指纹识别、intercept、replay、fuzz、enumerate、brute force、rate limiting bypass、coupon abuse.
业务逻辑漏洞无法通过扫描器发现。它们存在于开发者的本意与应用实际允许的行为之间的空隙中。本方法论教会你像编写代码的开发者一样思考,像滥用应用的用户一样发起攻击。
数据基础: WooYun(2010-2016),大型公开漏洞披露平台。
漏洞严重性优先级
测试应优先考虑高危漏洞类别。下表按 WooYun 数据集中高危发现的比例排序——百分比越高,代表关键影响的可能性越大。
| 排名 | 漏洞类别 | 案例数 | 高危占比 | 领域 |
|---|---|---|---|---|
| 1 | 密码重置 | 777 | 88.0% | 认证 |
| 2 | 任意账号 | 220 | 86.4% | 授权 |
| 3 | 提现 | 59 | 83.1% | 金融 |
| 4 | 金额篡改 | 176 | 83.0% | 金融 |
| 5 | 余额篡改 | 113 | 77.9% | 金融 |
| 6 | 任意用户注册 | 24 | 75.0% | 授权 |
| 7 | 逻辑漏洞 | 266 | 74.8% | 逻辑流 |
| 8 | 订单篡改 | 1,227 | 74.2% | 金融 |
| 9 | 价格篡改 | 70 | 74.3% | 金融 |
| 10 | 配置不当 | 1,796 | 72.6% | 配置 |
| 11 | 任意操作 | 40 | 72.5% | 授权 |
| 12 | 支付绕过 | 1,056 | 68.7% | 金融 |
| 13 | 设计缺陷 | 1,391 | 65.3% | 逻辑流 |
| 14 | 信息泄露 | 4,858 | 64.7% | 信息 |
| 15 | 越权 | 1,705 | 62.3% | 授权 |
| 16 | 弱口令 | 7,513 | 58.2% | 认证 |
四阶段方法
每个阶段都建立在前一阶段的基础上。跳过任何阶段会导致浅层测试,无法发现扫描器无法找到的逻辑漏洞。
第一阶段:业务流程映射
在测试任何端点之前,理解应用做了什么,以及资金、数据和权限如何在其中流动。
1. 理解业务
- 这个应用做什么?(电商、银行、社交、SaaS)
- 主要参与者是谁?(匿名用户、普通用户、管理员、商户、API 客户端)
- 收入模式是什么?(资金如何流动?)
- 哪些数据敏感?(个人信息、财务数据、医疗数据、凭证)
2. 映射用户旅程
- 注册 → 登录 → 核心操作 → 登出
- 购买 → 支付 → 履行 → 退款
- 密码重置 → 验证 → 新密码
- 管理员 → 用户管理 → 权限分配
3. 识别状态转移
对每个业务流程:
- 列出所有状态(待审、活跃、已支付、已发货、已退款)
- 列出所有有效转移(待审→已支付、已支付→已发货)
- 问题:能否强制执行无效转移?(待审→已发货)
- 问题:能否反向转移?(已支付→待审)4. 映射信任边界
- 客户端 vs 服务器:哪些验证仅在客户端进行?
- 用户 vs 管理员:什么分隔了权限级别?
- 租户 vs 租户:什么防止跨租户访问?
- 内部 vs 外部:哪些假设了受信任的内部来源?
第二阶段:假设形成
使用下面的参考文件形成特定领域的假设。每个领域文件包含详细的攻击模式矩阵、测试清单和防御模式,这些都源自数千个真实的 WooYun 案例。
第一层:领域参考(方法论 + 攻击模式矩阵) — 优先加载
| 领域 | 参考文件 | 案例数 |
|---|---|---|
| 认证绕过、凭证缺陷 | authentication-domain.md | 8,846 |
| 权限绕过、IDOR、权限提升、任意操作 | authorization-domain.md | 6,838 |
| 支付、订单、余额、价格篡改 | financial-domain.md | 2,919 |
| 个人信息泄露、凭证泄露、调试信息 | information-domain.md | 6,446 |
| 状态机滥用、竞态条件、流程绕过 | logic-flow-domain.md | 1,679 |
| 配置不当、默认设置、加固缺陷 | configuration-domain.md | 1,796 |
第二层:深度分析手册(技术细节 + 根因分析) — 需要深入某个技术领域时加载
| 技术领域 | 知识文件 | 内容 |
|---|---|---|
| 命令执行 | command-execution.md | 系统命令注入、代码注入、表达式注入的完整攻击链 |
| 文件遍历 | file-traversal.md | 路径穿越、任意文件读取/下载的绕过技术 |
| 文件上传 | file-upload.md | 上传绕过(类型、后缀、内容检测)的 Payload 矩阵 |
| 信息泄露 | info-disclosure.md | 敏感信息暴露路径、调试接口、配置文件泄露 |
| 逻辑缺陷 | logic-flaws.md | 密码重置、支付绕过、验证码绕过的根因矩阵 |
| SQL 注入 | sql-injection.md | 注入类型分类、WAF 绕过、盲注技巧 |
| 未授权访问 | unauthorized-access.md | 未授权接口发现、权限校验缺失模式 |
| XSS | xss.md | 存储型/反射型/DOM XSS 的输入点和绕过 |
第三层:漏洞案例库(真实案例标题 + 高频 Payload) — 需要引用具体案例或 Payload 模式时加载
| 漏洞类型 | 案例文件 | 用途 |
|---|---|---|
| SQL 注入 | sql-injection.md | 15 个典型案例 + 高频注入 Payload |
| 命令执行 | command-execution.md | 15 个典型案例 + 命令执行 Payload |
| 未授权访问 | unauthorized-access.md | 15 个典型案例 + 越权模式 |
| 弱口令 | weak-password.md | 15 个典型案例 + 高频弱口令 |
| 信息泄露 | info-disclosure.md | 15 个典型案例 + 泄露路径 |
| XSS | xss.md | 9 个典型案例 + XSS Payload |
| 配置不当 | misconfig.md | 15 个典型案例 + 错误配置模式 |
| 逻辑缺陷 | logic-flaws.md | 15 个典型案例 + 逻辑绕过 |
| 文件上传 | file-upload.md | 11 个典型案例 + 上传绕过 Payload |
| SSRF | ssrf.md | SSRF 攻击模式 |
| CSRF | csrf.md | CSRF 利用模式 |
| 文件遍历 | file-traversal.md | 5 个典型案例 + 遍历 Payload |
| RCE | rce.md | 3 个典型案例 + RCE 链 |
| XXE | xxe.md | XXE 注入模式 |
| 其他 | other.md | 13 个典型案例 |
渐进加载规则: 先读第一层(领域参考)确定测试方向,再按需读第二层(深度分析)获取技术细节,最后在需要引用具体案例或 Payload 时才读第三层(案例库)。不要一次性加载所有文件。
对每个领域,使用以下结构形成假设:
假设:[业务流程 X] 容易受到 [攻击模式 Y] 的攻击
原因:[来自侦查的证据——参数可见、缺乏服务器验证、ID 可预测]
WooYun 模式:[与领域参考中匹配的模式]
影响:[业务影响——财务损失、数据泄露、账户接管]
测试:[具体的手动测试步骤]第三阶段:针对性手动测试
业务逻辑需要手动测试,因为漏洞存在于应用如何解释业务规则的方式中,而不是扫描器可以匹配的技术特征。
1. 准备测试账号
- 至少 2 个相同权限级别的账号(用于水平测试)
- 至少每个权限级别 1 个账号(用于垂直测试)
- 记录所有会话令牌、Cookie、ID
2. 执行最小化测试
- 拦截特定请求(Burp/mitmproxy)
- 仅修改要测试的参数
- 观察:服务器是否验证?状态是否改变?
- 记录确切的请求/响应对
3. 根据业务规则分析
- 应用是否在服务器端实施业务规则?
- 状态转移是否可以被强制无序执行?
- 是否可以访问/修改另一个用户的资源?
- 财务价值是否可以被篡改?
4. 如果确认 → 第四阶段 · 如果否定 → 下一个假设 · 如果不确定 → 改变方法
第四阶段:影响评估与文档化
证明业务影响,而不仅仅是技术绕过。
## 发现:[标题]
- 严重级别:[严重/高/中/低]
- 领域:[认证/授权/金融/信息/逻辑/配置]
- WooYun 模式:[此发现匹配的历史模式]
- 业务影响:[财务损失、受影响用户数、数据范围]
- 重现步骤:
1. [确切的步骤与请求/响应]
2. [...]
- 补救:[服务器端修复,不是客户端创可贴]真实案例
这些案例说明为什么业务逻辑测试很重要——每一个都代表 WooYun 研究者发现的真实漏洞:
| 案例 | 领域 | 影响 |
|---|---|---|
| 某平台越权遍历大量身份证件/行驶证件 | 授权 | 通过顺序文件 ID 泄露大量证件 |
| M1905电影网 2588元套餐漏洞只需5毛 | 金融 | 通过后端自批准绕过实现 5000 倍价格差异 |
| TCL统一认证平台可重置所有用户密码 | 认证 | 跨 N+ 个业务系统的完整账户接管 |
| 微糖主站SQL注入影响860W+患者/46W+医生 | 信息 | 860 万患者记录、46 万医生记录 |
| 某计费系统GetShell+生成充值卡 | 金融 | 任意充值卡生成 + 客户数据泄露 |
| 百合网某APP设计缺陷影响100W+女性手机号 | 逻辑流 | 100 万+ 电话号码通过设计缺陷泄露 |
需要避免的思维陷阱
测试业务逻辑时,要警惕这些导致浅层测试的常见理性化表现:
| 陷阱 | 现实 |
|---|---|
| "扫描器可以覆盖业务逻辑" | 扫描器找到的是特征,不是逻辑漏洞。没有扫描器能发现"订单状态可以跳过支付"。 |
| "我测试了主流程,它是安全的" | 22,132 个案例证明:逻辑漏洞存在于边界情况。 |
| "只需改价格为 0.01" | 那只是一个测试。WooYun 数据显示 17+ 种支付攻击模式。 |
| "IDOR 很简单,只需改 ID" | IDOR 有编码绕过、参数污染、JSON 嵌套。简单改 ID 只占案例的 30%。 |
| "前端验证了,就没问题" | 68.7% 的支付漏洞存在是因为验证仅在客户端。 |
| "管理员面板需要不同的凭证" | 58.2% 的未授权访问 = 完全没有身份验证的管理后台。 |
快速参考
| 阶段 | 关键活动 | 门槛标准 |
|---|---|---|
| 1. 映射 | 业务流程、状态机、信任边界 | 完整流程图已记录 |
| 2. 假设 | 基于 WooYun 模式的特定领域理论 | ≥5 个按影响排序的假设 |
| 3. 测试 | 手动拦截、单参数、精确观察 | 每个假设有证据支持或反驳 |
| 4. 报告 | 业务影响、重现步骤、补救措施 | 带有 WooYun 模式分类的发现 |
<!-- 数据源:WooYun 漏洞数据库(2016年7月)· 方法论 v2.0 -->
身份认证领域
概述
身份认证漏洞是突破口。8,846 起 WooYun 案例(占所有发现的 40%)证明:大多数应用在第一道防线就已失守。
核心原则: 身份认证是一条链。每一环都必须守住——凭证、会话、重置流程、验证机制。一个薄弱环节 = 完全绕过。
按子域划分的攻击模式
弱凭证(7,513 个案例,58.2% 高危)
铁律:在任何其他身份认证测试之前,先测试默认凭证。WooYun 所有案例中 34% 属于弱密码/默认密码。
系统化测试清单:
阶段 1:默认凭证
- [ ] admin/admin, admin/123456, admin/admin123
- [ ] root/root, root/toor, root/password
- [ ] test/test, guest/guest, demo/demo
- [ ] [厂商名]/[厂商名](如 tomcat/tomcat)
- [ ] [产品名]/[产品名]
- [ ] 查阅厂商文档中的默认凭证
阶段 2:社会工程学密码
- [ ] 公司名(小写、首字母大写、加年份)
- [ ] 域名(不含顶级域名、加数字)
- [ ] 产品名 + 常见后缀(123, @123, !@#)
- [ ] 城市名 + 年份(beijing2024)
- [ ] 手机号码模式(中国系统常见)
阶段 3:凭证填充攻击
- [ ] 中国 Top 100 密码(123456, a123456, 123456789)
- [ ] 全球 Top 100 密码
- [ ] 行业特定默认密码(医疗、金融、教育)
阶段 4:绕过反暴力破解
- [ ] 验证码重用(同一会话,不刷新)
- [ ] 验证码移除(从请求中删除参数)
- [ ] IP 轮换(X-Forwarded-For 头操纵)
- [ ] 通过响应差异进行账户枚举
- [ ] 通过分布式请求绕过速率限制关键参数: username, password, account, passwd, pwd, pass
密码重置(777 个案例,88.0% 高危)
在整个 WooYun 数据集中严重性级别最高。每个密码重置流程都存在漏洞。
攻击模式矩阵:
| 模式 | 测试方法 | WooYun 普遍性 |
|---|---|---|
| 令牌在 URL/响应中 | 拦截重置响应,检查令牌 | 极高 |
| 可预测令牌 | 请求多次重置,分析令牌熵 | 高 |
| 步骤跳过 | 直接跳到"设置新密码"步骤 | 高 |
| 用户 ID 操纵 | 在重置请求中更改 user_id/email | 极高 |
| 响应操纵 | 在客户端将 {"success":false} 改为 {"success":true} | 中等 |
| 验证码重用 | 在不同用户间使用相同的短信/邮件验证码 | 中等 |
| Host 头注入 | 在 Host 头中注入攻击者域以获取重置链接 | 中等 |
| 时序攻击 | 通过响应时间差异判断有效账户 | 低 |
测试流程:
digraph password_reset_test {
"为账号A请求密码重置" [shape=box];
"拦截所有流量" [shape=box];
"令牌在响应中?" [shape=diamond];
"分析令牌熵" [shape=box];
"可预测?" [shape=diamond];
"尝试跳过步骤" [shape=box];
"用B的标识直接设置密码" [shape=box];
"将user_id改为账号B" [shape=box];
"操纵响应" [shape=box];
"为账号A请求密码重置" -> "拦截所有流量";
"拦截所有流量" -> "令牌在响应中?";
"令牌在响应中?" -> "分析令牌熵" [label="是 → 高危"];
"令牌在响应中?" -> "尝试跳过步骤" [label="否"];
"分析令牌熵" -> "可预测?";
"可预测?" -> "将user_id改为账号B" [label="是 → 严重"];
"尝试跳过步骤" -> "用B的标识直接设置密码";
"用B的标识直接设置密码" -> "操纵响应";
}登录绕过(57 个案例,57.9% 高危)
模式:
- 登录表单 SQL 注入:
' OR 1=1-- - 默认后门账户(留在生产环境的调试/测试账户)
- 身份认证逻辑反转(检查
if NOT authenticated而不是if authenticated) - Cookie/令牌伪造(签名弱,无验证)
- OAuth 错误配置(redirect_uri 操纵、state 参数缺失)
验证码/验证绕过(384 个案例,44% 高危)
系统化验证码绕过:
| 绕过技术 | 测试方法 |
|---|---|
| 无服务器端验证 | 从请求中完全移除验证码参数 |
| 可重用验证码 | 多次提交相同的验证码值 |
| 可预测验证码 | 分析验证码生成算法 |
| 可 OCR 识别的验证码 | 字体简单,无干扰,无旋转 |
| 语音验证码绕过 | 对语音选项进行语音转文本识别 |
| 短信验证码无过期 | 申请新验证码后仍可使用旧验证码 |
| 短信验证码无速率限制 | 暴力破解 4-6 位数字短信验证码 |
| 短信验证码跨用户共享 | 将发给手机 A 的验证码用于账户 B |
| 客户端验证码检查 | 仅在 JavaScript 中验证验证码 |
真实案例
| 案例 | 子域 | 影响 |
|---|---|---|
| TCL统一身份认证平台漏洞,所有用户账号密码可重置 | 密码重置 | 跨 N+ 个业务系统的完整账户接管 |
| 蜻蜓FM公众平台任意用户密码重置 | 密码重置 | 任意用户密码重置 |
| M1905电影网某重要站点任意密码重置(已入官方账号) | 密码重置 | 官方账号被攻破 |
| 嘟嘟牛旗下百乐吧密码重置漏洞涉及279个网吧上网用户数据 | 密码重置 | 279 个网吧用户账户泄露 |
| 飞特物流某系统后台登录绕过/SQL注入(千万用户/运单/银行卡/身份证照片) | 登录绕过 | 1000 万+ 用户、银行卡、身份证照片 |
| 搜狐APP某站登录绕过+SQL注入root权限 | 登录绕过 | 数据库根级访问权限 |
| 格兰仕厂商协同平台认证绕过执行/root权限/已Shell | 认证绕过 | 远程代码执行 |
| 华安保险某站认证绕过命令执行可Shell | 认证绕过 | 保险系统远程代码执行 |
| 爱卡汽车网某重要系统设计逻辑缺陷成功绕过验证码限制 | 验证码绕过 | 启用暴力破解 |
| 驴妈妈旅游网从验证码绕过再到任意酒店数据导出 | 验证码绕过 | 酒店数据渗漏 |
| 上海航空员工个人信息泄露/密码重置(绕过短信验证)/内部资料泄露 | 短信绕过 | 员工个人信息 + 内部文档 |
防御模式(来自 WooYun 修复数据)
代码层面
- 密码:bcrypt(cost≥12),绝不使用 MD5/SHA1
- 密码复杂度:最少 8 个字符 + 大小写 + 数字 + 特殊字符
- 密码历史:拒绝重用最近 3 个密码
- 首次登录强制修改密码
- 会话:密码学随机,HttpOnly,Secure,SameSite
- 重置令牌:≥32 字节随机,单次使用,时间限制(15 分钟)
- 验证码:服务器端验证,单次使用,绑定到会话
架构层面
- 集中式身份认证(SSO/OAuth2/SAML)
- 对所有特权操作启用 MFA
- 账户锁定:5 次连续失败后锁定,逐步延迟(1秒、2秒、4秒、8秒...)
- 速率限制:按账户和按 IP 分别限制
- 地理异常告警:从新位置登录时通知
监控
- 登录失败激增检测(每个账户超过 5 次/分钟)
- 凭证填充攻击检测(多个账户,每个尝试次数少)
- 密码重置异常(来自单个 IP 的批量重置)
- 地理异常(来自新国家的登录)
授权域
概述
授权漏洞允许已认证用户访问他们不应该访问的资源。6,269 个 WooYun 案例证明:开发者构建了身份认证但忽视了授权控制。
核心原则: 身份认证回答"你是谁?"授权回答"你能做什么?"大多数应用在第一个问题上表现不错,但在第二个问题上表现糟糕。
攻击模式分类
digraph authz_taxonomy {
"授权漏洞" [shape=box style=filled fillcolor=lightyellow];
"水平越权" [shape=box label="水平越权\n(同级权限)"];
"垂直越权" [shape=box label="垂直越权\n(低级→高级权限)"];
"缺失认证" [shape=box label="缺失认证\n(完全无认证检查)"];
"授权漏洞" -> "水平越权" [label="IDOR\n越权"];
"授权漏洞" -> "垂直越权" [label="权限提升"];
"授权漏洞" -> "缺失认证" [label="未授权访问"];
}水平权限绕过 / IDOR(1,705+230 个案例)
最容易被忽视的漏洞类型。扫描器无法发现。
系统化测试协议:
对于每个返回用户特定数据的 API 端点:
1. 识别资源标识符
- URL 路径:/api/users/{id}/orders
- 查询参数:/api/orders?user_id=123
- POST 请求体:{"user_id": 123, "action": "view"}
- Cookie/头:X-User-Id: 123
2. 准备两个测试账号(账号 A,账号 B)
- 以 A 身份登录,记录所有标识符
- 以 B 身份登录,记录所有标识符
3. 测试每项 CRUD 操作
- [ ] 创建:A 能否创建 B 拥有的资源?
- [ ] 读取:A 能否查看 B 的资源?(最常见)
- [ ] 更新:A 能否修改 B 的资源?
- [ ] 删除:A 能否删除 B 的资源?
4. 测试标识符操纵
- [ ] 直接 ID 替换:123 → 124
- [ ] ID 枚举:遍历 ID 范围
- [ ] 参数污染:?uid=123&uid=456(服务器取最后一个)
- [ ] 数组注入:uid[]=123(绕过类型检查)
- [ ] JSON 嵌套:{"user": {"id": 456}}
- [ ] 编码 ID:base64(456)、hex(456)
- [ ] 负数/零 ID:id=0、id=-1
- [ ] UUID 预测(如果使用了顺序 UUID)关键参数: user_id, uid, id, order_id, file_id, account_id, tenant_id, doc_id, msg_id
WooYun 案例模式: "北京现代某平台可越权遍历所有用户上传证件(几百万身份证件/行驶证件/发票/驾驶证)" — 顺序文件 ID 且无所有权检查。
垂直权限 / 权限提升(255+86 个案例)
测试协议:
1. 识别权限级别
- 匿名 → 已注册用户 → 管理员 → 超级管理员
- 用户角色:买家、卖家、代理人、经理
2. 映射仅限管理员的端点
- /admin/*, /api/admin/*, /manage/*
- 用户管理、配置、报告
- 识别来源:JavaScript 文件、API 文档、网站地图、robots.txt
3. 用低权限会话测试
- [ ] 用用户令牌访问管理员端点
- [ ] 添加管理员参数:role=admin, is_admin=true, level=9
- [ ] 在注册时修改角色:{"role": "admin"}
- [ ] 完全不带令牌访问管理员 API
- [ ] 改变 HTTP 方法:GET→POST、POST→PUT未授权访问 / 缺失身份认证(2,102+1,891 个案例)
最基本的漏洞:完全没有身份认证的端点。
系统化端点发现:
| 发现方法 | 目标 |
|---|---|
| 直接 URL 猜测 | /admin, /console, /debug, /status, /api/docs |
| robots.txt / sitemap.xml | 已披露的"禁止访问"路径 |
| JavaScript 源代码分析 | 前端中硬编码的 API 端点 |
| 错误页面信息 | 暴露内部路径的堆栈跟踪 |
| HTTP 方法探测 | OPTIONS 请求可能暴露端点 |
| 路径遍历变体 | /..;/admin, /%2e%2e/admin |
测试:
对于每个发现的端点:
1. 不带任何身份认证头/Cookie 访问
2. 如果重定向到登录 → 尝试添加 X-Forwarded-For: 127.0.0.1
3. 如果 403 → 尝试替代 HTTP 方法(GET/POST/PUT/DELETE/PATCH)
4. 如果 403 → 尝试路径规范化:/admin/ vs /admin vs /Admin
5. 如果 403 → 尝试 URL 编码:/%61dmin
6. 记录:哪些端点完全没有身份认证?WooYun 模式: 58.2% 的未授权访问发现 = 管理后台完全暴露在互联网上。
任意操作 / 任意X(529 个案例,51-86% 高危)
"权限维度"— 攻击者在任何对象上都不应该执行的操作。
此类别不同于 IDOR。IDOR 是关于访问"他人的"资源。任意操作是关于执行"你不应该有的操作"——无论资源属于谁。
| 子类别 | 案例数 | 高危占比 | 攻击模式 |
|---|---|---|---|
| 任意账号访问 | 220 | 86.4% | 不需凭证以任何用户身份登录/操作 |
| 任意修改 | 159 | 63.5% | 修改任何记录(个人资料、配置、内容) |
| 任意用户注册 | 24 | 75.0% | 绕过注册控制(仅邀请、仅管理员) |
| 任意查看 | 45 | 55.6% | 查看超出 IDOR 范围的任何记录(批量导出、管理员视图) |
| 任意删除 | 41 | 51.2% | 删除任何记录无需所有权/权限 |
| 任意操作 | 40 | 72.5% | 执行特权操作(批准、发布、执行) |
测试协议:
对于每个写入/删除/管理员操作:
1. 识别权限模型
- 谁应该被允许执行此操作?
- 检查是在用户级别、角色级别还是对象级别?
2. 测试权限绕过
- [ ] 以无特权用户身份执行操作
- [ ] 对非当前用户拥有的对象执行操作
- [ ] 执行批量操作(通过 API 枚举修改/删除全部)
- [ ] 以普通用户身份执行仅限管理员的操作(批准、发布)
- [ ] 自我批准:创建请求 + 批准自己的请求
3. 测试注册控制
- [ ] 当注册"关闭"或"仅邀请"时注册
- [ ] 以管理员/提升的角色注册
- [ ] 绕过电子邮件域名限制
- [ ] 绕过注册的电话验证真实案例
| 案例 | 子域 | 影响 |
|---|---|---|
| 北京现代某平台越权遍历几百万身份证件/行驶证件/发票/驾驶证 | IDOR | 通过顺序文件 ID 暴露数百万身份证件 |
| 花礼网某处平行权限漏洞(影响所有使用用户) | 水平越权 | 所有用户数据可访问 |
| EMS某站点平行权限漏洞涉及大量用户信息 | 水平越权 | 大量用户个人信息暴露 |
| 美国东航网站严重订单信息泄漏及权限绕过 | 垂直越权 | 订单数据 + 权限提升 |
| 挖财网权限绕过登录其他用户账号 | 垂直越权 | 账号接管 |
| 暴风墨镜某站SQL注入/59张表/权限控制数据库 | 垂直越权 | 通过注入实现完整数据库访问 |
| 新浪乐居多处zookeeper未配置权限控制涉及敏感信息 | 缺失认证 | 内部服务暴露 |
| 中国金融认证中心某系统未授权访问(涉及内网信息) | 缺失认证 | 内网访问 |
| 奥鹏教育某处未授权访问可影响大量学生信息 | 缺失认证 | 学生个人信息暴露 |
防御模式
代码层面
- 默认拒绝: 将公开端点加入白名单,其他一切都需要身份认证
- 所有权验证: 在每个查询上验证
resource.owner_id == current_user.id - ORM 级别过滤:
Model.where(user_id: current_user.id)— 永不使用原始 ID - 不可预测的 ID: UUID v4,而非顺序整数
- RBAC/ABAC: 基于角色或属性的访问控制框架
- 职能分离: 创建者不能批准自己的请求
架构层面
- API 网关: 集中式授权执行点
- 零信任: 验证每个请求,无论其网络来源
- 多租户隔离: 数据库级别的 tenant_id 过滤
- URL 模式保护: 框架级别的路由授权(Spring Security、Django 权限)
监控
- 跨用户访问模式: 用户 A 访问许多其他用户的资源
- 管理员端点访问: 非管理员 IP 访问 /admin/*
- ID 枚举检测: 来自单个会话的顺序 ID 请求
- 权限变更审计: 所有角色/权限修改已记录
- 批量操作检测: 单个用户修改/删除异常数量的记录
配置域
概述
配置不当是最容易得手的漏洞。1,796 个 WooYun 案例中 72.6% 为高危,证明:最具破坏力的入侵来自默认配置。
核心原则: 每个服务的默认配置都是为了便利而非安全设计的。如果你没有明确加固,就存在漏洞。
攻击模式矩阵
默认凭证(参考弱口令交叉引用)
服务特定的默认凭证数据库:
| 服务 | 默认凭证 | WooYun 出现频率 |
|---|---|---|
| Tomcat Manager | tomcat/tomcat, admin/admin | 极高 |
| JBoss 控制台 | admin/admin, jboss/jboss | 极高 |
| WebLogic | weblogic/weblogic1 | 高 |
| Jenkins | (默认无认证) | 极高 |
| Zabbix | Admin/zabbix | 高 |
| phpMyAdmin | root/(空) | 极高 |
| MongoDB | (默认无认证) | 高 |
| Redis | (默认无认证) | 极高 |
| Elasticsearch | (默认无认证) | 高 |
| Docker Remote API | (默认无认证) | 高 |
| Kubernetes Dashboard | (令牌绕过) | 中等 |
| Grafana | admin/admin | 高 |
| RabbitMQ | guest/guest | 高 |
| ActiveMQ | admin/admin | 高 |
| Nacos | nacos/nacos | 高 |
| Spring Boot Actuator | (默认无认证) | 极高 |
| Hadoop YARN | (默认无认证) | 高 |
暴露的管理界面
系统性发现:
1. Web 管理控制台
- [ ] /manager/html (Tomcat)
- [ ] /jmx-console (JBoss)
- [ ] /console (WebLogic, H2, Rails)
- [ ] /admin(通用)
- [ ] /jenkins
- [ ] /zabbix
- [ ] /grafana
- [ ] /solr/admin
- [ ] /nacos
- [ ] /actuator (Spring Boot)
- [ ] /druid (阿里巴巴 Druid)
2. 数据库管理
- [ ] :3306 (MySQL,无密码)
- [ ] :6379 (Redis,无认证)
- [ ] :27017 (MongoDB,无认证)
- [ ] :9200 (Elasticsearch,无认证)
- [ ] :5432 (PostgreSQL,信任认证)
- [ ] /phpmyadmin, /pma, /myadmin
3. 部署/CI 工具
- [ ] :2375 (Docker Remote API,无 TLS)
- [ ] :8080 (Jenkins,无认证)
- [ ] :8443 (Kubernetes Dashboard)
- [ ] :9000 (Portainer, SonarQube)
- [ ] :8161 (ActiveMQ)
- [ ] :15672 (RabbitMQ)
4. 监控/调试
- [ ] /server-status (Apache)
- [ ] /nginx_status (Nginx)
- [ ] /debug/pprof (Go)
- [ ] /actuator/env (Spring,泄露环境变量)
- [ ] /actuator/heapdump (Spring,泄露内存)
- [ ] /trace(暴露请求历史)配置不当的服务
高影响配置不当模式:
| 配置不当 | 影响 | 测试方法 |
|---|---|---|
| 目录列表已启用 | 源代码、配置文件泄露 | 访问无索引文件的目录 |
CORS 通配符(*) | 跨域数据盗取 | 检查 Access-Control-Allow-Origin 头 |
| 允许 PUT/DELETE 方法 | 文件上传、内容修改 | OPTIONS 请求,尝试 PUT 上传文件 |
| 生产环境开启调试模式 | 堆栈跟踪、内部路径 | 触发错误,检查响应详情 |
| 冗长的错误消息 | 数据库结构、代码路径 | 恶意输入,观察错误响应 |
| 开放式重定向 | 钓鱼、令牌盗取 | 修改 redirect_url 参数 |
| 通过 Webhook 进行 SSRF | 内网访问 | 将内网 IP 作为 Webhook URL |
| 无限制文件上传 | Web Shell、远程代码执行 | 上传 .jsp/.php/.aspx 文件 |
云配置不当(新兴模式,WooYun 时代后)
基于现代部署模式的补充:
1. 存储
- [ ] S3 存储桶公开读/写
- [ ] Azure Blob 容器匿名访问
- [ ] GCS 存储桶 allUsers 权限
- [ ] OSS(阿里云)存储桶 ACL 配置不当
2. 计算
- [ ] IMDS v1 可访问(无需令牌)
- [ ] 安全组允许 0.0.0.0/0 访问管理端口
- [ ] 禁用 SSH 密钥认证,启用密码认证
- [ ] 用户数据脚本包含凭据
3. IAM
- [ ] 通配符权限(Action: "*", Resource: "*")
- [ ] 跨账户角色信任过于宽松
- [ ] 服务账户密钥暴露在代码/配置中
- [ ] 根/管理员账户未启用 MFA测试协议
digraph config_test {
"识别所有服务" [shape=box];
"检查默认凭证" [shape=box];
"默认凭证有效?" [shape=diamond];
"检查暴露的端点" [shape=box];
"有暴露?" [shape=diamond];
"检查服务配置" [shape=box];
"发现配置不当?" [shape=diamond];
"记录发现" [shape=box];
"进入其他领域" [shape=box];
"识别所有服务" -> "检查默认凭证";
"检查默认凭证" -> "默认凭证有效?";
"默认凭证有效?" -> "记录发现" [label="是 → 严重"];
"默认凭证有效?" -> "检查暴露的端点" [label="否"];
"检查暴露的端点" -> "有暴露?";
"有暴露?" -> "记录发现" [label="是 → 高危"];
"有暴露?" -> "检查服务配置" [label="否"];
"检查服务配置" -> "发现配置不当?";
"发现配置不当?" -> "记录发现" [label="是"];
"发现配置不当?" -> "进入其他领域" [label="否"];
"记录发现" -> "进入其他领域";
}真实案例
| 案例 | 子域 | 影响 |
|---|---|---|
| 同程旅游某系统配置不当任意文件上传getshell/root权限 | 配置不当的服务 | 通过文件上传实现根级远程代码执行 |
| ChinaCache某系统JBoss配置不当导致Getshell | 默认凭证/暴露管理界面 | JBoss 管理控制台 → 远程代码执行 |
| 复星保德信某系统配置不当GetShell影响大量保单信息(姓名/身份证/地址) | 配置不当的服务 | 保险单据个人信息泄露 |
| DaoCloud弱口令+docker remote API未授权访问 | 默认凭证 | Docker API → 容器逃逸 |
| 云南农村信用社智慧农信微信管理平台 | 默认凭证 | 银行平台默认凭证 |
| 华夏航空准备网 | 默认凭证 | 航空系统默认凭证 |
防御模式
代码层面
- 部署前更改所有默认凭证
- 禁用不必要的功能: 调试模式、目录列表、TRACE 方法
- 最小权限原则: 服务账户仅具有最低必需权限
- 配置即代码: 版本控制、审查配置更改
架构层面
- 网络隔离: 管理界面仅在内网
- 防火墙规则: 对管理端口仅允许白名单访问
- 反向代理: 永远不要直接暴露后端服务
- 密钥管理: 使用 Vault/KMS 存储凭证,而非配置文件
监控
- 默认凭证扫描: 自动检查已知默认凭证
- 暴露服务检测: 定期外部扫描开放的管理端口
- 配置漂移: 对未授权的配置更改发出警报
- 新服务检测: 对新增监听端口/服务发出警报
金融领域
概述
金融逻辑漏洞导致直接经济损失。2,919 个 WooYun 案例中 68-83% 为高危,证明:与金钱相关的逻辑始终是最容易被利用的。
核心原则: 客户端请求中出现的任何财务数值都是一个待验证的假设。价格、数量、折扣、余额、手续费——如果客户端发送了它,客户端就可以修改它。
金融测试铁律
绝不信任客户端财务计算。
如果服务器接受来自客户端的价格/金额/数量 → 就认为它易受攻击,除非经过验证。攻击模式矩阵
支付篡改(1,056 个案例,68.7% 高危)
系统性支付测试检查清单:
1. 价格篡改
- [ ] 修改金额为 0.01(最小被接受金额)
- [ ] 修改金额为 0(零成本购买)
- [ ] 修改金额为负数(退款给攻击者)
- [ ] 修改金额为非常大的负数(溢出)
- [ ] 如果支持多币种则修改货币代码
- [ ] 分别修改单价与总价
2. 数量篡改
- [ ] 数量设为 0(免费商品)
- [ ] 数量设为 -1(负数购买 = 退款)
- [ ] 数量设为非常大的数字(整数溢出)
- [ ] 数量设为小数(0.001 件)
- [ ] 设置数量与价格所暗示的不同
3. 折扣/优惠券滥用
- [ ] 重复应用同一优惠券
- [ ] 对已打折商品应用优惠券
- [ ] 在请求中修改折扣百分比(discount=100)
- [ ] 使用过期优惠券(重放有效请求)
- [ ] 使用针对不同产品类别的优惠券
- [ ] 堆叠多个促销类型
4. 竞态条件(Turbo Intruder / 并发请求)
- [ ] 双花:同时提交两次支付
- [ ] 优惠券竞速:并行应用同一单次使用优惠券
- [ ] 余额竞速:并发提取相同余额
- [ ] 库存竞速:并行购买最后一件商品
5. 状态机绕过
- [ ] 跳过支付步骤:从购物车直接跳到订单确认
- [ ] 修改订单状态:将 status=pending 改为 status=paid
- [ ] 对不同订单重放成功的支付回调
- [ ] 在支付后但履行前修改订单关键参数: amount, price, total, quantity, discount, coupon_code, currency, fee, status, order_id, payment_id
订单篡改(1,227 个案例,74.2% 高危)
订单状态机攻击:
预期流程:
购物车 → 待支付 → 已支付 → 处理中 → 已发货 → 已送达 → 已完成
攻击向量:
购物车 → 已完成(完全跳过支付)
已支付 → 购物车(恢复以在支付后修改项目)
已发货 → 已支付(恢复以获得退款且保留商品)
任意 → 已取消 + 退款(收到商品后取消)测试协议:
对每个状态转换:
1. 捕获触发转换的请求
2. 能否按错误的顺序触发?
3. 能否对不同用户的订单触发?
4. 能否多次触发?
5. 能否在状态之间修改订单内容?余额/提现(113+59 个案例,77-83% 高危)
关键模式:
| 攻击 | 方法 | 影响 |
|---|---|---|
| 负向转账 | 转账金额=-100(收款人扣款、发款人增款) | 直接盗窃 |
| 竞态条件提现 | 超过余额的并发提现请求 | 双花 |
| 余额计算绕过 | 在客户端请求中修改余额参数 | 无限资金 |
| 向任意账户提现 | 在提现请求中改变目标账户 | 资金挪用 |
| 小数精度 | 提现 0.001 × 10000 次(舍入漏洞利用) | 累积盗窃 |
定价/充值(218+176+70 个案例)
价格篡改模式:
1. 充值漏洞利用
- [ ] 在请求中修改充值金额
- [ ] 重放成功的充值回调
- [ ] 使用测试支付网关凭证
- [ ] 在服务器接收前修改支付网关响应
2. 价格不一致
- [ ] 购物车、结账、支付中的不同价格
- [ ] 将 item_id 修改为相同数量的更便宜产品
- [ ] 在价格计算后向购物车添加商品
- [ ] 币种混淆(¥1 vs $1 vs 1 积分)竞态条件测试指南
金融竞态条件需要特殊技术:
# 并发支付测试的概念性方法
# 使用 Burp Turbo Intruder 或自定义脚本
# 第1步:准备请求(如提现)
# 第2步:同时发送 N 个相同请求
# 第3步:检查:服务器是否处理了多个?
# 漏洞指标:
# - 余额减少了 N × 金额(应该是 1 × 金额)
# - 单次使用操作的多个成功响应
# - 创建了多个交易记录工具: Burp Turbo Intruder、自定义 Python 线程脚本、使用 & 后台运行的 curl
真实案例
| 案例 | 子域 | 影响 |
|---|---|---|
| M1905电影网价值2588套餐只要5毛钱(拥有后台权限可自己审核订单) | 订单 | 通过自批准实现 5000 倍价格差异 |
| 微糖主站SQL注入涉及860W+患者/46W+医生/12W+订单数据 | 订单 | 860 万患者 + 46 万医生记录 |
| 某大型第三方支付机构考试系统SOAP注入(DBA权限+9库) | 支付 | 完整 DBA 权限访问 9 个数据库 |
| 通联支付文件遍历读取漏洞(Oracle EBS系统) | 支付 | Oracle EBS 文件读取 |
| 中原银行2处漏洞可getshell影响财付通/支付宝支付 | 支付 | 银行系统远程代码执行 |
| 中国铁通计费系统GetShell+可生成充值卡 | 充值 | 任意充值卡生成 |
| e信wifi多系统漏洞涉及上百万用户数据/上百万充值卡密 | 充值 | 100 万+ 用户 + 100 万+ 充值卡 |
| 神舟专车充值流程免输信用卡交易密码(可恶意套现) | 充值 | 信用卡套现绕过 |
| 百度智能微校+中国青少年基金系统可篡改捐款金额 | 金额 | 捐款金额篡改 |
| 鱼泡泡APP任意用户登录可影响用户账户余额(sign绕过) | 余额 | 账户余额篡改 |
| 宁波银行直销银行看任意卡余额 | 余额 | 任意银行卡余额查看 |
| 百姓大药房漏洞危及2000W个人详细信息+会员卡余额 | 余额 | 2000 万个人信息 + 余额数据 |
| 微小宝APP一处XSS可操控19万微信号(可提现/扣款) | 提现 | 19 万微信账号提现操控 |
| ETCP停车某处未授权访问(停车用户数据/可提现用户收入) | 提现 | 用户收入提现 |
| 中国平安某处验证逻辑问题导致百万敏感信息泄漏+管理商品价格 | 价格 | 100 万+ 个人信息 + 价格篡改 |
防御模式
代码层面
- 仅服务器端计算: 价格 = 数据库价格 × 数量,绝不来自客户端
- 幂等键: 唯一交易 ID,拒绝重复
- 乐观锁:
UPDATE balance SET amount=amount-X WHERE amount >= X(原子操作) - 状态机执行: 严格的有限状态机及有效转换白名单
- 签名验证: 支付回调必须验证密码签名
架构层面
- 分布式锁: 用于金融操作的 Redis SETNX / Zookeeper
- 消息队列: 具有恰好一次语义的异步支付处理
- 两阶段提交: 扣款 → 验证 → 履行,任何失败时回滚
- 对账: 与支付网关的自动日对账
监控
- 异常金额: 金额 ≤ 0.01 的订单
- 高频率: 每个用户每分钟多个订单/提现
- 状态异常: 未经"已支付"状态直接达到"已完成"的订单
- 余额不一致: 实时余额与交易总和不匹配
信息泄露领域
概述
信息泄露是催化剂。6,446 个 WooYun 案例证明:暴露的信息能够启动所有其他攻击类型——泄露的凭据导致账户接管,泄露的架构导致精准利用。
核心原则: 应用程序暴露的任何超出用户需求的信息都是漏洞。调试信息、堆栈跟踪、内部 IP、API 密钥、源代码——每一项都是攻击面倍增器。
攻击模式矩阵
源代码/配置泄露(4,858 个案例,64.7% 高危)
系统性发现检查清单:
1. 版本控制泄露
- [ ] /.git/config → 通过 GitHack/git-dumper 克隆
- [ ] /.svn/entries → SVN 仓库暴露
- [ ] /.hg/ → Mercurial 仓库
- [ ] /.bzr/ → Bazaar 仓库
- [ ] /CVS/Root → CVS 仓库
2. 备份文件
- [ ] /backup.zip, /backup.tar.gz, /backup.sql
- [ ] /db.sql, /database.sql, /dump.sql
- [ ] /web.rar, /www.zip, /site.tar.gz
- [ ] /[域名].zip, /[域名].sql
- [ ] /*.bak, /*.old, /*.orig, /*.swp
- [ ] /WEB-INF/web.xml (Java)
- [ ] /config.php.bak, /settings.py.bak
3. 调试/测试端点
- [ ] ?debug=true, ?debug=1, ?test=1
- [ ] /debug, /test, /phpinfo.php
- [ ] /actuator (Spring Boot), /metrics, /health, /env
- [ ] /trace, /dump, /heapdump
- [ ] /__debug__/ (Django 调试工具栏)
- [ ] /console (Rails 控制台, H2 控制台)
- [ ] /swagger-ui.html, /api-docs, /openapi.json
4. 错误信息
- [ ] 触发 500 错误 → 包含文件路径的堆栈跟踪
- [ ] 无效输入 → 包含查询结构的数据库错误
- [ ] 缺少参数 → 包含类名的框架错误
- [ ] 404 响应头中暴露服务器版本敏感数据泄露(1,588 个案例,62.8% 高危)
个人信息泄露模式:
| 泄露向量 | 泄露内容 | 测试方法 |
|---|---|---|
| API 过度获取 | 完整用户对象(密码哈希、邮箱、电话、ID) | 对比 API 响应与 UI 显示 |
| 日志文件可访问 | 用户活动、查询、凭据 | /logs/, /log/, /access.log |
| 错误信息 | 数据库结构、文件路径、内部 IP | 通过畸形输入触发错误 |
| 客户端存储 | localStorage/sessionStorage 中的令牌、个人信息 | 浏览器开发者工具检查 |
| URL 参数 | Referer 头中的会话令牌、用户 ID | 检查 GET 参数中是否有敏感数据 |
| 缓存响应 | CDN/代理缓存中的其他用户数据 | Cache-Control 头测试 |
| 导出功能 | 未授权的批量数据导出 | 测试 /export、/download、/report 端点 |
关键发现指标:
- API 响应字段数 > UI 可见字段数
- 生产环境中的详细错误消息
- 暴露版本的服务器头(X-Powered-By、Server)
- HTML/JS 中暴露内部信息的注释
- 客户端 JavaScript 中的凭据
目录/文件枚举
高收益路径(来自 WooYun 统计):
# 管理
/admin/ /manage/ /backend/
/administrator/ /system/ /console/
# 配置
/config/ /conf/ /settings/
/.env /wp-config.php /application.yml
# 数据
/upload/ /uploads/ /files/
/data/ /export/ /tmp/
# 监控
/status/ /server-status /server-info
/monitoring/ /metrics/ /grafana/
# 文档
/api/docs /swagger/ /redoc/
/readme.md /README.txt /CHANGELOG真实案例
| 案例 | 子域 | 影响 |
|---|---|---|
| 丁丁租房邮箱泄露导致600+人信息泄露 | 个人信息泄露 | 通过邮箱暴露 600+ 用户记录 |
| 映客多个数据库服务器沦陷 | 源代码/配置 | 多个数据库服务器被攻破 |
| 新网命令执行导致45万用户信息泄露 | 源代码/配置 | 通过远程代码执行泄露 45 万用户记录 |
| 阳光保险敏感信息泄露导致成功进入内网系统(直登多台运维主机) | 个人信息泄露 | 通过泄露的凭据进行内网枢纽 |
| 传化集团邮件系统内部敏感信息泄露 | 个人信息泄露 | 内部邮件系统暴露 |
| TCL某系统配置不当导致600万顾客姓名/手机/家庭住址泄露 | 个人信息泄露 | 600 万客户个人信息 |
| 百姓大药房漏洞危及2000W个人详细信息(姓名/身份证/手机号/住址) | 个人信息泄露 | 2000 万个人信息记录 |
防御模式
代码层面
- 最小化响应: 仅返回客户端需要的字段,不返回完整数据库对象
- 错误处理: 生产环境仅显示通用错误消息,详细信息仅在开发环境
- 凭据管理: 使用环境变量或密钥库,绝不在代码/配置文件中
- 日志脱敏: 在日志中掩盖个人信息(邮箱示例:
a***@example.com)
架构层面
- 强制执行 .gitignore: 配置文件、.env、凭据绝不在仓库中
- WAF 规则: 阻止访问 /.git、/.svn、/.env、/backup*
- 响应头加固: 删除 Server、X-Powered-By、X-AspNet-Version
- CDN 配置: 不缓存已认证的响应
监控
- 敏感路径访问: 外部 IP 访问 /.git、/.env、/admin 时告警
- 批量数据访问: 大型 API 响应或高频数据请求时告警
- 错误率监控: 500 错误激增 = 可能的侦察
- 凭据泄露扫描: 监控 GitHub/GitLab/Pastebin 上泄露的凭据
业务逻辑领域
概述
业务逻辑缺陷最难发现也最难修复。1,679 个 WooYun 案例证明:当状态机错误时,建立在它之上的每个功能都继承这个缺陷。
核心原则: 每个多步骤业务流程都是一个状态机。如果能在不满足前置条件的情况下到达某个状态,则状态机被破坏。
攻击模式矩阵
状态机绕过(1,391 个案例,65.3% 高危)
基础测试:
对于每个多步骤流程:
1. 映射预期状态序列
第1步(前置条件:无)→ 第2步(前置条件:第1步完成)→ 第3步 ...
2. 独立测试每个步骤
- 能否在不完成第2步的情况下到达第3步?
- 能否在完成第3步后返回第1步?
- 能否多次重复第2步?
- 能否在第3步时修改第1步提交的数据?
3. 识别执行机制
- 客户端 JavaScript 流程?(绕过:直接请求第 N 步端点)
- 基于会话的状态?(绕过:操纵会话、使用不同会话)
- 基于令牌的状态?(绕过:预测/重用令牌)
- 服务器端状态机?(测试:转换逻辑中的边界情况)常见易受攻击的流程:
| 业务流程 | 预期步骤 | 绕过攻击 |
|---|---|---|
| 注册 | 邮箱 → 验证 → 个人资料 → 激活 | 跳过验证,直接访问个人资料 |
| 购买 | 购物车 → 地址 → 支付 → 确认 | 跳过支付,直接确认 |
| 密码重置 | 请求 → 验证码 → 新密码 | 跳过码验证,直接设置密码 |
| KYC 验证 | 提交文件 → 审核 → 批准 | 将状态从"已提交"改为"已批准" |
| 退款 | 请求 → 审核 → 批准 → 支付 | 跳过审核,直接触发支付 |
竞态条件 / TOCTOU(266 个案例,74.8% 高危)
业务逻辑中的检查时间到使用时间缺陷:
模式:
线程A:检查余额(100) → 足够 → 扣款(100) → 余额 = 0
线程B:检查余额(100) → 足够 → 扣款(100) → 余额 = -100
结果:从 100 的余额中提取了 200测试方法:
1. 识别具有检查-行动模式的操作
- 余额检查 → 提现
- 库存检查 → 购买
- 优惠券有效性检查 → 应用优惠券
- 推荐检查 → 奖励积分
2. 准备竞态条件测试
- 捕获完整请求
- 设置 N 个并发相同请求(N = 5-20)
- 工具:Burp Turbo Intruder、Python 线程、使用 & 后台运行的 curl
3. 执行
- 同时发送所有 N 个请求
- 观察:有多少个成功?
- 预期:仅 1 个应该成功
- 存在漏洞:多个成功
4. 验证
- 检查最终状态(余额、库存、优惠券使用次数)
- 计算:检查-行动是否是原子的?业务规则绕过(266+22 个案例)
利用业务规则中假设的模式:
| 模式 | 示例 | 测试 |
|---|---|---|
| 负值注入 | 从 A 转账 -100 给 B = 从 B 偷取 | 在所有财务字段中提交负值 |
| 边界条件 | 0.001 × 10000 = 舍入漏洞利用 | 极端小/大值 |
| 类型混淆 | 字符串 "0" vs 整数 0 vs 布尔值 false | 为金额字段提交不同类型 |
| 推荐滥用 | 自推荐:创建账户,推荐自己 | 用自己账户的推荐码注册 |
| 基于时间的绕过 | 在续期和过期检查之间使用服务 | 在支付宽限期内访问功能 |
| 多渠道不一致 | Web 验证,移动 API 不验证 | 通过不同客户端执行相同操作 |
| 部分操作 | 完成原子操作的一半 | 取消转账中途,检查源是否扣款而目标未入账 |
设计缺陷作为攻击面(1,391 个案例)
WooYun "设计缺陷" 类别中的结构模式:
1. 客户端信任
- 服务器信任客户端提供的:价格、角色、user_id、权限级别
- 测试:修改影响业务逻辑的每个参数
2. 隐式授权
- "如果用户到达此页面,他们必定被授权"
- 测试:直接 URL 访问、不通过 UI 工作流的 API 调用
3. 验证不一致
- 前端验证,后端不验证
- 测试:绕过前端(curl、Burp),直接提交到 API
4. 可预测的令牌/ID
- 顺序订单 ID、基于时间戳的令牌
- 测试:分析模式,预测下一个值
5. 缺少原子性
- 多步骤操作未包装在事务中
- 测试:中断操作,检查部分状态决策流程图:哪种逻辑缺陷?
digraph logic_decision {
"多步骤流程?" [shape=diamond];
"金融操作?" [shape=diamond];
"共享资源?" [shape=diamond];
"客户端逻辑?" [shape=diamond];
"状态机绕过" [shape=box style=filled fillcolor="#ffcccc"];
"竞态条件" [shape=box style=filled fillcolor="#ffcccc"];
"业务规则绕过" [shape=box style=filled fillcolor="#ffffcc"];
"设计缺陷" [shape=box style=filled fillcolor="#ffffcc"];
"多步骤流程?" -> "状态机绕过" [label="是,测试步骤跳过"];
"多步骤流程?" -> "金融操作?" [label="同时检查"];
"金融操作?" -> "竞态条件" [label="是,测试并发"];
"金融操作?" -> "共享资源?" [label="同时检查"];
"共享资源?" -> "竞态条件" [label="是,TOCTOU"];
"共享资源?" -> "客户端逻辑?" [label="同时检查"];
"客户端逻辑?" -> "设计缺陷" [label="是,绕过客户端"];
"客户端逻辑?" -> "业务规则绕过" [label="测试边界情况"];
}真实案例
| 案例 | 子域 | 影响 |
|---|---|---|
| 百合网某APP设计缺陷影响100W+妹子手机号 | 设计缺陷 | 泄露 100 万+ 电话号码 |
| 114票务网某站逻辑漏洞利用支付超时导致上万用户敏感信息泄漏 | 状态机 | 1 万+ 用户(订单/姓名/身份证/列车路线) |
| Zealer Android客户端从脱壳到burp自动加解密插件/SQL注入/逻辑漏洞 | 设计缺陷 | 移动应用完整攻击链 |
| 超级课程表某主营业务逻辑缺陷导致全体用户真实姓名手机和QQ泄露 | 业务规则 | 所有用户的真实姓名 + 电话 + QQ |
| 大特宝官网业务逻辑漏洞可免费甚至低款买保险 | 业务规则 | 免费/打折保险购买 |
| 宏信证券某处设计缺陷 | 设计缺陷 | 证券系统缺陷 |
| 丽子美妆某处严重逻辑漏洞 | 业务规则 | 电商逻辑绕过 |
防御模式
代码层面
- 服务器端状态机: 用显式有限状态机强制执行有效转换
- 原子操作: 具有适当隔离级别的数据库事务
- 乐观锁: 记录上的版本字段,拒绝过时更新
- 幂等性: 唯一请求 ID,拒绝重复操作
- 输入验证: 服务器端、类型安全、范围检查
架构层面
- 分布式锁: Redis/Zookeeper 用于并发访问控制
- 事件溯源: 所有状态转换的不可变审计跟踪
- Saga 模式: 分布式操作的补偿事务
- 断路器: 防止多服务流中的级联故障
监控
- 状态转换异常: 订单到达无效状态
- 并发操作激增: 毫秒内的多个相同请求
- 值异常: 负数、零价格、极端数量
- 跨渠道不一致: 不同客户端执行相同操作的结果不同