一句话:挖到漏洞只完成了一半,写出能让开发看懂、愿意改、改得动的报告,才是交付。
一、为什么报告环节最值得用 AI
渗透测试工程师最耗时的工作不是挖洞,是:
- 整理几十个漏洞的复现步骤
- 写修复建议
- 做风险评级
- 翻译成甲方能看懂的语言
- 反复修改格式
这些都是语言密集型工作,正好是 LLM 的主场。 报告环节的效率提升普遍能做到 5 倍以上。
二、标准漏洞报告的结构
一份合格的漏洞报告条目应包含:
### 漏洞名称
- **危害等级**:高危 / 中危 / 低危
- **CVSS 评分**:x.x
- **漏洞类型**:OWASP 分类
- **影响范围**:URL / 接口 / 参数
- **漏洞描述**:一段话讲清是什么
- **复现步骤**:可被他人独立复现
- **请求/响应证据**:原始报文
- **危害证明**:实际能读到什么数据
- **修复建议**:具体到代码层
- **参考链接**:CWE / CVE / 官方文档
AI 可以把你潦草的笔记一键补全成这个结构。
三、从笔记到报告的 Prompt
# 任务
把以下测试笔记整理成标准漏洞报告条目。
# 已有信息
- 目标:https://target.example.com/api/user/profile
- 发现:用 A 账号 token 请求 B 账号 id,返回了 B 的完整信息
- 请求:
GET /api/user/1002/profile HTTP/1.1
Authorization: Bearer <A的token>
- 响应:200,返回 {"id":1002,"name":"张三","phone":"138****","idcard":"..."}
# 要求
1. 按标准结构输出(见模板)
2. 危害等级要给出理由
3. 修复建议要具体到伪代码层面
4. 描述用简洁专业的中文,避免夸张
# 注意
不要编造我没提供的信息(如 CVE 编号、影响用户数)
AI 会输出完整的报告条目,包括:
- 判定为高危(水平越权,泄露 PII)
- CVSS:
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N= 6.5 - 修复建议:
在查询前校验 order.userId == currentUser.id
四、让 AI 做风险评级
# 任务
对以下漏洞进行定级,给出 CVSS 3.1 向量和分数,并说明理由。
# 漏洞清单
1. 未授权访问 /api/admin/export,可导出全部用户手机号
2. 存储型 XSS 在客服后台工单列表
3. 接口返回详细错误堆栈
4. 登录无验证码,可爆破
# 输出
| 漏洞 | CVSS 向量 | 分数 | 等级 | 理由 |
关键:让 AI 明确列出 CVSS 向量(AV/AC/PR/UI/S/C/I/A),这样评级可复核,而不是拍脑袋。
五、修复建议的质量
新手写的修复建议:"请加强输入校验" —— 这种建议开发看了想打人。
让 AI 写具体建议:
# 任务
针对"水平越权读取用户信息",给出:
1. 根因说明(为什么会越权)
2. 代码层修复方案(给 Java / Node / Python 三种伪代码)
3. 框架层方案(如 Spring Security 注解)
4. 长期治理建议(统一鉴权中间件)
# 要求
不要写"加强校验"这种空话,要给出可落地的代码。
AI 输出示例:
// 错误示范(现状)
User u = userMapper.selectById(id);
// 正确做法
User u = userMapper.selectById(id);
if (u == null || !u.getId().equals(currentUser.getId())) {
throw new ForbiddenException("无权访问");
}
// 框架层:用 @PreAuthorize 统一管控
@PreAuthorize("#id == authentication.principal.id")
public User getProfile(Long id) { ... }
具体到代码的修复建议,是报告质量的直接体现。
六、批量生成:报告流水线
def generate_report(findings: list[dict]) -> str:
"""把结构化 findings 批量转成 Markdown 报告"""
# 1. 先让 AI 做整体风险概览
overview = llm.chat(f"""
以下是本次测试发现的漏洞摘要:
{json.dumps(findings, ensure_ascii=False)}
请生成"执行摘要":
1. 整体安全状况评价(2-3句)
2. 高危漏洞概述
3. 按风险排序的修复优先级
保持客观,不夸大不缩小。
""")
# 2. 逐条生成详情(可并行)
details = []
for f in findings:
detail = llm.chat(f"""
把这条发现整理成标准漏洞报告条目:
{json.dumps(f, ensure_ascii=False)}
要求:结构完整、证据充分、修复建议具体。
缺失信息标注"待补充",不要编造。
""")
details.append(detail)
# 3. 汇总
return f"# 渗透测试报告\n\n## 一、执行摘要\n{overview}\n\n## 二、漏洞详情\n" + "\n\n".join(details)
七、AI 做质量审核(重要)
写完后让 AI 当审查员:
# 任务
你是报告质量审查员。审查以下漏洞报告,找出问题。
# 检查清单
1. 复现步骤是否足够完整(换个人能否复现)?
2. 证据是否充分(有没有请求响应)?
3. 危害描述是否有夸大("可导致整个系统被控制"这类没有证据支撑的)?
4. 修复建议是否具体可执行?
5. 是否存在自相矛盾的评级?
6. 有没有可能被质疑为误报的地方?
# 输出
逐条列出问题 + 修改建议。
这一步能发现大量低级错误:漏了响应包、评级和描述不匹配、复现步骤缺前置条件等。
八、报告里的常见坑(AI 能帮你避)
| 坑 | 后果 | AI 如何帮 |
|---|---|---|
| 危害夸大 | 失去信任 | 审核环节强制标注"证据不足" |
| 复现步骤不全 | 开发无法验证 | 让 AI 模拟"照做一遍"找缺失 |
| 修复建议空泛 | 无法落地 | 强制产出代码 |
| 评级不一致 | 显得不专业 | AI 复核 CVSS 向量 |
| 残留测试数据 | 法律风险 | 提醒清理 |
| 敏感信息泄露 | 报告本身成风险 | AI 扫描报告里的真实凭据 |
九、让 AI 写"给不同读者看"的版本
同一个漏洞,要写给三类人:
# 任务
把以下漏洞改写成三个版本:
1. 给管理层的:一页纸,讲风险和对业务的影响,不出现技术细节
2. 给开发的:完整技术细节和修复代码
3. 给运维的:临时缓解措施(WAF 规则、访问控制)
这个能力人工做要花很多时间,AI 几秒完成。
十、注意事项
- AI 不能替你担责:报告结论由签字人负责,AI 只是辅助
- 必须人工复核:AI 会编造 CVE 编号、编造影响数据
- 敏感信息处理:报告中涉及的真实数据要脱敏
- 保持你的风格:训练 AI 用你的模板和话术,而不是通用模板
十一、小结
报告环节是 AI 落地渗透测试收益最直接、风险最低的场景:
| 环节 | 效率提升 |
|---|---|
| 笔记 → 结构化条目 | 10x |
| CVSS 评级 | 3x |
| 修复建议撰写 | 5x |
| 多版本改写 | 10x |
| 质量审核 | 2x(但能避坑) |
把 AI 用在这里,几乎零风险,收益立竿见影。如果你今天只想尝试一件事,就从这里开始。
下一篇:AI 辅助 CVE 分析与漏洞复现。
系列文章:AI 渗透测试与漏洞挖掘实战