当前位置: 首页 > 知识库问答 >
问题:

如何防止XXE攻击

孔永年
2023-03-14

我们对代码进行了安全审计,它提到我们的代码容易受到XML外部实体(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解组器,以便它不允许外部实体作为传入XML文档的一部分。

为了避免XXE注入,不要使用散集方法将XML源直接处理为java.io.Filejava.io.Readerjava.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);

如何在我的代码中实现上述建议?我错过了什么?

共有3个答案

景永春
2023-03-14

由于市场上有大量的xml解析引擎,防止XXE攻击的方法因引擎而异。请参考您的引擎留档。这里的funda是防止外部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;
 }
}
涂煌
2023-03-14

请注意,单独使用FEATURE_SECURE_PROCESSING似乎不够安全(来自Blackhat-pdf):

。。。尽管Oracle建议XML解析器在启用功能\u SECURE\u PROCESSING时实际上不会限制外部连接。

OWASP建议使用ACCESS\u EXTERNAL\u DTD和ACCESS\u EXTERNAL\u样式表。

这将使:

TransformerFactory trfactory = TransformerFactory.newInstance();
trfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

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

巫马望
2023-03-14

您可以对DocumentBuilderFactory使用相同的方法:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
...

要让每个人都自动使用它,您需要创建自己的实现(通过扩展当前使用的实现;使用调试器来找到)。在构造函数中设置功能。

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

 类似资料:
  • 问题内容: 最近,我们对代码进行了安全审核,问题之一是我们的应用程序受到 Xml eXternal Entity (XXE)攻击。 基本上,该应用程序是一个计算器,可通过Web服务以XML形式接收输入。 这是对我们的应用程序进行此类XXE攻击的示例: 如您所见,我们可以引用指向外部文件()的实体。 关于XML输入本身(该部分)未与JAXB(v2.1)一起编组。Web服务部分基于jaxws- rt(

  • 想知道如何使用Xstream API修复Xml外部实体(XXE)漏洞。 就像我们能做的一样 使用DocumentBuilderFactory。更多详细信息-https://www.owasp.org/index.php/XML_External_Entity_(XXE)\u预防\u备忘单 我的代码是这样的-

  • 本文向大家介绍如何防止XSS攻击?相关面试题,主要包含被问及如何防止XSS攻击?时的应答技巧和注意事项,需要的朋友参考一下 (1) 将前端输出数据都进行转义 (2) 将输出的字符串中的\反斜杠进行转义 (3) 从url中获取的信息,防止方法是由后端获取,在前端转义后再行输出 (4) 使用cookie的HttpOnly属性,保护好cookie 详细参见:http://blog.csdn.net/fe

  • 我读过关于CSRF和不可预测的同步令牌模式是如何用来防止它的。我不太明白它是如何工作的。 让我们以这个场景为例: 用户使用以下表单登录到站点: 服务器还将令牌存储在会话中。发送请求时,它将表单数据中的令牌与会话中的令牌进行比较。 当黑客可以编写JavaScript代码时,如何防止CSRF: 发送GET请求到站点 接收包含请求表单的html文本。 在html文本中搜索CSRF令牌。 使用该令牌发出恶

  • 本文向大家介绍Django如何实现防止XSS攻击,包括了Django如何实现防止XSS攻击的使用技巧和注意事项,需要的朋友参考一下 一、什么是XSS攻击 xss攻击:----->web注入   xss跨站脚本攻击(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。   我们常常听到“注入”(Injection),如SQL

  • 我需要修复XXE问题。我在代码中使用transformerfactory。在下面找到修复程序,但我在代码中看不到ACCESS\u EXTERNAL\u DTD属性。我得到的原因是以下代码将适用于Java7,但我使用的是Java 6。能否有人建议其他修复方法来保护Java TransformerFactory免受XXE攻击,请执行以下操作: