【发布时间】:2017-03-31 15:44:43
【问题描述】:
我们对代码进行了安全审计,其中提到我们的代码容易受到 XML 外部实体 (XXE) 攻击。
说明
XML 外部实体攻击受益于在处理时动态构建文档的 XML 特性。一个 XML entity 允许动态地包含来自给定资源的数据。外部实体允许 XML 文档包含数据 来自外部 URI。除非另外配置,否则外部实体会强制 XML 解析器访问指定的资源 通过 URI,例如,本地计算机或远程系统上的文件。此行为将应用程序暴露给 XML External 实体 (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 文件。
推荐
应该安全地配置 XML 解组器,以使其不允许外部实体作为传入 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 攻击的地方:
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
System.out.println("outputing to : " + outputLocation);
File outputFile = new File(outputLocation);
StreamResult result = new StreamResult(outputFile);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
如何在我的代码中实施上述建议?我在哪里漏掉了东西?
【问题讨论】:
-
OWASP 有更多建议,有很好的说明,不仅适用于 Java:owasp.org/index.php/…
标签: java xml xml-parsing transform