从%c0%af到目录穿越:深入理解GlassFish CVE-2017-1000028漏洞的编码与解析机制
在Web安全领域,目录穿越漏洞一直是攻击者获取敏感信息的利器。2017年曝光的GlassFish CVE-2017-1000028漏洞因其独特的编码利用方式,成为研究Java Web安全机制的经典案例。本文将深入剖析这个漏洞背后的技术原理,揭示从特殊编码到文件读取的完整攻击链条。
1. Unicode编码与UTF-8转换的陷阱
当我们在浏览器地址栏输入一个URL时,背后发生的编码转换远比表面看到的复杂。以%c0%af这个看似普通的编码序列为例,它在Java Web容器中的处理过程暗藏玄机。
UTF-8编码采用变长字节表示Unicode字符,其设计初衷是兼容ASCII的同时支持更广泛的字符集。关键点在于:
- 单字节字符:首位为0,与ASCII完全兼容
- 多字节字符:通过前缀标识字节数
- 2字节字符以
110开头 - 3字节字符以
1110开头 - 以此类推
- 2字节字符以
%c0%af对应的二进制表示为:
code复制11000000 10101111
按照UTF-8规范解析时:
- 首字节
110前缀表明这是一个2字节字符 - 有效载荷为
00000+101111(去除前缀和续字节标识) - 合并后得到
00000101111(十进制47),对应ASCII字符/
注意:这种编码方式实际上违反了UTF-8的严格规范,因为
\uC0AF本应使用3字节编码,但Java的URL解码器却接受了这种非标准形式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java URL解码器的特殊处理逻辑
Java的URL解码过程存在一个关键特性:它会对百分号编码进行两次处理。让我们分解攻击链中的关键步骤:
-
初始URL:
code复制/theme/META-INF/..%c0%af..%c0%af1.txt -
第一次解码(URL解码):
%c0%af→\uC0AF- 路径变为:
/theme/META-INF/..\uC0AF..\uC0AF1.txt
-
字符集转换:
- Java尝试将
\uC0AF转换为UTF-8字节序列
- Java尝试将
