渗透测试报告编写方法论:结构模板 + CVSS v3.1 + 证据收集
前言
好的报告让客户清楚知道 哪里有问题、多严重、怎么修。差的报告让客户一头雾水,白花钱。
一、报告核心原则
1. 给谁看?
- Executive Summary -> CEO / CIO(结论先行)
- Technical Details -> 开发 / DBA(具体、可复现)
- 附录 -> 审计 / 合规(完整证据)
2. 客户要什么?
- 风险全景图
- 优先级排序
- 复现步骤
- 具体修复建议(不是"加强安全")
3. 避免什么?
❌ 全是截图没文字
❌ 风险等级凭感觉
❌ 没有复现步骤
❌ 修复建议空泛
二、报告标准结构
完整渗透测试报告结构:
1. 封面
项目名称、报告编号、保密级别、测试方、测试时间、报告日期
2. 修订记录
版本号、日期、修改人、修改内容
3. 目录(自动生成)
4. 执行摘要(Executive Summary)⭐ 最重要
一页纸:总共测了多少资产、发现多少漏洞(按级别分)、
最严重的 3 个问题、总体安全评分、优先修复 Top 5
5. Scope(测试范围)
授权范围、测试类型(黑/灰/白盒)、限制条件
6. 漏洞详情(Technical Details)
每个漏洞一个小节(见下文模板)
7. 风险全景图
漏洞分布图(Critical/High/Medium/Low 饼图)
按资产分布、按类型分布、按 CVSS 评分排序
8. 附录
完整技术证据、工具清单、方法论、参考 CVE、术语表
9. 保密声明
三、单个漏洞详情模板
## 漏洞 #N:[漏洞标题]
| 字段 | 内容 |
|------|------|
| 漏洞编号 | PT-YYYY-00N |
| 风险等级 | High |
| CVSS v3.1 | 8.1 (High) |
| CWE 分类 | CWE-639 |
| 影响目标 | https://admin.example.com/api/v1/user |
| 发现时间 | 2024-01-15 |
### 漏洞描述
[原理描述,简明扼要]
### 复现步骤
前提条件:拥有任意普通用户账号
步骤:
1. 登录后台获取 Cookie
2. 发送请求:
GET /api/v1/user/profile?user_id=1002 HTTP/1.1
Cookie: session=xxx
3. 预期:只返回自己的信息
实际:返回 user_id=1002 的完整敏感信息
### 实际影响
- 泄露全部 50000+ 用户数据
- 触碰《个人信息保护法》第 24 条
### 修复建议
立即修复:
1. 后端增加权限校验
2. user_id 从 session/JWT 取,不信任前端
3. 排查其他类似接口
长期加固:
- RBAC 访问控制
- SonarQube/Semgrep 越权检测
### 修复验证
[复测结果 + 时间戳]
四、CVSS v3.1 评分详解
CVSS v3.1 六个度量组:
1. Attack Vector (AV) 攻击途径
Network (N) +3.9 远程可利用
Adjacent (A) +3.3 同一局域网
Local (L) +2.5 本地访问
Physical (P) +2.1 物理接触
2. Attack Complexity (AC) 复杂度
Low (L) +0.77 不复杂
High (H) +0.44 需绕过防护
3. Privileges Required (PR) 权限
None (N) +3.9
Low (L) +2.62
High (H) +1.84
4. User Interaction (UI) 用户交互
None (N) +0.85 无需用户操作
Required (R) +0.62 需用户点击
5. Scope (S) 影响范围
Unchanged (U) 只影响自身
Changed (C) 影响其他系统(CVSS +3.1)
6. Impact 影响
Confidentiality (C) None/Low/High
Integrity (I) None/Low/High
Availability (A) None/Low/High
分数 -> 风险等级:
0.0 None
0.1 - 3.9 Low
4.0 - 6.9 Medium
7.0 - 8.9 High
9.0 - 10.0 Critical
评分示例:
水平越权 IDOR
AV:N + AC:L + PR:L + UI:N + S:U + C:H + I:N + A:N = 8.1 (High)
未授权 SQL 注入
AV:N + AC:L + PR:N + UI:N + S:U + C:H + I:H + A:N = 9.1 (Critical)
五、证据收集清单
每发现一个漏洞立即收集:
1. 请求/响应(原始 HTTP 头 + Body)
- Burp 右键 -> Copy as cURL
- 复制原始请求到 evidence/requests/PT-xxx.req
2. 截图(带时间戳)
- 地址栏 + 请求参数 + 响应(同屏)
- 敏感数据打码
- 完整保存到 evidence/screenshots/
3. PoC 脚本(独立可运行)
- Python / curl 命令
- 清晰输出:成功/失败、泄露了什么数据
- 保存到 evidence/pocs/
4. 影响量化
- 泄露了多少条数据?
- 能访问哪些用户?
- 能执行什么操作?(增删改查)
5. 时间戳(关键)
- 渗透时间 + 发现时间
- 证明漏洞测试期间确实存在
证据包目录结构:
evidence/
├── screenshots/
├── requests/
├── pocs/
├── tool_outputs/
└── timeline/
└── attack_timeline.csv
六、报告自动化工具
1. Serpico(开源)
- Ruby Web 应用
- 模板化 + 时间线 + 证据管理
- https://github.com/SerpicoProject/Serpico
2. Dradis(商业)
- 团队协作
- Nmap/Nessus/Burp 直接导入
- https://dradis.com/
3. Covenant(红队框架)
- C2 + 自动记录攻击过程
- 导出完整取证包
4. Pandoc(Markdown -> PDF)
pandoc report.md -o report.pdf --template eisvogel
5. Jupyter Notebook(数据型报告)
- Nmap/Nuclei 结果解析成表格
- 画图展示漏洞分布
- 生成 HTML 报告
七、常见坑
❌ 截图太多没文字
✅ 每张截图配文字:请求是什么、为什么有漏洞、怎么复现
❌ 风险等级拍脑袋
✅ 用 CVSS v3.1 评分,说明六个度量值
❌ 复现步骤跳步
✅ 从"全新电脑"开始写,每一步都有
❌ 修复建议空泛
✅ "请修复越权" ❌
✅ "在 /api/user 第 123 行 auth_check() 函数
增加 user_id = current_user 校验" ✅
❌ 没有影响量化
✅ "泄露了一些用户信息" ❌
✅ "通过修改 user_id,枚举了 52,341 名用户的
姓名、手机号、身份证前 6 后 4 位、银行账户" ✅
八、推荐资源
- CVSS v3.1: https://www.first.org/cvss/
- OWASP 报告模板: https://owasp.org/www-project-tight-vulnerability-reporting/
- Serpico: https://github.com/SerpicoProject/Serpico
- 《The Hacker Playbook 2》(报告章节)