为了防止XXE攻击,我禁用了Java DocumentBuilderFactory - https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet推荐的以下功能。
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);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
如果我不将外部通用实体和外部参数实体设置为 false,是否存在任何漏洞?因为当我们将 disallow-doctype-decl 设置为 true 并将 XIncludeAware 设置为 false 时,它不允许扩展这些外部实体。
从上面的代码中删除这 2 行是否安全 -
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
或者也必须保留它们。如果它是强制性的,如果我们不将它们设置为 false,漏洞是什么?
请提供特定于外部genereal/Parameter-entity的漏洞示例,即使我们将disallow-doctype设置为true,将XIncludeAware设置为false,将ExpandEntityReference设置为false。
保留它们不是强制性的。设置 disallow-doctype-decl
将防止 XXE 攻击,因为不受信任的 XML 中的任何内联DOCTYPE
声明都会导致分析器引发异常。
但是,我建议保持代码原样,因为默认情况下external-general-entities
和external-parameter-entities
为 true。如果这两行不存在,并且后来的维护者(天真地或错误地)删除了第一行,那么代码将再次变得脆弱。将其他行明确地放在那里,使得维护者更有可能在进一步修改时查找这些功能,并希望了解它们为什么存在。