现在,很少有xxes具有回声。盲目XXE的重点在于如何传输数据。过去,许多文章可以实现OOB(带外)信息传输,并通过构建DTD从错误信息中获取数据。
无论是上述OOB还是基于错误的方法,都需要毫无例外地引入外部DTD文件。至于为什么引入外部DTD文件,此处已简要提到了许多文章。本文将详细分析这两个盲人XXE的原理,以及为什么需要外部DTD文件。最后,它还发现了一些可以直接完成的情况,而无需引入外部DTD文件(今年可以完成CTF)
以下测试将使用以下PHP代码进行测试。
参数实体
XML DTD可以定义两种实体类型:普通实体和参数实体,这两种类型也可以分别是内部实体和外部实体。 xxe,全名是将漏洞注入XML外部实体。通过外部实体请求本地文件URI并以某种方式返回本地文件内容会导致XXE漏洞。内部实体和外部实体声明之间的区别如下
<!ENTITY 实体名 SYSTEM url > //外部实体<!ENTITY 实体名 实体的值 > //内部实体
Blind XXE需要在DTD约束中使用参数实体。参数实体是只能在DTD中定义和使用的实体。 %标志已定义。定义和使用方法如下。
<message>&normal;message>
此外,参数实体也可以在嵌套中定义,但是应注意的是,内部层中定义的参数实体%html逃脱,否则会发生解析错误。
<message>&normal;message>
盲人xxe
OOB
介绍服务器DTD文件
由于外部实体可以通过请求内部文件URI获得内部文件内容,因此我们可以编写两个外部参数实体。第一个使用文件协议请求本地文件并将内容保存在参数实体中,第二个使用HTTP或FTP协议请求我们自己的服务器并带上文件内容。
可以吗?在本书的第10页“ XML,DTD和“这是不可能的”中,这清楚地说明了这一点。几乎所有XML解析器都不会在同一级别分析参数实体的内容。
但是上面我们还表明,当两个参数实体不在同一级别时,参数实体也可以用嵌套术语定义。让我们尝试称呼它。
如上所述,我们首先调用启动参数实体并生成发送参数实体声明。在“发送参数实体声明”中,调用文件参数实体并请求相关链接。该测试发现中的误差是指参数实体参考(),该参数禁止内部参考参数实体。
正是由于这种限制,我的前任认为,由于内部的限制不好,我想引用外部DTD尝试。现在,将以下DTD文件添加到您的服务器。
xml.dtd
"">%start;
然后请求的数据如下(使用PHP协议编码已发送的数据)
<message>1234message>
成功阅读文件!

参考本地DTD文件
如果目标主机的防火墙非常严格,我们不允许我们要求外部网络服务器DTD?由于XML的广泛使用,一些DTD文件实际上存在于各种系统中。根据上述理论,我们只需要从外部介绍DTD文件并定义其中的某些实体内容即可。
首先,让我们查看系统随附的/usr/share/yelp/dtd/.dtd内容。

它定义了许多参数实体并调用它。因此,实际上,我们可以在内部内部重写DTD文件中包含的参数实体,并且该调用是外部的,因此仍然可以实现。
<message>1234message>
其中,这里是嵌套的三层参数实体。当第二层嵌套时,我们只需要编码定义的参数实体的%,第三层需要根据第二层编码所有%,&,',html。
我们将仔细观察并很好地理解它。称为%的第一个参数实体,在/usr/share/yelp/dtd/.dtd文件中被称为%,以及在定义的实体中连续调用和发送。在此不直接使用两层嵌套的原因是,如果您直接使用两层,则仍会报告一个错误。
基于错误报告的盲人xxe
基于与OOB类似的错误报告原理,OOB通过构造带外URL来提出数据,而基于错误报告,它是构造错误URL并将泄漏的文件内容放入URL中,并以这种方式返回数据。
因此,OOB的构造方法几乎与URL相同,其余的完全相同。
通过介绍服务器文件
xml.dtd
"">%start;
<message>1234message>
通过介绍本地文件
<message>1234message>
重新检查为什么引用外部文件
根据上述语句,似乎必须引用外部文件。 W3中有关于XML协议的段落:
在DTD中,不得发生;它们可能发生在可能发生的地方。 (这不适用于发生在或发生的。)
简短的翻译:在内部DTD集合中,对参数实体的引用在标记的声明中不存在。这不适用于外部参数实体。
这意味着协议本身必须要求内部实体声明中不能引用参数。
CTF BNV
今年的CTF发表了盲目的XXE问题BNV。这个问题的完整WP可以在此处使用。我们只能在此处分析盲目XXE部分。
这个问题可以从错误响应中泄漏信息。因为这个问题无法与外界交流,所以我通过介绍本地DTD文件来考虑并查看他人。不复杂,就像我们上面分析的
<message>10message>
但是我发现,如果我不参考外部DTD文件并直接使用嵌套参数实体,也可以完成此问题。
<message>10message
有趣的发现
我发现,尽管W3C协议不允许引用内部实体声明中的参数实体,但许多XML解析器不能很好地执行此检查。几乎所有XML解析器都可以找到这样的两层嵌套:
<message>10message>
但是,无法检测到使用三层嵌套参数实体构建的一些XML解析器。例如,可以有效地使用PHP7.2 + 2.9.4和PHP5.4 + 2.9.1的两种组合:
<message>10message>
这意味着可以在不参考外部DTD的情况下实现盲目XXE。
参考链接
#wfc--
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1