我们对我们的代码进行了一次安全审计,它提到我们的代码容易受到XML EXternal实体(XXE)攻击的攻击。
解释 XML外部实体攻击利用XML特性在处理时动态生成文档。XML实体允许动态地包含来自给定资源的数据。外部实体允许XML文档包含来自外部URI的数据。除非配置为其他方式,否则外部实体将强制XML解析器访问URI指定的资源,例如本地机器上的文件或远程系统上的文件。此行为将应用程序暴露于XML外部实体(XXE)攻击,这些攻击可用于执行本地系统的拒绝服务、对本地计算机上的文件进行未经授权的访问、扫描远程计算机和执行远程系统的拒绝服务。 下面的XML文档显示了XXE攻击的一个示例。如果XML解析器试图用/dev/随机文件的内容替换该实体,则此示例可能会使服务器崩溃(在UNIX系统上)。 推荐 应该安全地配置XML解封处理程序,使其不允许外部实体作为传入的XML文档的一部分。 为了避免XXE注入,不要使用直接处理
java.io.File、java.io.Reader或java.io.InputStream等XML源的解组方法。使用安全配置的解析器解析文档,并使用以安全解析器为XML源的解组方法,如下面的示例所示: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);DocumentBuilder db = dbf.newDocumentBuilder();Document = db.parse();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);如何在代码中实现上述建议?我漏掉了什么东西?
发布于 2017-05-30 09:34:55
您可以在DocumentBuilderFactory中使用相同的方法
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
...要使每个人都自动使用这一点,您需要创建自己的实现(通过扩展当前使用的实现;使用调试器查找)。在构造函数中设置特性。
然后,您可以将要在系统属性javax.xml.parsers.DocumentBuilderFactory中使用的新工厂传递给Java,每个人都将使用它。
发布于 2018-10-05 09:10:14
请注意,仅使用FEATURE_SECURE_PROCESSING似乎还不够安全(来自blackhat-pdf):
..。尽管有甲骨文的建议,但当启用功能_SECURE_PROCESSING时,XML解析器实际上并不限制外部连接。
OWASP推荐ACCESS_EXTERNAL_DTD和ACCESS_EXTERNAL_STYLESHEET。
这将使:
TransformerFactory trfactory = TransformerFactory.newInstance();
trfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");实际上,这个问题是:如何防止TransformerFactory外部实体注入的重复。
发布于 2018-06-29 07:01:37
由于市场上有大量的xml解析引擎,防止XXE攻击的方法因引擎而异。请参阅您的引擎文件。这里的基础是防止外部DOCTYPE声明。如果需要外部DOCTYPE声明,则禁用外部通用实体和外部参数实体将防止对代码的XXE攻击。下面是在使用SAX解析器时防止XXE的示例代码。
public class MyDocumentBuilderFactory {
public static DocumentBuilderFactory newDocumentBuilderFactory() {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
try {
documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities",false);
documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities",false)
} catch(ParserConfigurationException exp){
exp.printStackTrace();
}
return documentBuilderFactory;
}
}https://stackoverflow.com/questions/40649152
复制相似问题