7

我在我的 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); 
        dbf.newDocumentBuilder();   
        InputStream stream = new ByteArrayInputStream(datosXml.getBytes());
        Document doc = db.parse(stream, "");            

...

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

4

2 回答 2

9

你看过关于 XXE 的 OWASP 指南吗?

您没有禁用应该禁用的 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);
于 2015-07-09T08:39:44.230 回答
1

背景:

XXE 攻击是围绕 XML 语言功能构建的,以使用外部数据类型定义 (DTD) 和读取或执行文件的能力定义任意实体。

下面是一个包含 DTD 声明的 XML 文件示例,在处理该声明时可能会返回本地“/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

于 2020-11-04T15:01:24.237 回答