渗透测试的最后一步,也是最重要的一步,就是撰写报告。一份好的报告不仅要清晰地描述漏洞,还要提供有效的修复建议,帮助开发人员理解和修复问题。

CVSS(Common Vulnerability Scoring System)是评估漏洞严重程度的标准化方法。它提供了客观的评分标准,帮助评估漏洞的风险等级。
CVSS评分由三部分组成:基础评分(Base Score)评估漏洞的固有特性,包括攻击向量(AV:网络、相邻、本地、物理)、攻击复杂度(AC:低、高)、 所需权限(PR:无、低、高)、用户交互(UI:无、需要)、影响范围(S:未改变、改变)、机密性影响(C:无、低、高)、完整性影响(I:无、低、高) 可用性影响(A:无、低、高)。时间评分(Temporal Score)评估漏洞的时间特性,包括利用代码成熟度(E)、修复级别(RL)、报告可信度(RC)。 环境评分(Environmental Score)评估漏洞在特定环境中的影响,包括安全要求(CR、IR、AR)、修改的基础指标(MAV、MAC等)。
CVSS评分用于衡量漏洞的风险高低,为漏洞修复提供优先级参考。评分通常分为“严重”、“高”、“中”等等级。实际渗透测试报告中,一般会选择有代表性的漏洞进行简单说明,帮助阅读者理解分数的含义。
SQL注入(高危示例)
该漏洞可被远程利用,无需身份认证或用户互动,攻击者可直接获取或修改敏感数据,甚至控制数据库。常见评分为9.8/10(严重风险)。
反射型XSS(中危示例)
该漏洞通常需要用户点击恶意链接才会生效,对核心数据影响有限。常见评分为6.1/10(中等风险)。
在实际报告中,建议为每个漏洞附上CVSS分数,并简要说明高分的原因,例如:是否容易被利用、需要哪些条件、会造成哪些影响等。这样能让管理者更直观地理解漏洞风险。
除了CVSS评分,还要评估业务影响。评估维度包括:数据影响(可能泄露什么数据,数据的重要性,影响的用户数量),业务影响(对业务流程的影响,可能造成的经济损失,对品牌的影响),合规影响(是否违反法律法规,是否违反行业标准,可能面临的处罚)。
假设发现一个支付系统的金额可修改漏洞。CVSS评分:9.1(严重)。业务影响:数据影响可能造成资金损失,业务影响直接影响支付功能,可能造成重大经济损失,合规影响可能违反支付行业标准。综合评估:严重(Critical)。

一份好的修复建议应该包含:问题描述(清晰描述问题),漏洞原理(解释为什么存在这个漏洞),攻击演示(提供POC证明漏洞存在),修复方案(提供具体的修复代码),临时缓解措施(在修复前的临时防护)。
问题描述要清晰、准确,使用技术术语,但要易懂,说明漏洞的位置和影响。
示例:
|问题:登录功能存在SQL注入漏洞 位置:/api/login.php,参数username 描述:系统在验证用户登录时,直接将用户输入的username参数拼接到SQL查询中,没有进行参数化查询或过滤,导致攻击者可以构造恶意SQL语句,获取数据库中的敏感信息。 影响:攻击者可以获取所有用户的用户名和密码hash,可能导致账户被窃取。
漏洞原理要解释漏洞的根本原因,说明攻击者如何利用,使用代码示例说明。
示例:
|漏洞原理: 当前代码: $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = mysqli_query($conn, $sql); 问题是直接将用户输入拼接到SQL查询中,没有使用参数化查询,没有对输入进行过滤。 攻击示例: 攻击者输入: username: admin' OR '1'='1 password: anything 生成的SQL: SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='anything' 由于'1'='1'永远为真,这个查询会返回所有用户,攻击者可以绕过认证。
攻击演示要提供POC证明漏洞存在,截图或视频演示,说明攻击步骤。
示例:
|攻击演示: 步骤1:使用Burp Suite拦截登录请求 步骤2:修改username参数为:admin' OR '1'='1 步骤3:发送请求 步骤4:查看响应,成功登录(返回了用户信息) 截图:[附截图]
修复方案要提供具体的修复代码,说明修复的原理,提供多种修复方案(如果有)。
示例:
|修复方案: 方案1:使用参数化查询(推荐) 修改后的代码: ```php $username = $_POST['username']; $password = $_POST['password']; $stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $result = $stmt->get_result();
原理是使用prepare语句,参数用?占位符,使用bind_param绑定参数,自动转义,防止SQL注入。
方案2:输入过滤(不推荐,作为补充)
如果必须使用字符串拼接,要对输入进行过滤:
|$username = mysqli_real_escape_string($conn, $_POST['username']); $password = mysqli_real_escape_string($conn, $_POST['password']);
注意:这种方法不如参数化查询安全,不推荐单独使用。
|### 临时缓解措施 临时缓解措施是在修复前的临时防护,说明如何配置,说明效果和局限性。 示例: ```text 临时缓解措施: 部署WAF(Web应用防火墙),配置SQL注入防护规则,拦截常见的SQL注入payload。注意:WAF可能被绕过,不是根本解决方案。 限制访问,限制登录接口的访问频率,使用验证码。注意:只能降低风险,不能消除漏洞。 监控和告警,监控异常的SQL查询,设置告警规则。注意:只能发现攻击,不能防止攻击。

与开发沟通的原则是:理解开发的困难,提供清晰的修复建议,避免指责和批评。
技巧包括:用技术语言(使用开发人员熟悉的术语,提供代码示例,说明技术原理),提供多种方案(提供最佳方案,也提供替代方案,说明各方案的优缺点),分优先级(明确哪些漏洞需要优先修复,说明修复的紧急程度,提供修复时间建议)。
与管理层沟通的原则是:用业务语言,说明业务影响,提供风险评估。
技巧包括:用业务语言(避免技术细节,说明对业务的影响,用数据说话),风险评估(说明漏洞的风险等级,说明可能造成的损失,说明修复的紧迫性),提供建议(提供修复优先级建议,提供资源需求估算,提供时间规划建议)。
报告结构包括:执行摘要(测试概述、发现的主要问题、风险等级统计),详细漏洞列表(每个漏洞的详细描述、CVSS评分、修复建议),修复建议汇总(按优先级排序、修复时间估算、资源需求),附录(POC代码、截图、工具和命令)。
报告格式:使用清晰的标题和章节,使用表格和图表,使用代码高亮,使用截图和标注。
本部分我们一起围绕渗透测试报告的撰写与修复建议的方法进行了深入探讨。你应该已经感受到,一份优秀的渗透测试报告不仅仅是漏洞的罗列,更要注重分析风险(如CVSS评分、业务影响)、清晰阐述问题来龙去脉、用实例演示攻击手法,并且给出切实可行的修复方案和临时缓解措施。 同时,良好的沟通能力也非常重要——无论是与开发同事的技术交流,还是用业务视角向管理层说明风险抉择,抑或是让报告内容直观易懂。
这一部分也是本课程的收官。回顾这一段简短的学习旅程,你已经逐步掌握了Web渗透测试的关键方法。当然,安全领域没有一劳永逸的“终点”,技术和攻击手段日新月异。
最后,送给你一条建议:好的渗透测试不仅是发现问题的能力,更在于推动问题真正落地修复。用心呈现易读的报告、提出有建设性的建议、建立顺畅的沟通,这些也是每一位安全工程师的必修课。愿你在安全之路上,越走越远!