在之前XXE漏洞了解得并很少,只是有一个初步的认识和靶机里面遇到过。下面来 深刻了解一下该漏洞的产生和利用。java
当程序在解析XML输入时,容许引用外部实体,致使可以引用一个外部恶意文件,可致使执行系统命令,内网端口检测,文件读取,攻击内网服务,dos攻击等。node
在解析外部实体的过程当中,XML解析器能够根据URL中指定的方案(协议)来查询各类网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中建立动态引用很是有用,这样对引用资源所作的任何更改都会在文档中自动更新。 可是,在处理外部实体时,能够针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各类方案的网络访问功能来操纵内部应用程序。 经过将这些攻击与其余实现缺陷相结合,这些攻击的范围能够扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。git
具体利用方式参考: 一篇文章带你深刻理解漏洞之 XXE 漏洞github
其实说白了,也仍是在web应用中接受而且解析xml的时候容许引用外部的实体。web应用中须要解析的xml,须要是可控的。web
那么先来看看漏洞产生的代码,前面原本想着是本身去写一个XXE的漏洞代码,可是发现写的时候报各类错,参考其余文章的代码,调试半天仍是报错。因此这里就借用JoyChou师傅开源的Java Sec Code项目上来作一个演示。apache
项目地址:https://github.com/JoyChou93/java-sec-code/网络
DocumentBuilder类是JDK自带的类,在该类解析产生的XXE漏洞是有回显的。app
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是第三方的库,该类是无回显的dom
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; }
第三方库ui
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;
该类也是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; } }
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; }
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";
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);
本文做为一个记录文,在Java中能解析XXE的类会比较多。由于在Java中配置文件会频繁的使用到XML文件或是数据传输。致使XXE漏洞可能会比其余语言的出现频率高(瞎说的)。在审计的时候能够这么查看有没有使用到那几个set方法被修复掉,若是没有那么就能够存在XXE。固然也要查看使用的是哪一个类进行解析,有没有回显的状况。有回显的话,能不能出网,能出网的话就能够借助dnslog平台进行回显。