Veracode XML外部实体参考(XXE)

时间:2015-06-22 11:29:37

标签: java veracode xxe

我在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, "");  

...

我一直在研究,但我还没有找到这个发现的理由或者让它消失的方法。 你能告诉我怎么做吗?

2 个答案:

答案 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语言)。

以下两个官方参考资料提供了有关如何达到相同目的的最佳信息。

https://rules.sonarsource.com/java/RSPEC-2755

https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.md