关于java:Veracode XML外部实体参考(XXE)

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