Java 审计之XXE篇

0x00 前言

在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过。下面来 深入了解一下该漏洞的产生和利用。

0x01 XXE漏洞

当程序在解析XML输入时,允许引用外部实体,导致能够引用一个外部恶意文件,可导致执行系统命令,内网端口检测,文件读取,攻击内网服务,dos攻击等。

在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。

具体利用方式参考: 一篇文章带你深入理解漏洞之 XXE 漏洞

0x02 Java中XXE的产生

其实说白了,也还是在web应用中接受并且解析xml的时候允许引用外部的实体。web应用中需要解析的xml,需要是可控的。

那么先来看看漏洞产生的代码,前面本来想着是自己去写一个XXE的漏洞代码,但是发现写的时候报各种错,参考其他文章的代码,调试半天还是报错。所以这里就借用JoyChou师傅开源的Java Sec Code项目上来做一个演示。

项目地址:https://github.com/JoyChou93/java-sec-code/

DocumentBuilder

DocumentBuilder类是JDK自带的类,在该类解析产生的XXE漏洞是有回显的。

public String DocumentBuilderVuln01(HttpServletRequest request) {
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
StringBuilder buf = new StringBuilder();
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(String.format("%s: %s\n", node.getNodeName(), node.getTextContent()));
}
}
sr.close();
return buf.toString();
} catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}

saxReader

saxReader是第三方的库,该类是无回显的

public String SAXReaderVuln(HttpServletRequest request) {
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;
}

SAXBuilder

第三方库

  public String SAXBuilderVuln(HttpServletRequest request) {
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;

SAXParserFactory

该类也是JDK内置的类,但他不可回显内容,可借助dnslog平台

public String SAXParserVuln(HttpServletRequest request) {
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;
}
}

XMLReaderFactory

 public String xmlReaderVuln(HttpServletRequest request) {
try {
String body = WebUtils.getRequestBody(request);
logger.info(body);
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.parse(new InputSource(new StringReader(body))); // parse xml
return "xmlReader xxe vuln code";
} catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
}

Digester

 public String DigesterVuln(HttpServletRequest request) {
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;
}
return "Digester xxe vuln code";

XMLReader

public String XMLReaderVuln(HttpServletRequest request) {
try {
String body = WebUtils.getRequestBody(request);
logger.info(body); SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.parse(new InputSource(new StringReader(body))); } catch (Exception e) {
logger.error(e.toString());
return EXCEPT;
} return "XMLReader xxe vuln code";
}

修复方法

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

0x03 结尾

本文作为一个记录文,在Java中能解析XXE的类会比较多。因为在Java中配置文件会频繁的使用到XML文件或是数据传输。导致XXE漏洞可能会比其他语言的出现频率高(瞎说的)。在审计的时候可以这么查看有没有使用到那几个set方法被修复掉,如果没有那么就可以存在XXE。当然也要查看使用的是哪个类进行解析,有没有回显的情况。有回显的话,能不能出网,能出网的话就可以借助dnslog平台进行回显。

最新文章

  1. MFC-01-Chapter01:Hello,MFC---1.2 MFC简介
  2. 重复数据分析的三个常用语法distinct, group by, partition by
  3. HTML5气泡悬浮框(已经加上完整文件)
  4. Java解析文本
  5. WEB 安全之 SQL注入 &lt; 二 &gt; 暴库
  6. BZOJ_1821_[JSOI2010]_部落划分_(贪心,并查集)
  7. SGU 137.Funny String
  8. HTML5 总结-Web存储-7
  9. ST HW3
  10. iOS--通过MOB平台实现第三方登录与分享
  11. 关于EF 通用增删改查的封装
  12. Java IO(四)
  13. Mybatis 系列2
  14. js_1_基本语法
  15. 百度翻译新API C#版在 winform,Asp.Net的小程序
  16. C# 操作Excel加水印
  17. CentOS7:解决Packagekit占用yum问题
  18. 关于存session,cookie还是数据库或者memcache的优劣,部分网上抄录
  19. HDU 1517 A Multiplication Game (SG函数找规律)
  20. CTF-i春秋网鼎杯第二场misc部分writeup

热门文章

  1. packmol建模流程-计算
  2. 两台Linux服务器文件同步
  3. soso官方:基于相关排序的判断
  4. go语言开发入门
  5. GET和POST的本质区别
  6. TextBox控件保存上次的输入
  7. org.xml.sax.SAXParseException: The processing instruction target matching &quot;[xX][mM][lL]&quot; is not allowed(转)
  8. MD5截断比较验证 - 补充
  9. Axios拦截器配置
  10. 【阿里云训练营】python查漏补缺 1