做渗透测试,很多人觉得最难的是技术环节,其实不然。真正让人头疼的,往往是最后一步——出具渗透测试报告。你可能花了好几天时间挖漏洞、跑工具,结果老板或客户问你要报告时,却不知道从哪下手。
报告不是技术笔记
不少人把渗透测试报告写成自己的操作日志:用了什么工具、跑了哪些命令、IP怎么扫的。这更像是给自己看的技术备忘录,而不是一份能让别人理解的报告。
真正的报告要让不同角色都能看懂。开发人员需要知道漏洞在哪、怎么复现;管理层关心风险等级和影响范围;运维团队则想了解如何修复。所以,别只顾着炫技,得说人话。
结构比文采重要
一个清晰的结构能让报告事半功倍。通常可以按这几个部分来组织:
- 测试范围:列清楚测了哪些系统、IP、域名
- 测试方法:简要说明用的手动还是自动化方式
- 发现的问题:按风险等级排序,高危放前面
- 详细描述:每个漏洞的具体位置、利用过程、截图证据
- 修复建议:给出具体可执行的方案,别只说“加强安全”
漏洞描述要有场景感
比如发现一个SQL注入,不要只写“存在SQLi漏洞”。换成:“攻击者可通过商品ID参数构造恶意请求,直接读取用户表数据,已成功提取出管理员账号密码。” 这样一来,风险立马具体化了。
再配上请求示例:
GET /product?id=1%27%20OR%201=1-- HTTP/1.1\nHost: test.example.com
加上响应中出现数据库报错信息的截图,说服力就强多了。
风险评级要一致
很多人随便标“高危”,结果一堆高危,反而让客户麻木。建议采用通用标准,比如CVSS评分,或者明确界定:
- 高危:可远程执行代码、获取敏感数据
- 中危:逻辑缺陷、权限绕过
- 低危:信息泄露、安全配置不当
保持标准统一,后续跟踪也方便。
修复建议别太笼统
别说“建议过滤输入”,而是写清楚:“对用户提交的商品ID参数进行白名单校验,仅允许数字字符,并使用预编译语句处理数据库查询。”
如果项目用了PHP,甚至可以直接给一段代码参考:
$id = intval($_GET['id']);\n$stmt = $pdo->prepare("SELECT * FROM products WHERE id = ?");\n$stmt->execute([$id]);
这样开发拿到就能改,省去来回沟通成本。
附录放技术细节
主报告尽量简洁,把工具输出、完整扫描日志、原始数据放在附录。这样既保证专业性,又不影响阅读流畅性。
有人担心报告太细会变成“攻击手册”,其实只要不写具体密码、密钥,风险可控。毕竟客户请你是来发现问题的,不是来演戏的。
格式干净点
用Word也好,PDF也罢,字体统一、段落分明。标题加粗、列表用项目符号,别整大段文字堆在一起。谁愿意看密密麻麻一页黑字?
记得加上页码、公司Logo、测试时间、报告版本号。这些小细节,往往决定专业度。