惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Schneier on Security
I
InfoQ
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The GitHub Blog
The GitHub Blog
S
Security @ Cisco Blogs
O
OpenAI News
W
WeLiveSecurity
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
Cloudbric
Cloudbric
The Last Watchdog
The Last Watchdog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
NISL@THU
NISL@THU
T
Tailwind CSS Blog
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
D
DataBreaches.Net
B
Blog RSS Feed
N
News and Events Feed by Topic
N
News and Events Feed by Topic
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
腾讯CDC
Latest news
Latest news
V
Vulnerabilities – Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
V
V2EX
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Register - Security
The Register - Security
Help Net Security
Help Net Security

LoRexxar's Blog | 信息技术分享

Wordpress wp2shell 未授权RCE(CVE-2026-63030 / CVE-2026-60137) 2026年了,核弹还是fastjson,fastjson1.2.83 RCE是怎么回事? AI.Re.(3) - AI到底变了什么?为什么突然井喷? AI.Re.(2) - OpenClaw到底为什么爆火? AI.Re.(1) - AI变革的时代来了吗? 不容错过的2025年度漏洞:React2Shell(CVE-2025-55182)分析 PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)分析与复现 人与代码的桥梁-聊聊SAST Joern In RealWorld (3) - 致远OA A8 SSRF2RCE Joern In RealWorld (2) - Jumpserver随机数种子泄露导致账户劫持漏洞(CVE-2023-42820) 深入浅出Joern(四)不常用语法大全 Joern In RealWorld (1) - Acutators + CVE-2022-21724 深入浅出Joern(三)Joern和Neo4j常用语法大全 深入浅出Joern(二)CPG与图数据库 深入浅出Joern(一)Joern与CPG是什么? 打造自己的AIGC应用(一)入门篇 赛博偶像速成指南(三)- Midjourney 赛博偶像速成指南(二)- SD进阶篇 从0到1的ChatGPT - 进阶篇(五)- Embeddings 从0到1的ChatGPT - 进阶篇(四)- 训练自己的ChatGPT 看上去不起眼的微信机器人以及公众号爬虫 从0到1的ChatGPT - 进阶篇(三)- ChatGPT+?
Ghost Bits,Java WAF之殇?
LoRexxar · 2026-04-29 · via LoRexxar's Blog | 信息技术分享

在前两天的BlacksetHat Asia 2026上,@浅蓝和@1ue分享一个非常有趣的议题,Java中的GhostBits漏洞

探究深度非常深,影响范围非常之广,内容非常有意思

什么是Ghost Bits?

Ghost Bits这个概念的来源太久很难深究,甚至在软件领域之前就已经有类似的概念。Ghost Bits主要是指那些在莫名其妙的位置影响到软件运行的位,所以形容像幽灵一样。

在这个议题中,Ghost Bits主要指的是在某些类型转换过程中被不小心丢掉的高位,导致原字符串内容变化。

最经典的场景就是char类型和byte类型的转换,也是Java的经典场景。

char类型是16位(2字节),byte类型是8位(1字节),如果发生char强制转换为byte就会丢弃高8位,只保留低8位。其中的8位就像幽灵一样消失了。

在Java中,有4种非常常见的写法都会有该问题

  • (byte) ch:显式的byte强制类型转化
  • ch & 0xFF:位掩码,保留低8位
  • OutputStream.write(int):写入流时被截断
  • DataOutputStream.writeBytes():官方JDK方法,在文档中明确写明会丢弃高8位

而在unicode中,会有大量的高位内容,经过处理和转换之后就会被截断变成对应的字符

要注意的是,这个问题本质上在源代码层面表现一致,不能单独算作是一个漏洞,所以在80%的场景下,该问题主要影响的是和源代码不在同一层的软件,其中最经典的就是waf

具体怎么回事?

基础的原理刚才都理解了,其实就是利用高位无效的机制问题,使得输入的内容在waf和实际源代码处理的时候遇到的是不同的内容

比如说中文字阮,经过处理之后源代码获得的就是.

1
2
字符 '阮' = U+962E = 0x962E
(byte) 0x962E = 0x2E = '.'

那你就可以用这种方式绕过WAF的限制

比如说我输入\u丰丰耳失waf收到这个输入的时候认为没有任何敏感词,则放行到后端jackson,后端将其转为byte,最终拼接成sql注入语句

最神奇的是,这种逻辑的泛用性极强,首先本身高位被抛弃意味着高位可以塞入任意值,那么对于poc就是多对1的转化关系。

以下两种都可以直接转为对应的../../,这对于waf来讲就是极强的考验,即便只针对byte的转化关系,waf也非常难处理


继续拓展?

刚才提到了,在java本身的代码中,char类型和byte类型的转化是非常常用的写法,其带来的问题往往并不能直白的影响到源代码层面,但对于安全来讲,似乎小概率事件会导致大概率问题?!

CVE-2025-41242 Spring框架因Jetty URI解析不一致导致的路径穿越漏洞

刚才我们讨论的是泛用性非常强的waf场景,那么在Spring框架下,本身会有一个非常大的问题,就是Spring框架中StringUtils.uriDecode和JettyURIUtil.encodePathSafeEncoding的处理方式不一致,导致了底层的路径穿越问题。

对于Spring框架的StringUtils.uriDecode方法

遇到%时会做专门的处理,并调用ByteArrayOutputStream.write导致了高位bit丢失,出现Ghost Bits漏洞。

阮严灵丰丰甲来会被转为.%u002e

这个输入在Spring层面,不但可以通过isInvalidPath/isInvalidEncodedPath的路径检查,还不会被识别为正常的%u编码,全部放行

传递到Jetty中,URIUtil.encodePathSafeEncoding却会将%u002e做unicode解码转为.,最终构造成为../
image-20260429181104521

Openfire CVE-2023-32315 — 认证绕过

转为Byte丢失高位的方案大家都知道,还有一些更邪门的其他漏洞,其实本质上也是类似的问题。

一个很有趣的例子就是Openfire CVE-2023-32315,这个漏洞本质上是一个基础的路径穿越漏洞

  • CVE-2008-6508,最早的漏洞只需要..就可以实现路径穿越
  • CVE-2023-32315,发现可以用%u002e,也就是UTF-16来替代%2e实现路径穿越,因为AuthCheckFilter并没有校验对应的输入,但Jetty支持%u解码,导致了漏洞的绕过

poc就是这样的

1
/setup/setup-a/%u002e%u002e/%u002e%u002e/log.jsp

很多WAF都加入了%u002e%u002e作为关键字之一,那么你可以使用这个poc来绕过

1
/setup/setup-a/%2>%2>/%2>%2>/log.jsp

这里有个比较邪门的点在于,对于大部分框架来说,他们不会把%2>当做url编码去处理,因为>并不是合法的url编码

但是对于Jetty来说,他会一视同仁,把>传入到convertHexDigit做处理

1
2
3
4
5
6
public static byte convertHexDigit(byte c) {
byte b = (byte)((c & 0x1f) + ((c >> 6) * 0x19) - 0x10);
if (b < 0 || b > 15)
throw new NumberFormatException("!hex " + c);
return b;
}

也就是说即便是符号>依旧会经过这一套算法,最终获得结果是14,对应E

那么这样一来,waf收到的请求是%2>不合法的url编码不做处理,jetty把他处理转为了%2E成功输入.绕过waf

写在最后

其实类似的场景同样非常多,因为许多大型框架中,除了显式的Java类型转化,还会有隐式的框架中的处理导致同样的问题,在原议题中分享了不同框架下涉及到不同漏洞的很多种问题,他们无一都是开发者无意中触发了Ghost bits问题,设计者并没有提前考虑好类型强制转化的额外影响。

正如演讲结尾所说:“We have only scratched the surface” — 这才刚刚开始。