Veracode XML External Entity Reference (XXE)
我在veracode报告中得到了下一个发现:
XML外部实体引用(\\'XXE \\')限制不当(CWE ID 611)
引用下面的代码bellow
...
1 2 3 4 5 6 7 8 9 10 11 | DocumentBuilderFactory dbf=null; DocumentBuilder db = null; try { dbf=DocumentBuilderFactory.newInstance(); dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); dbf.setExpandEntityReferences(false); dbf.setXIncludeAware(false); dbf.setValidating(false); dbf.newDocumentBuilder(); InputStream stream = new ByteArrayInputStream(datosXml.getBytes()); Document doc = db.parse(stream,""); |
...
我一直在研究,但是我还没有发现这一发现的原因或使其消失的方法。
你能告诉我怎么做吗?
您看过有关XXE的OWASP指南吗?
您没有禁用应禁用的3个功能。最重要的是第一个:
1 2 3 | 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); |
背景:
XXE攻击是围绕XML语言功能构建的,该功能使用外部数据类型定义(DTD)以及读取或执行文件的功能来定义任意实体。
下面是一个包含DTD声明的XML文件的示例,该声明在处理时可能会返回本地" / etc / passwd"文件的输出:
1 2 3 4 | <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE test [ <!ELEMENT test ANY > <!ENTITY xxe SYSTEM"file:///etc/passwd">]> |
缓解措施:
为避免利用XEE漏洞,最好的方法是禁用从外部源加载实体的功能。
现在,禁用DTD的方法将取决于所使用的语言(Java,C,.NET)和所使用的XML解析器(DocumentBuilderFactory,SAXParserFactory,TransformerFactory,仅考虑Java语言)。
以下两个官方参考资料提供了有关如何达到相同目的的最佳信息。
https://rules.sonarsource.com/java/RSPEC-2755
https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.md