首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何预防XXE攻击

如何预防XXE攻击
EN

Stack Overflow用户
提问于 2016-11-17 07:39:21
回答 4查看 77.8K关注 0票数 39

我们对我们的代码进行了一次安全审计,它提到我们的代码容易受到XML EXternal实体(XXE)攻击的攻击。

解释 XML外部实体攻击利用XML特性在处理时动态生成文档。XML实体允许动态地包含来自给定资源的数据。外部实体允许XML文档包含来自外部URI的数据。除非配置为其他方式,否则外部实体将强制XML解析器访问URI指定的资源,例如本地机器上的文件或远程系统上的文件。此行为将应用程序暴露于XML外部实体(XXE)攻击,这些攻击可用于执行本地系统的拒绝服务、对本地计算机上的文件进行未经授权的访问、扫描远程计算机和执行远程系统的拒绝服务。 下面的XML文档显示了XXE攻击的一个示例。如果XML解析器试图用/dev/随机文件的内容替换该实体,则此示例可能会使服务器崩溃(在UNIX系统上)。 推荐 应该安全地配置XML解封处理程序,使其不允许外部实体作为传入的XML文档的一部分。 为了避免XXE注入,不要使用直接处理java.io.Filejava.io.Readerjava.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攻击的地方:

代码语言:javascript
复制
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);

如何在代码中实现上述建议?我漏掉了什么东西?

EN

回答 4

Stack Overflow用户

发布于 2017-05-30 09:34:55

您可以在DocumentBuilderFactory中使用相同的方法

代码语言:javascript
复制
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
...

要使每个人都自动使用这一点,您需要创建自己的实现(通过扩展当前使用的实现;使用调试器查找)。在构造函数中设置特性。

然后,您可以将要在系统属性javax.xml.parsers.DocumentBuilderFactory中使用的新工厂传递给Java,每个人都将使用它。

票数 37
EN

Stack Overflow用户

发布于 2018-10-05 09:10:14

请注意,仅使用FEATURE_SECURE_PROCESSING似乎还不够安全(来自blackhat-pdf):

..。尽管有甲骨文的建议,但当启用功能_SECURE_PROCESSING时,XML解析器实际上并不限制外部连接。

OWASP推荐ACCESS_EXTERNAL_DTD和ACCESS_EXTERNAL_STYLESHEET。

这将使:

代码语言:javascript
复制
TransformerFactory trfactory = TransformerFactory.newInstance();
trfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

实际上,这个问题是:如何防止TransformerFactory外部实体注入的重复。

票数 19
EN

Stack Overflow用户

发布于 2018-06-29 07:01:37

由于市场上有大量的xml解析引擎,防止XXE攻击的方法因引擎而异。请参阅您的引擎文件。这里的基础是防止外部DOCTYPE声明。如果需要外部DOCTYPE声明,则禁用外部通用实体和外部参数实体将防止对代码的XXE攻击。下面是在使用SAX解析器时防止XXE的示例代码。

代码语言:javascript
复制
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;
 }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40649152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档