XML外部实体注入(XXE注入)-9个实验(全)
前言:
介绍:
博主:网络安全领域狂热爱好者。
殊荣:华为云博主、CSDN网络安全领域优质创作者(CSDN:黑色地带(崛起)),2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edusrc高白帽,vulfocus、攻防世界等平台排名100+、高校漏洞证书、cnvd原创漏洞证书等。
擅长:对于技术、工具、漏洞原理、黑产打击的研究。
导读:
面向读者:对于网络安全方面的学者。
本文知识点:
(1)利用XXE检索文件(√)
(2)利用XXE进行SSRF攻击(√)
(3)盲XXE漏洞(√)
(4)查找XXE注入的隐藏攻击面(√)
(5)查找和测试XXE漏洞(√)
目录
一、XML外部实体(XXE)注入
1、简述:
1、XML外部实体注入(也称为XXE)是一个Web安全漏洞,使得攻击者能够干扰应用程序对XML数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
2、在某些情况下,攻击者可以利用XXE漏洞执行攻击,从而升级XXE攻击,危害底层服务器或其他后端基础架构服务器端请求伪造(SSRF)攻击。
2、产生
1、某些应用程序使用XML格式在浏览器和服务器之间传输数据。这样做的应用程序实际上总是使用标准库或平台API来处理服务器上的XML数据。XXE漏洞的出现是因为XML规范包含各种潜在的危险特性,而标准解析器支持这些特性,即使应用程序通常不使用这些特性。
2、XML外部实体是一种自定义XML实体,其定义值从声明它们的DTD外部加载。从安全性的角度来看,外部实体特别重要,因为它们允许基于文件路径或URL的内容定义实体。
3、XXE攻击类型
二、利用XXE检索文件
1、简述:
1、要执行从服务器文件系统检索任意文件的XXE注入攻击,需要以两种方式修改提交的XML:
2、对于现实世界中的XXE漏洞,提交的XML中通常会有大量的数据值,其中任何一个都可能在应用程序的响应中使用。要系统地测试XXE漏洞,通常需要单独测试XML中的每个数据节点,方法是使用定义的实体并查看它是否出现在响应中。
3、如购物应用程序通过向服务器提交以下XML来检查产品的库存水平:
若应用程序对XXE攻击不执行任何特定的防御,因此可以通过提交以下XXE有效负载来利用XXE漏洞检索/etc/passwd文件:
此XXE有效负载定义外部实体&xxe,其值为/etc/passwd文件中的实体并使用产品ID值。这将导致应用程序的响应包含文件的内容:
4、涉及实验:
实验1:利用XXE使用外部实体检索文件
实验1:利用XXE使用外部实体检索文件
信息:
本实验有一个“Check stock”特性,它解析XML输入并在响应中返回任何意外值。
要解决实验:注入一个XML外部实体来检索/etc/passwd文件的内容
part1:
访问一个产品页面,点击"检查库存",并在Burp Suite中拦截由此产生的POST请求,发送到repeater
part2:
XXE注入
在XML声明和stockCheck元素之间插入以下外部实体定义:
将productId编号替换为对外部实体的引用:
响应应包含"Invalid product ID:",后跟/etc/passwd文件的内容
三、利用XXE进行SSRF攻击
1、简述:
1、除了检索敏感数据之外,XXE攻击的另一个主要影响是它们可用于执行服务器端请求伪造SSRF。这是一个潜在的严重漏洞,可诱使服务器端应用程序向服务器可以访问的任何URL发出HTTP请求。
2、要利用XXE漏洞执行SSRF攻击,需要使用要攻击的URL定义外部XML实体,并在数据值中使用定义的实体。如果可以在应用程序响应中返回的数据值中使用定义的实体,那么将能够从应用程序响应中的URL查看响应,从而获得与后端系统的双向交互。如果没有,那么将只能进行SSRF的盲攻击
3、XXE示例:外部实体将导致服务器向组织基础架构中的内部系统发出后端HTTP请求:
4、涉及实验:
实验2:利用XXE进行SSRF攻击
实验2:利用XXE进行SSRF攻击
信息:
本实验有一个"Check stock"特性,它解析XML输入并在响应中返回任何意外值
实验室服务器在默认URL(www.example.com)上运行(模拟的)EC2元数据端点http://169.254.169.254/。此终结点可用于检索有关实例的数据,其中一些数据可能是敏感的
解决实验:利用XXE漏洞执行SSRF攻击,从EC2元数据端点获取服务器的IAM秘密访问密钥
part1:
访问一个产品页面,点击"检查库存",并在Burp Suite中拦截由此产生的POST请求,并发送到repeater
part2:
XXE注入
在XML声明和stockCheck元素之间插入以下外部实体定义:
将 productId 号替换为对外部实体的引用:
响应应包含"Invalid product ID:",后跟来自元数据端点的响应,该响应最初将是文件夹名称
part3:
完成实验
迭代更新DTD中的URL以浏览API,直接到达这应该返回包含SecretAccessKey的JSON
四、盲XXE漏洞
1、简述(查找和利用隐蔽的XXE漏洞):
1、XXE漏洞的许多实例是盲目的。这意味着应用程序不会在其响应中返回任何已定义的外部实体的值,因此不可能直接检索服务器端文件。
2、盲XXE漏洞仍然可以检测和利用,但需要更先进的技术。有时可以使用带外技术来查找漏洞,并利用它们来泄漏数据。有时候,可能会触发XML解析错误,从而导致在错误消息中泄漏敏感数据。
2、XXE盲注
1、Blind XXE漏洞出现在应用程序易受攻击的地方XXE注射液但不在其响应内返回任何定义的外部实体的值。这意味着直接检索服务器端文件是不可能的,因此盲XXE通常比常规XXE漏洞更难被利用。
3、使用带外技术
1、通常可以使用与XXE SSRF攻击相同的技术来检测XXE盲注,但会触发与控制的系统的带外网络交互。
此XXE攻击使服务器向指定URL发出后端HTTP请求。攻击者可以监视生成的DNS查找和HTTP请求,从而检测到XXE攻击成功。
————2、涉及实验:
实验3:带外交互的盲XXE
3、一般使用常规实体的XXE攻击会被阻止,因为应用程序进行了一些输入验证,或者使用的XML解析器进行了一些加固。在这种情况下,可以改用XML参数实体。
XML参数实体是一种特殊类型的XML实体,只能在DTD中的其他位置引用
1)XML参数实体的声明在实体名称前包含百分比字符:
2)使用%百分比字符而不是通常的&号引用参数实体:
3)XML参数实体使用带外检测来测试盲XXE:
此XXE有效负载声明一个名为xxe然后使用DTD中的实体。这将导致向攻击者的域发出DNS查找和HTTP请求,从而验证攻击是否成功
————
4、涉及实验:
实验4:通过XML参数实体进行带外交互的盲XXE
实验3:带外交互的盲XXE
信息:
本实验有一个"Check stock"(检查库存)功能,该功能可以解析XML输入,但不显示结果。
可以通过触发与外部域的带外交互来检测隐蔽XXE漏洞。
解决实验:使用外部实体使XML解析器向Burp Collaborator发出DNS查找和HTTP请求
part1:
访问一个产品页面,点击"检查库存",并使用BP拦截产生的POST请求,并发送到repeater
part2:
XXE注入
BP---BC客户端---“Copy to clipboard”负载复制到剪贴板(客户端窗口保持打开状态)
在XML声明和stockCheck元素之间插入以下外部实体定义
将productId编号替换为对外部实体的引用:
转到Collaborator选项卡,刷新看到一些DNS和HTTP交互,这些交互是应用程序由于负载而启动的
实验4:通过XML参数实体进行带外交互的盲XXE
信息:
本实验有一个“Check stock”功能,该功能可以解析XML输入,但不会显示任何意外值,并阻止包含常规外部实体的请求
解决实验:使用一个参数实体使XML解析器向Burp Collaborator发出DNS查找和HTTP请求
part1:
访问一个产品页面,点击"检查库存",并使用BP拦截产生的POST请求,并发送到repeater
part2:
XXE注入
BP---BC客户端---“Copy to clipboard”负载复制到剪贴板(客户端窗口保持打开状态)
在XML声明和stockCheck元素之间插入以下外部实体定义
转到Collaborator选项卡,刷新看到一些DNS和HTTP交互,这些交互是应用程序由于负载而启动的
4、利用盲XXE将数据渗透到带外
1、通过带外技术检测一个隐蔽的XXE漏洞是非常好的,但它实际上并不能证明该漏洞是如何被利用的。攻击者真正想要实现的是泄露敏感数据。这可以通过隐蔽的XXE漏洞实现,但它涉及攻击者在其控制的系统上托管恶意DTD,然后从带内XXE有效负载内调用外部DTD。
2、然后攻击者必须在他们控制的系统上托管恶意DTD,通常是将其加载到自己的Web服务器上。
3、最后攻击者必须向易受攻击的应用程序提交以下XXE有效负载:
4、这个XXE有效负载声明了一个名为xxe的XML参数实体,然后在DTD中使用该实体。这将导致XML解析器从攻击者的服务器获取外部DTD并内联解释它。然后执行恶意DTD中定义的步骤,并将/etc/passwd文件传输到攻击者的服务器。
5、此技术可能不适用于某些文件内容,包括/etc/passwd文件中包含的换行符。因为一些XML解析器使用API来获取外部实体定义中的URL,该API验证允许出现在URL中的字符。在这种情况下,可以使用FTP协议代替HTTP。有时无法过滤包含换行符的数据,因此可以将目标改为/etc/hostname之类的文件
6、涉及实验:
实验5:利用XXE盲注使用恶意外部DTD泄漏数据
实验5:利用XXE盲注使用恶意外部DTD泄漏数据
信息:
本实验有一个"Check stock"(检查库存)功能,该功能可以解析XML输入,但不显示结果。
要解决实验问题,请将/etc/hostname文件的内容导出。
part1:
访问一个产品页面,点击"检查库存",并使用BP拦截产生的POST请求,并发送到repeater
part2:
上传DTD文件
BP---BC客户端---“Copy to clipboard”负载复制到剪贴板(客户端窗口保持打开状态)
单击"Go to exploit server"(转到利用漏洞服务器)并将恶意DTD文件保存在您的服务器上。
单机Store上传到服务器(本人测试,后缀加不加DTD都可以被识别出来)
单击"view exploit"并记下URL(直接上传后有显示)
part3:
XXE注入
在XML声明和stockCheck元素之间插入以下外部实体定义:
part4
完成实验
转到Collaborator选项卡,刷新看到一些DNS和HTTP交互,这些交互是应用程序由于负载而启动的
HTTP交互可以包含/etc/hostname文件的内容
5、利用盲态XXE通过错误消息检索数据
1、利用盲XXE的另一种方法是触发XML解析错误,其中错误消息包含希望检索的敏感数据。如果应用程序在其响应中返回结果错误消息,则此操作将有效。
2、调用恶意的外部DTD将导致出现如下错误消息:
3、涉及实验:
实验6:利用盲态XXE通过错误消息检索数据
实验6:利用盲态XXE通过错误消息检索数据
信息:
本实验有一个"Check stock"(检查库存)功能,该功能可以解析XML输入,但不显示结果。
解决实验:使用外部DTD触发错误消息,以显示/etc/passwd文件的内容。
本实验包含一个链接,该链接指向可托管恶意DTD的其他域中的漏洞攻击服务器。
part1:
访问一个产品页面,点击"检查库存",并使用BP拦截产生的POST请求,并发送到repeater
part2:
上传DTD文件
单击"Go to exploit server"(转到利用漏洞服务器)并将恶意DTD文件保存在您的服务器上。
单机Store上传到服务器(本人测试,后缀加不加DTD都可以被识别出来)
单击"view exploit"并记下URL(直接上传后有显示)
part3:
XXE注入
在XML声明和stockCheck元素之间插入以下外部实体定义:
看到一条错误消息,其中包含/etc/passwd文件的内容
6、通过改变本地DTD的用途来利用盲XXE
1、前面的技术可以很好地用于外部DTD,但通常不能用于在文件
DOCTYPE
元素。因为该技术涉及在另一个参数实体的定义中使用XML参数实体。根据XML规范,这在外部DTD中是允许的,但在内部DTD中不允许。(大多数解析器不会允许)
2、当带外交互被阻止时,不能通过带外连接泄漏数据,也不能从远程服务器加载外部DTD。在这种情况下,由于XML语言规范中的漏洞,仍然可能触发包含敏感数据的错误消息。如果文档的DTD混合使用内部和外部DTD声明,则内部DTD可以重定义在外部DTD中声明的实体。当发生这种情况时,对在另一个参数实体的定义中使用XML参数实体的限制就会放松
3、意味着攻击者可以使用基于误差的XXE技术(error-based XXE ),前提是它们使用的XML参数实体是重新定义在外部DTD中声明的实体。当然,如果阻塞了带外连接,则无法从远程位置加载外部DTD。相反,它需要是应用程序服务器本地的外部DTD文件。从本质上讲,攻击涉及调用一个碰巧存在于本地文件系统上的DTD文件,并重新调整其用途,以触发包含敏感数据的解析错误的方式重新定义现有实体。
4、例如,假设服务器文件系统上的以下位置有一个DTD文件/usr/local/app/schema.dtd,并且此DTD文件定义了一个名为custom_entity。
5、查找要重新使用的现有DTD文件
由于这种XXE攻击涉及到改变服务器文件系统上现有DTD的用途,因此关键的要求是找到合适的文件。这其实很简单。因为应用程序返回XML解析器抛出的任何错误消息,所以只需尝试从内部DTD中加载本地DTD文件,就可以轻松地枚举这些文件。
在测试了公用DTD文件列表以定位存在的文件后,需要获取该文件的副本并对其进行审阅以查找可重定义的图元。由于许多包含DTD文件的常用系统都是开放源代码的,因此通常可以通过Internet搜索快速获得文件的副本
6、涉及实验:
实验9:利用XXE通过改变本地DTD的用途来检索数据
实验9:利用XXE通过改变本地DTD的用途来检索数据
信息:
本实验有一个"Check stock"(检查库存)功能,该功能可以解析XML输入,但不显示结果。
解决实验:请触发包含/etc/passwd文件内容的错误消息。
需要引用服务器上现有的DTD文件,并从中重新定义实体
使用GNOME桌面环境的系统通常在/usr/share/yelp/dtd/docbookx.dtd有一个DTD,其中包含一个名为ISOamso的实体。
part1:
访问一个产品页面,点击“检查库存”,并在Burp Suite中拦截由此产生的POST请求。
part2:
XXE注入
这将导入Yelp DTD,然后重新定义ISOamso实体,触发包含/etc/passwd文件内容的错误消息
五、查找XXE注入的隐藏攻击面
1、简述:
XXE注入漏洞的攻击面在许多情况下是显而易见的,因为应用程序的正常HTTP通信量包括含有XML格式数据的请求。在其他情况下,攻击面不太明显。但如果在正确的地方查看,会发现XXE攻击出现在不包含任何XML的请求中
2、XInclude攻击
1、一些应用程序接收客户端提交的数据,在服务器端将其嵌入到XML文档中,然后解析该文档。当客户端提交的数据被放入后端SOAP请求中,然后由后端SOAP服务处理时,就会出现这种情况。
2、在这种情况下,不能执行典型的XXE攻击,因为不能控制整个XML文档,因此不能定义或修改文件DOCTYPE元素。但也许可以使用XInclude替代。XInclude是XML规范的一部分,它允许从子文档构建XML文档。可以放置一个XInclude XML文档中的任何数据值内的攻击,因此在仅控制放置在服务器端XML文档中的单个数据项的情况下可以执行攻击
3、要执行 XInclude 攻击,需要引用 XInclude 命名空间并提供希望包含的文件的路径。
4、涉及实验:
实验7:利用XInclude检索文件
实验7:利用XInclude检索文件
信息:
1、本实验有一个“Check stock”特性,它将用户输入嵌入到服务器端XML文档中,然后解析该文档。
2、因为不能控制整个XML文档,所以不能定义DTD来发起典型的XXE攻击。
3、完成实验:插入XInclude语句以检索/etc/passwd文件的内容。
4、默认情况下,XInclude会尝试将包含的文档解析为XML。由于/etc/passwd不是有效的XML,因此需要向XInclude指令添加一个额外的属性来更改此行为。
part1:
访问一个产品页面,点击"检查库存",并在Burp Suite中拦截由此产生的POST请求,并发送到repeater
part2:
XXE注入
将productId参数的值设置为(storeid的参数测试行不通)
3、通过文件上传进行XXE攻击
1、一些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用XML或包含XML子组件。基于XML的格式的例子有DOCX这样的办公文档格式和SVG这样的图像格式。
2、如应用程序可能允许用户上载图像,并在上载后在服务器上处理或验证这些图像。即使应用程序希望接收PNG或JPEG之类的格式,所使用的图像处理库也可能支持SVG图像。由于SVG格式使用XML,攻击者可以提交恶意SVG图像,从而到达XXE漏洞的隐藏攻击面。
3、涉及实验:
实验8:通过图像文件上传利用XXE
实验8:通过图像文件上传利用XXE
信息:
本实验允许用户将头像附加到评论中,并使用Apache Batik库处理头像图像文件。
完成实验:上载一个映像,其中显示处理后的/etc/hostname文件的内容。然后使用“Submit solution”按钮提交服务器主机名的值。
part1:
创建包含以下内容的本地SVG图像:
part2:
在博客文章上发表评论,并将此图像作为头像上传
当查看评论时,应该会在映像中看到/etc/hostname文件的内容
使用“Submit solution”按钮提交服务器主机名的值
4、通过修改内容类型的XXE攻击
1、大多数POST请求使用由HTML表单生成的默认内容类型,例如application/x-www-form-urlencoded。有些网站希望接收这种格式的请求,但也会容忍其他内容类型,包括XML。
如果应用程序允许在消息正文中包含XML的请求,并将正文内容解析为XML,那么只需将请求重新格式化为使用XML格式,就可以到达隐藏的XXE攻击面。
六、查找和测试XXE漏洞
1、简述:
1、绝大多数XXE漏洞都可以使用Burp Suite的Web漏洞扫描程序
2、XML只是一种数据传输格式。确保您还测试了任何基于XML的功能的其他漏洞,如XSS和SQL注入。您可能需要使用XML转义序列对有效负载进行编码,以避免破坏语法,但您也可以使用此序列来混淆攻击,以绕过薄弱的防御。
- 点赞
- 收藏
- 关注作者
评论(0)