综合实战:靶场通关、漏洞复现与平台加固
这一课你将能做到
- 独立完成 DVWA 高难度关卡,串联整门课的攻防知识
- 在本地环境安全复现一个真实 CVE(Log4Shell),理解依赖漏洞的工程意义
- 为 Spring Boot 平台执行一份 20 项安全检查清单并输出加固报告
为什么要学
知识只有串成实战才属于你。这门课你学了侦察、加固、加密、认证、攻击、防御、应急、云与合规——本课用三个综合练习把它们焊在一起:靶场通关练「攻的视角」,CVE 复现练「依赖风险」,平台加固练「守的落地」。这也是你整理安全作品集的起点:一份复现报告 + 一份加固清单,面试时比任何口号都有说服力。
先建立图像
本课的实战闭环:
学攻击(DVWA) ──▶ 理解漏洞机理
│
学复现(Log4Shell) ──▶ 理解供应链风险:一个依赖 = 全站命门
│
学加固(Checklist) ──▶ 把防御固化到 CI/CD 与代码评审
▼
输出作品集:复现报告 + 加固记录
跟着做
练习一:DVWA 通关(把攻击链走完整)
docker run --rm -it -d -p 80:80 vulnerables/web-dvwa
# Security 等级逐级提升:low → medium → high
每个关卡对照课程模块:
SQL Injection → cs-threats:参数化为什么根治注入
Brute Force → cs-defense:为什么登录要限流+锁定
File Upload → cs-threats:上传校验(白名单+重命名+隔离存储)
File Inclusion → cs-network:路径穿越与配置收敛
CSRF → cs-identity:SameSite 与 Token 的取舍
Command Injection → cs-os:最小权限让 RCE 无法提权
high 难度下每关都打不动,说明防御到位——把「为什么打不动」写下来,比打穿更有价值。
练习二:本地复现 Log4Shell(CVE-2021-44228)
仅在你自己的 Docker 环境内复现,payload 不指向任何真实外部系统。
# 准备一个含旧版 log4j-core(2.14.1) 的 Spring Boot Demo
# log4j2.xml 保持默认,应用日志会记录用户输入
docker build -t log4shell-lab .
docker run -d -p 8080:8080 log4shell-lab
# 攻击面:任何会被 log4j 记录的输入(User-Agent、搜索框、日志里的用户名)
# 经典 payload 形如:${jndi:ldap://127.0.0.1:1389/Exploit}
# 本地起一个 LDAP 服务模拟(自建测试,不出网)
docker run --rm -p 1389:1389 marcnuri demos...
简化演示(不引入外部 LDAP):
// Demo 接口:把用户输入直接 log.info(out) —— 命中漏洞路径
log.info("search query: {}", userInput);
// userInput = "${jndi:ldap://127.0.0.1:1389/x}" 时,
// log4j 会解析查找表达式并尝试外连 —— 这就是 RCE 的入口
# 验证修复:升级到 log4j-core ≥ 2.17.1 或设置
# -Dlog4j2.formatMsgNoLookups=true(临时缓解)
mvn versions:use-latest-versions -Dincludes=org.apache.logging.log4j
# 复盘三问:哪个依赖带的?怎么发现的?CI 里怎么挡住?
练习三:平台安全加固清单(20 项走一遍)
认证与授权
□ 1. JWT 算法服务端固定,不信任 header 的 alg
□ 2. access token 短期 + refresh 可吊销(Redis 黑名单)
□ 3. 所有管理接口 @PreAuthorize 双重校验(网关+方法级)
□ 4. 登录失败锁定 + 图形/滑块验证码
输入与注入
□ 5. SQL 全参数化,全局 grep 排查 ${} 使用点
□ 6. 所有富文本输出走白名单消毒
□ 7. 文件上传:白名单后缀+魔数校验+重命名+隔离目录
□ 8. SSRF:出站 URL 白名单,禁止访问内网/链路本地地址
传输与存储
□ 9. 全站 HTTPS + HSTS
□ 10. 密码 BCrypt 成本因子 ≥ 10
□ 11. 敏感字段(手机号等)加密存储 + 日志脱敏
□ 12. 生产配置零明文密钥(环境变量/KMS)
接口与可用性
□ 13. 登录/注册/短信接口按 IP+用户限流(429+Retry-After)
□ 14. Actuator 生产关闭或独立端口+认证
□ 15. 错误响应统一脱敏(不回显堆栈/SQL)
□ 16. CORS 白名单精确到域名,禁止 *
审计与响应
□ 17. 安全日志独立落盘:登录成败/鉴权失败/限流触发
□ 18. 日志留存 ≥ 6 个月
依赖与流程
□ 19. CI 集成 dependency-check + SpotBugs-Security,阻断高危
□ 20. 事件响应 Runbook 存在且演练过一次
每项标注:已做 / 未做 / 不适用,未做的排期。这就是一份可交差的加固报告。
练习四(可选):接入漏扫与复测
# 用 OWASP ZAP 对本站本地环境做被动扫描
docker run --rm -u zap -p 8081:8080 -i ghcr.io/zaproxy/zaproxy:stable \
zap.sh -cmd -port 8081
# 浏览器代理到 8081,正常浏览一遍,查看告警面板
# 把误报与真报分别标注,真报并入加固清单
讲清楚要点
- 攻防一体才记得牢:只学防御记不住「为什么」,亲手打一遍 DVWA,每个防御措施都有了对应的攻击画面,知识变成条件反射。
- 依赖漏洞是 Java 平台的第一大现实威胁:Log4Shell 的教训不是 log4j 有洞,而是「你不知道自己依赖了什么」。SBOM(软件物料清单)+ CI 扫描是长期解法。
- 清单的价值在「可验证」:「注意安全」是口号,「grep 全项目查 ${}」是检查项。把这条课的 20 项变成团队 PR 模板与 CI 规则,安全才落地。
- 复现报告是能力证明:CVE 复现报告包含环境、触发步骤、影响分析、修复验证——它同时训练了渗透报告能力(cs-offensive)与应急能力(cs-incident)。
- 持续学习路径:DVWA 之后的进阶依次是 PortSwigger Academy(Web 深度)→ VulnHub/HTB(系统渗透)→ 真实 SRC(有授权的赏金)。每一步都有社区与官方文档支撑。
你可能会懵的地方
-
复现 CVE 需要担心法律风险吗? 在自己 Docker/虚拟机里复现公开 CVE 是标准学习方式,不违法。红线:payload 不指向外部系统、不复现到真实服务、报告不公开含他人系统的细节。
-
DVWA 打穿之后玩什么? Web 方向:PortSwigger Academy 的 LAB(现代框架场景);系统方向:VulnHub 的 Kioptrix/Mr-Robot;综合:HTB Academy 订阅或免费层。按「Web 优先」推进,与你后端主业复利最大。
-
dependency-check 误报多怎么办? 它按 CPE 匹配偏保守。用 NVD API Key 提升准确度、对确认不影响的 CVE 用 suppression 文件标注理由(理由本身就是审计证据)、或叠加 Snyk/Trivy 交叉验证。
-
20 项清单做不完怎么排优先级? 按暴露面排序:公网可触达 > 认证相关 > 数据保护 > 审计。1/2/3/13/14 五项是底线,其余按迭代排期,每季度复审一次。
-
怎么把这门课变成作品集? 三份文档:① DVWA 通关笔记(含 high 难度防御分析)② Log4Shell 复现报告 ③ 平台加固报告(20 项清单+前后对比)。开源到 GitHub 并附本课程链接,这就是面试时「你做过什么安全工作」的答案。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 只刷通关视频不动手 | 知识不落地 | 每关亲手复现并记录 |
| 复现 CVE 用生产环境 | 重大事故风险 | 只在隔离的 Docker/VM 内 |
| 清单向标准看齐不验证 | 「已做」其实是自欺 | 每项附验证命令或截图 |
| 学完不做输出 | 三个月后遗忘 | 复现报告+加固报告+通关笔记 |
| 工具链一次性装完就吃灰 | 防御退化为摆设 | 扫描进 CI,季度复审清单 |
卡点急救
- Log4Shell 复现无反应:确认依赖版本确为受影响区间(2.0-beta9 ~ 2.14.1)、日志级别允许记录该输入、JDK 版本影响 LDAP 利用路径(JDK 6u211+/7u201+/8u191+ 默认禁远程类加载——观察 DNS/连接行为即可证明漏洞存在)。
- ZAP 扫描误报淹没:先只开被动扫描熟悉基线,主动扫描限定本机目标;按「确认可利用」过滤告警再决定是否进清单。
- 清单 20 项无从下手:先跑一遍自动化(依赖扫描+ZAP 基线)生成现状报告,把其中映射到清单条目的问题列为第一轮整改,其余人工核查。
面试常问
-
说说你对 Log4Shell 的理解与你们是怎么防的? 机理:log4j2 对日志内容做
${...}查找表达式解析,jndi:协议触发远程类加载导致 RCE。防御:升级 ≥2.17.1(根治)、临时缓解 formatMsgNoLookups、CI 依赖扫描阻断旧版本、SBOM 摸清依赖来源。答出「供应链视角」是加分项。 -
如果让你负责提升一个 Spring Boot 平台的安全水平,你怎么启动? 先摸底(资产清单+依赖扫描+一次基线漏扫)→ 按风险排序(暴露面优先)→ 快赢项(HTTPS、限流、Actuator 收口、密钥出代码)→ 体系化(CI 安全门禁、安全日志、应急 Runbook)→ 度量与复审(清单季度复核、指标跟踪)。
-
你如何保持安全知识更新? 订阅漏洞情报(NVD、GitHub Advisory、厂商公告)、跟进 OWASP 项目动态、定期打靶场保持手感、把新漏洞映射到自己技术栈做影响评估。体现的是「流程化跟进」而非「想起来才看」。
自测三问
- 不看资料,你能写出 Log4Shell 的 payload 形态与三种缓解措施吗?
- 20 项清单里,你认为对自己平台最紧急的 5 项是哪些?为什么?
- 复现报告需要包含哪几个部分?
小结一句话
攻防串成闭环、漏洞亲手复现、防御固化进 CI——这门课的终点不是「学完了」,而是你带着三份作品文档,进入了「持续验证」的安全工程状态。
延伸
- OWASP DVWA 官方仓库
- OWASP Dependency-Check
- PortSwigger Web Security Academy
- 结课:回到 /roadmaps/cyber-security 标记完成全部节点,开启下一阶段学习。