# 手法库（可直接套用的探测与载荷）

原则：**先无害探测，再最小证明**。每条都给出"怎么判"，避免把报错当漏洞。

---

## 1. SQL 注入

### 1.1 探测顺序

| 步 | 载荷 | 判据 |
|---|---|---|
| 1 | `1/0`（数值位） | 出现"除零""divide by zero" → 数值位直接拼接，可疑 |
| 2 | `1+1` / `2-1` | 结果与 `1`、`2` 相同 → 确认为表达式求值 |
| 3 | `'`、`"` | 报语法错误（注意有些站点把整页 500 当正常） |
| 4 | `1+@@version` | 报错里带出版本号 → 错误回显通道成立 |

### 1.2 错误回显取数（最省事）

```sql
-- 把结果拼进会类型转换失败的表达式，数字/短字符串直接进错误页
1/0
1+(SELECT/**/TOP/**/1/**/name/**/FROM/**/sys.tables)
'x'+CAST((SELECT/**/TOP/**/1/**/name/**/FROM/**/sys.databases) AS int)
```

- 只取 `TOP 1`，一次一个值，**不要整表拖**；
- 记录：库名、实例名、DB 用户、表数量、目标表字段数、行数量级。

### 1.3 WAF 绕过（按顺序试）

| 手段 | 例子 |
|---|---|
| 换参数位置 | URL → **Cookie** → Header（WAF 常常只覆盖一种） |
| 注释代替空格 | `/**/`、`%09`、`%0a` |
| 单引号编码 | `%u0027`、`%ef%bc%87`（全角）、双重编码 |
| 关键字拆分 | `sel/**/ect`、`UN/**/ION` |
| 大小写/内联注释 | `SeLeCt`、`/*!50000select*/` |

注意：用 PowerShell/curl 传 `%u0027` 会被二次编码成 `%25u0027`，这类载荷**必须走真实浏览器**（页面内 `fetch` 或直接改 Cookie）。

### 1.4 从注入到账号

1. 读出账号表（管理员/用户），只取 1–2 行做证明；
2. 对 `password` 哈希**本地算常见口令哈希去等值匹配**（`123456`、`12345678`、`admin888`…），比跑字典快；
3. 拿到手机号 + 明文口令 → 登录后台 → 进入第 3 节。

### 1.5 不能做的时候

- 不支持堆叠查询 → **不要承诺"删库/改数据"**，如实写"只读"；
- 只读注入也要写清"能读到什么、不能做什么"。

### 1.6 自动化验证（sqlmap）

手工四对照（正常 / 单引号 / `AND 1=1` / `AND 1=2`）出现**稳定差分**后，再用 sqlmap 确认类型与取最小证明。

- 位置：`x:\漏洞库\tools\sqlmap`（入口 `sqlmap.py`，Python 3.9+）；
- 完整参数、误报识别、验证码/挂起/WAF 场景见 `references/sqlmap-usage.md`；
- 一键安全默认值：`scripts/sqlmap-safe.ps1 -Target "URL" -Param 参数名`；
- 三条铁律：**500 ≠ 注入**；sqlmap 说 vulnerable 必须用 `curl` 复现；出现 503/连接重置立即停。
- 红线：`--dump-all`、`--sql-shell`、`--os-shell`、`--file-read/--file-write`、`--risk=3` 一律禁用。

---

## 2. XSS

### 2.1 找"输入不进库、输出不编码"的通道

| 通道 | 探测 |
|---|---|
| 昵称 Cookie | 改 `nick` 为 `<img src=x onerror=window.__x=1>`，发一条正常内容 |
| 个人简介/签名 | 保存后在公开主页看是否原样输出 |
| 评论/留言 | 正文多半有过滤，**昵称字段常常没有** |
| URL 反射 | `?keyword=<svg onload=...>`，看是否进入页面 |
| 文件名 | 上传带 `<img>` 的文件名，看列表是否回显 |

### 2.2 验证必须三件套

1. 写入侧：提交成功；
2. 读取侧：**退出登录、无 Cookie** 请求同一页面/接口，看到未转义原文；
3. 执行侧：匿名打开页面，`window.__x === 1`（或 DOM 里出现该元素）。

只有 1、2 没 3，写"存储型 HTML 注入"，不要写"XSS 已执行"。

### 2.3 放大因素（写进"危害说明"）

- 页面无 `meta robots` → 可被索引；
- 首页有入口（"热门"列表）→ 流量大；
- 滚动自动加载（不是点击才加载）→ 命中率高；
- 旧版 jQuery（2.x）→ 原型污染让转义失效（`$.extend(true,{},JSON.parse('{"__proto__":{"x":1}}'))` 后 `({}).x===1`）；
- 后台列表同样渲染 → 管理员也中招。

---

## 3. 认证

### 3.1 弱口令

- 先看是否有默认账号（`admin/admin`、`admin/123456`）；
- 有注入能力时，**先读账号表再反查哈希**，命中率远高于盲试；
- 登录后立刻记录：账号、角色、可见菜单、**隐藏页面直接访问结果**。

### 3.2 验证码

- 先判断验证码是否与 Session 绑定、是否可复用；
- 若必须过：`CheckCode.aspx` 取图 → 放大 8–10 倍 → 人工识别（自动化识别成本高，别浪费轮次）；
- 优先找**不带验证码**的接口（登录 API、App 端接口、老版本接口）。

### 3.3 会话与 Token

| 检查 | 判据 |
|---|---|
| Session 是否登录后轮换 | 不轮换 → 会话固定 |
| Cookie 是否可伪造 | 改 `userid`/`role`/`token` 看是否影响鉴权 |
| JWT | `alg:none`、弱密钥、是否校验签名 |
| OAuth | `state` 是否固定、`redirect_uri` 是否白名单 |

---

## 4. 越权

- **菜单隐藏 ≠ 鉴权**：低权账号直接访问高权页面 URL，200 且能读数据 = 垂直越权；
- **IDOR**：把 URL/参数里的 ID 换成别人的，看是否返回他人数据（订单、资料、私信）；
- 判定必须用"另一个账号"验证，而不是"我看到了一个 ID"。

---

## 5. CSRF

- 先看有没有 Token、是否校验 `Origin/Referer`；
- **关键**：看 Cookie 的 `SameSite`。`Lax` 时跨站 POST 不带 Cookie，从第三方域发起的 CSRF 打不动；
- 能打通的场景：同站子域投递（`tools.target.com` → `www.target.com`）、GET 型敏感操作、老浏览器；
- 改密不校验原密码 = 独立高危点，与 CSRF 分开写。

---

## 6. 文件上传（四重判定）

| 关卡 | 怎么测 | 结论 |
|---|---|---|
| 后缀白名单 | 依次试 `.aspx/.ashx/.php/.phtml/.jsp/.cer/.asa/.shtml`、双后缀 `x.aspx.jpg`、大小写、尾点/尾空格 | 全部被拒 = 白名单生效 |
| 内容校验 | 图片马（正常头 + 脚本尾）是否被识别 | 被拒 = 有魔数校验 |
| 文件名 | 观察落盘名是否被重命名 | 被改名 = 无法预测路径 |
| 落点 | 上传后返回的 URL 是否在静态域（`file.` / `cdn.`） | 静态域 = 不可执行 |

四项里有一项不满足，才写"存在 getshell 可能"；否则写"上传点存在但不可执行"，并附实测表。

**不要为了证明 shell 而留后门**。用户要求最小证明时，也只传无害样本（1×1 图、纯文本），并立即登记清理。

---

## 7. SSRF

- 常见入口：导入远程文章/图片、URL 预览、webhook、PDF 生成、头像拉取；
- 探测：`http://127.0.0.1:80/`、`http://169.254.169.254/latest/meta-data/`、内网段、`file://`；
- **必须排除误判**：用**确定返回 200 的公网地址**（如 `https://example.com/`）复测。若与内网地址返回同样的错误，说明程序根本没请求你给的 URL；
- 只有"目标确实发起了请求"（通过 DNSLog/回连/响应差异证明）才算 SSRF。

---

## 8. 缓存

| 类型 | 手法 | 判据 |
|---|---|---|
| 缓存欺骗 | `/account.aspx/xxx.css`、`/profile/xxx.js` | 匿名请求命中他人页面内容（`cf-cache-status: HIT`） |
| 缓存投毒 | 让缓存键不含的输入影响响应（Header、Cookie） | 后续匿名用户拿到被污染内容 |
| 双层缓存 | CDN + 源站 OutputCache | 改完前台不变是正常现象，验证要带随机参数 |

写档案时必须记录：`cache-control`、`cf-cache-status`、`age`、缓存键推测。

---

## 9. 内容注入 / SEO 污染

- 检查点：昵称、评论、简介、词条等"文本"位置；
- 看三件事：**是否 HTML 编码**、**外链是否 `rel="nofollow"`**、**页面是否可索引**（有无 `meta robots`）；
- 后台友情链接/广告位：很多站可直接写任意外链且无白名单（配合后台弱口令 = 首页挂链）；
- 危害写法：SEO 外链 / 引流 / 钓鱼跳转，并说明"权重位置"（首页 > 内容页 > 评论）。

---

## 10. 信息泄露

| 来源 | 价值 |
|---|---|
| 详细错误页 | SQL 语句、表名、路径、版本 |
| 服务器探针（`SysImformation.aspx` 之类） | 主机名、内网 IP、组件、绝对路径 |
| `trace.axd` / `elmah.axd` / `debug.log` | 请求与异常详情 |
| `robots.txt` | 后台路径、敏感目录 |
| 备份/源码（`.git`、`.svn`、`.bak`、`.zip`） | 直接给源码与配置 |
| 响应头 | `Server`、`X-Powered-By`、`X-AspNet-Version` |

错误页类问题要写清"能读到什么具体内容"，只说"报错详细"没有说服力。

---

## 11. 文件与路径

- **LFI**：`../../etc/passwd`、`php://filter/convert.base64-encode/resource=index.php`；
- **目录穿越**：`..%2f`、`..%5c`、双重编码；
- **目录列表**：上传目录、备份目录、`/wp-content/uploads/`；
- **危险文件**：`.env`、`wp-config.php.bak`、`web.config`、`/bin/`、`App_Code/`。

---

## 12. 组件与反序列化

- 先定版本，再比对 CVE；**不盲打 POC**（很多 POC 会破坏目标）；
- 前端库：jQuery、layui、Vue/React 版本；
- 服务端：IIS/ASP.NET、PHP、Spring、Shiro、Fastjson、Log4j2、Struts2；
- 拿到"版本 EOL"只写"信息/低危"，除非能证明可利用。

---

## 13. 组合链（写报告时最有价值）

单点低危拼成高危，例子：

```
SQL 注入（读管理员表）
  → 哈希反查得弱口令
  → 登录后台
  → 垂直越权访问系统配置/用户管理
  → 广告位写任意外链（首页 dofollow）
```

写档案时把链条画出来，标注每一环的编号（`23 → 24 → 25 → 28`），让开发一眼看懂优先级。

---

## 14. 每次收尾要问自己的三句话

1. 这个结论，换个人按我写的步骤能不能复现？
2. 我有没有在**未登录**状态下验过？
3. 我留下的东西（评论、文件、缓存、账号）登记了吗？删得掉吗？
