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

配置的XML解析器不会阻止或限制外部实体解析。这会使解析器受到XML外部实体攻击

百里涛
2023-03-14

我们对我们的代码进行了安全审计,他们提到我们的代码容易受到外部实体(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。文件,java。io。读卡器或java。io。输入流。使用安全配置的解析器解析文档,并使用unmarshal方法

解析器作为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攻击。请帮助我如何解决上述问题。感谢任何人的帮助!

共有2个答案

唐炳
2023-03-14

对于javax。xml。解析器。DocumentBuilderFactory,以下设置足以防止XXE攻击

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// Disallow the DTDs (doctypes) entirely.
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);   

// Or do the following:
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
公孙高轩
2023-03-14

有关补救的详细说明和选项,我建议您查看OWASP XEE备忘单

我们提出了一个类似的问题,并通过禁用DOCTYPES(上面链接的第一个建议)来解决它,因为我们不需要它们:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
 类似资料:
  • 我每次都会再次遇到这个错误,尽管我将代码更改为我在网上找到的代码,如下所示:

  • 当我在此程序上运行HP Fortify时: 我得到这个错误: 在ItemServlet中配置的XML解析器。92不会阻止或限制外部实体的解析。这会使解析器受到XML外部实体攻击。 根据这个博客,应该设置以下功能。 但问题是,我的TransformerFactory实例不支持这种方法。

  • 我试图确定.NET核心应用程序是否容易受到XML外部实体(XXE)注入攻击。我读了这个OWASP XXE预防备忘单,它告诉我,例如,在4.5.2之前的.NET Framework版本中,

  • 我在一个函数中使用上面的代码来加载一个XML文件。功能方面,它的工作良好,但它是显示以下Veracode缺陷后Veracode检查。 将XML解析器配置为禁用外部实体解析。 我需要做什么来解决它。

  • 问题内容: 我目前正在使用DOM解析器来解析XHTML文档,例如: 我的问题是,当我的文档包含一个实体引用时,例如: 我的解析器为包含“€”而不是“&euro;”的内容创建了一个Text节点。这就是说,它正在按预期的方式解析实体(XHTML 1.0 Strict DTD链接到ENTITIES Latin1 DTD,这反过来确定了“&euro;”与“€”的对等)。 问题是,我不希望解析器执行此类操作

  • 请给我一个提示,为什么我的代码不容易受到XXE的攻击。 代码: 测试用例1: 结果1: 到现在为止,一直都还不错。但是,当我尝试注入XML代码以检索本地文件的内容时: 然后什么都不打印。“test.txt”在文件结构中与我执行攻击的php文件处于同一级别。我已经尝试过了 以及 但无济于事。 test.txt: 已尝试: 没有结果。 有什么提示吗? 反映保罗·克罗维拉,这里有一个编辑: CP-ing