在之前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平臺進行回顯。