【发布时间】: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