本文以同一漏洞在 JavaSecLab 中的易受攻击实现与已修复实现为对照,说明如何建立可复核的本地测试基线,并用 SAST 与 DAST 检查工具能否发现差异。JavaSecLab 项目介绍了漏洞代码、修复实现、攻击场景和审计线索,可用于应用安全学习与工具评估;本文仅适用于自有或明确授权的隔离环境,不涉及生产系统或未授权目标。开始前应确认测试范围、依赖来源、网络边界和清理方式,并为测试留存代码版本、配置及工具结果。
一、准备隔离环境
先从项目的官方仓库核对当前文档、分支或发布版本,再按所选版本的说明准备 Java 运行环境、构建工具及项目所需依赖。不要仅凭旧教程中的版本号或启动命令操作;仓库结构、模块和启动方式可能随版本变化。官方仓库:JavaSecLab。
建议在一次性虚拟机、容器或专用测试主机中运行靶场,并遵守以下边界:
- 仅在本机或专用测试网段开放服务;不配置公网入口、端口映射或反向代理。
- 使用独立测试数据和临时凭据,不复用真实账号、密钥或数据库。
- 将应用、数据库和扫描器限制在测试网络内;确认扫描器不会自动扩展到其他主机或网段。
- 记录操作系统、Java 版本、项目提交号或发布版本、启动参数及依赖配置,以便重复测试。
- 如果仓库文档给出示例账号或连接配置,只在隔离环境中使用;不得将示例凭据带入真实环境。
启动前先阅读仓库说明并识别项目实际包含的模块。不要默认所有模块都应同时启动:只选本次评估所需的一项,确认它的依赖、监听地址和数据存储位置,再按对应文档运行。若需要数据库或其他服务,应优先使用专用实例,并确认停止靶场后如何销毁或重置数据。
二、选择模块并设定基线
选择一个能够形成清晰对照的漏洞模块,优先使用仓库中同时提供易受攻击代码和修复实现、且文档标明输入点或审计线索的场景。JavaSecLab 的项目介绍列出了漏洞代码、修复代码、攻击场景及审计相关内容;具体模块名称、目录和运行方式应以所选版本仓库中的实际内容为准。
测试前建立基线清单:
| 项目 | 记录内容 |
|---|---|
| 靶场版本 | 仓库 URL、分支或发布版本、提交号 |
| 模块与实现 | 易受攻击版本或已修复版本、对应目录或类 |
| 环境 | 操作系统、Java 与构建工具版本、依赖状态 |
| 网络范围 | 靶场地址、端口、扫描器地址及允许访问范围 |
| 数据状态 | 数据库或文件存储的初始状态、重置方式 |
| 工具配置 | SAST/DAST 工具及版本、规则包、扫描范围和排除项 |
应分别检出或构建两种实现,避免同一工作区中未确认的修改影响对照结果。每轮测试只改变一个关键条件,例如实现版本或扫描器规则集;否则难以判断告警差异来自代码变化,还是配置变化。
三、验证易受攻击实现
先从源码追踪用户可控输入经过哪些处理,到达哪个敏感操作,再确定最小化的验证请求。将“可触发”定义为:在记录的环境、模块和请求条件下,能够观察到与该漏洞假设一致的结果,而不是仅凭扫描器告警或异常响应下结论。
DAST 请求应只指向本地靶场地址,并使用该模块文档规定的测试入口和输入。可以把目标写成占位形式,例如:
http://<本地靶场地址>:<端口>/<模块文档中的路径>不要把占位目标替换为生产地址,也不要扫描包含靶场以外资产的网段。根据测试目标限制请求数量、速率和并发;先执行一次低影响验证,再决定是否需要重复。出现非预期服务负载、数据写入、外部网络连接或靶场范围外响应时,立即停止扫描并检查日志与网络连接。
记录每次验证的时间、目标模块、请求方法和路径、必要的脱敏参数、响应状态及关键响应特征。不要把密码、令牌或含个人信息的完整请求直接写入报告;证据应足以复核结论,同时避免保存不必要的敏感数据。

四、对照修复实现
对易受攻击实现完成验证后,切换到对应修复实现,并尽量保持运行环境、扫描规则、请求内容和数据状态不变。复测同一入口,观察漏洞相关行为是否消失,以及正常功能是否仍按预期工作。若切换实现需要重启服务、重建数据库或更改配置,应把这些差异记录下来;否则修复前后的结果可能不可比。
源码对照要围绕数据流与安全控制展开,而不只是比较文件差异:
- 输入是否经过适当的解析、验证或规范化。
- 敏感操作是否使用安全 API、参数化机制或明确的访问控制。
- 修复是否覆盖实际可达路径,而非只处理某个测试样例。
- 是否存在其他入口能够绕过修复,或其他调用点仍使用易受攻击逻辑。
不要把“特定载荷不再触发”直接等同于彻底修复。应结合修复代码、调用路径、模块文档和重复测试,说明证据支持的范围,并标出未覆盖的入口或条件。
五、复核 SAST 与 DAST 结果
SAST 通常从源码及其规则识别风险模式;DAST 从运行中的应用观察外部行为。两类工具的发现依据不同,结果不应简单互相替代。工具评估的重点,是看告警是否能对应到可解释的代码路径或运行时行为,并验证修复版本是否呈现预期差异。
对每条告警逐项复核:
- 定位代码与数据流:确认告警指向的输入源、传播路径和敏感操作是否对应所选模块。告警落在易受攻击代码附近,并不自动证明路径可达。
- 确认运行条件:核对模块是否启动、入口是否可访问、所需配置或数据是否存在。DAST 无告警可能是覆盖不足,不一定代表不存在缺陷。
- 用相同条件复测修复版:固定目标、请求、规则集和环境配置,比较两种实现的告警与响应差异。
- 分类结果并注明依据:可标记为已确认缺陷、未确认告警、误报或覆盖不足。每种判断都应附上源码位置、请求证据、工具配置及复核理由。
- 保留原始输出:保存工具版本、规则或策略配置、扫描时间、目标范围、原始报告及人工复核记录。报告中可对凭据、令牌及不必要的个人数据脱敏。
SAST 对修复代码仍告警时,先检查规则是否匹配了不安全模式、分析是否能跟踪项目中的数据流,以及告警位置是否属于有效调用路径。只有在确认代码行为与告警含义不符后,才将其判为误报,并记录代码依据和复核人。DAST 在易受攻击版本没有发现时,应先检查爬取范围、认证状态、路由覆盖和请求是否到达对应处理逻辑;不能仅凭扫描结果宣称不存在漏洞。

六、证据、结论与修复复测
将结论写成可复核的判断,而不是只附扫描器截图。建议每项发现至少包含:
- 目标范围、授权依据及测试时间。
- 项目版本、模块、易受攻击或修复实现的标识。
- 复现前提、最小请求或操作步骤、观察到的结果。
- 源码位置与相关数据流,或 DAST 的请求和响应摘要。
- 工具名称与版本、规则配置、扫描范围和排除项。
- 影响判断、可信度、未覆盖条件及复核人。
- 修复建议、验证方式和复测结果。
风险判断应对应已验证的影响与前提。若只在特定配置下观察到问题,应明确该限制;若扫描器未覆盖某条路径,也应把它列为未验证,而不是把“未发现”写成“安全”。修复后,使用相同基线重跑相关测试,并同时检查修复行为和正常功能。
七、清理与回滚
结束测试后停止靶场及其配套服务,关闭临时监听端口,清除测试账号、临时数据和不再需要的测试凭据。若使用快照或专用测试数据库,按预先记录的步骤回滚或销毁;不要把测试数据恢复到生产系统。保留必要的脱敏证据与版本信息,并确认日志、报告和本地副本的存储位置及访问权限。
一份可靠的 JavaSecLab 评估记录,应能让其他人员在相同版本、模块和条件下复现观察结果,并解释工具为何报出或遗漏某条问题。将易受攻击实现、修复实现、工具输出和人工复核放在同一条证据链上,才能把靶场用于可比较的工具评估与修复验证,而不是停留在一次性的漏洞演示。
- DAST
- it2021
- it2021.com
- 应用安全
- 访问控制





广东 深圳 1F
隔离环境这一步真的不能省
重庆 重庆 2F
想了解不同模块的复现难度差异
重庆 重庆 3F
SAST和DAST结合起来看更稳妥
广东 深圳 4F
修复前后保持同一测试条件很关键
宁夏 中卫 5F
未发现告警不等于没有漏洞
广东 深圳 6F
基线记录做得细,后面复测省事
宁夏 中卫 7F
靶场最好单独放在虚拟机里