【问题标题】:XML parser configured does not prevent nor limit external entities resolution. This can expose the parser to an XML External Entities attack配置的 XML 解析器不会阻止也不会限制外部实体解析。这会将解析器暴露给 XML 外部实体攻击
【发布时间】:2017-04-04 13:24:45
【问题描述】:

我们对我们的代码进行了安全审计,他们提到我们的代码容易受到外部实体 (XXE) 攻击。

说明- XML 外部实体攻击受益于 XML 功能,可在处理时动态构建文档。 XML 实体允许动态地包含来自给定资源的数据。外部实体允许 XML 文档包含来自外部 URI 的数据。除非另有配置,否则外部实体会强制 XML 解析器访问由 URI 指定的资源,例如本地机器或远程系统上的文件。此行为将应用程序暴露于 XML 外部实体 (XXE) 攻击,这些攻击可用于执行本地系统的拒绝服务、未经授权访问本地计算机上的文件、扫描远程计算机以及执行远程系统的拒绝服务.以下 XML 文档显示了 XXE 攻击的示例。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>

如果 XML 解析器尝试用 /dev/random 文件的内容替换实体,则此示例可能会导致服务器崩溃(在 UNIX 系统上)。

建议 - XML unmarshaller 应该被安全地配置,以便它不允许外部实体作为传入 XML 文档的一部分。为避免 XXE 注入,请勿使用将 XML 源直接作为 java.io.File、java.io.Reader 或 java.io.InputStream 处理的解组方法。使用安全配置的解析器解析文档,并使用采用安全的解组方法

解析器作为 XML 源,如下例所示:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(<XML Source>);
Model model = (Model) u.unmarshal(document);

编写的代码在下面发现 XXE 攻击的地方-

1- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2- DocumentBuilder db = dbf.newDocumentBuilder();
3- InputSource is = new InputSource();
4- is.setCharacterStream(new StringReader(xml));
5-
6- Document doc = db.parse(is);
7- NodeList nodes = doc.getElementsByTagName(elementsByTagName);
8-
9- return nodes;

我在第 6 行受到 XXE 攻击。 请帮助我如何解决上述问题。感谢任何人的帮助!

【问题讨论】:

    标签: java security serialization deserialization transform


    【解决方案1】:

    对于 javax.xml.parsers.DocumentBuilderFactory,以下设置足以防止 XXE 攻击

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    
    // Disallow the DTDs (doctypes) entirely.
    dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);   
    
    // Or do the following:
    dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
    dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
    dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
    dbf.setXIncludeAware(false);
    dbf.setExpandEntityReferences(false);
    

    【讨论】:

      【解决方案2】:

      有关修复的详细说明和选项,我建议您查看OWASP XEE Cheat Sheet

      我们提出了一个类似的问题,并通过禁用 DOCTYPES(上面链接中的第一个建议)解决了它,因为我们不需要它们:

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
      

      【讨论】:

        猜你喜欢
        • 2017-09-09
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-13
        相关资源
        最近更新 更多