前言
没接触过java xxe,于是学习一下java xxe
关于XXE
这个和php里的xxe几乎没什么差别,都是外部实体的引用,payload也一样
1 | "1.0" encoding="UTF-8" xml version= |
可能造成XXE的函数
1 | javax.xml.parsers.DocumentBuilderFactory; |
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
19package 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
成功收到请求
漏洞分析
下断点跟进
之后会调用/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java
的scanDocument
进行xml的扫描
执行顺序
先扫描Document部分,接着扫描DTD部分,然后进入Element部分
(如果是参数实体引用 (即%[name];) ,则会在DTD阶段进行求值)
element时接着进入
对文本扫描,获取第一个字符的ascii,38也就是&
然后进入判断
这时设置状态为引用(SCANNER_STATE_REFERENCE
)
回到next,进入
进入
首先获取引用的name,也就是win1
2protected void scanEntityReference(XMLStringBuffer content) throws IOException, XNIException {
String name = fEntityScanner.scanName();
然后进入
继续跟
再跟进
建立连接
调用链