我在veracode报告中得到了下一个发现: XML外部实体参考的不正确限制(' XXE')(CWE ID 611) 参考下面的代码
...
> 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); db =
> dbf.newDocumentBuilder();
> InputStream stream = new ByteArrayInputStream(datosXml.getBytes());
> Document doc = null; doc= db.parse(stream, "");
...
我一直在研究,但我还没有找到这个发现的理由或者让它消失的方法。 你能告诉我怎么做吗?
答案 0 :(得分:7)
你见过the OWASP guide about XXE吗?
您没有禁用应禁用的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);
答案 1 :(得分:1)
背景:
XXE攻击是围绕XML语言功能构建的,该功能使用外部数据类型定义(DTD)以及读取或执行文件的功能来定义任意实体。
下面是一个包含DTD声明的XML文件的示例,该DTD声明在处理后可能会返回本地“ / etc / passwd”文件的输出:
<?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语言)。
以下两个官方参考资料提供了有关如何达到相同目的的最佳信息。