前言
Google CTF 2019[1] 刚过不久,来一波复现~ 吐槽一下公众号的图片上传功能,老是失败,耽误了发文的速度,太令人抓狂了……

题目
题目地址是 https://bnv.web.ctfcompetition.com/

题目描述:
这是一个没有啥好看的 enterprise-ready™ Web应用程序。
搞!
点开链接一看,为什么这么黑……

从网页标题和中间的图片很明显是盲文,结合题目,应该是一个盲人用的网站?
网页中央是说“请使用这个搜索引擎,找一个离你最近的组织”,下拉框有三个城市可选。
先看一下搜索会发生啥吧:


点击提交后,会 POST 搜索接口一条 message,估计是盲文代码?然后返回了相应的信息。
看一下 JavaScript 是怎么写的吧:

数一数 blindvalues 数组,刚好 26 个,猜想是不是字母一一对应捏,打开 Console 验证一下:

跟 message 一模一样!
下一步,先想一想是什么攻击方式。如果该题是 SQL 注入的话,那这题只能使用纯字母,并且忽略大小写,这个有点难整啊…… 使用特殊标点符号 Fuzz 脚本怼一下,好的,一点用都没有。

思来想去,搜到了一个奇妙的渗透手法:基于 Json 的 web 服务也有可能存在着 XXE 注入!试一试提交 XML:

哎嘿?似乎可行?扔一个和提交 Json 相同意义的 XML 试试?
<!ELEMENT message ANY>]><message>135601360123502401401250</message>

哎嘿?似乎成功近在眼前了?赶紧翻 payload……
整了好久,在 Burp 官网上看到了一个比较新颖的使用本地 DTD 读取文件的方法 Exploiting XXE to retrieve data by repurposing a local DTD[2]
这个 payload 主要是利用错误信息来打印目标文件的内容,重新定义了 docbookx.dtd (一般有 Gnome 就有它)里面的 ISOamso。我们提交了这个 payload 之后,当导入本地的 DTD 文件时,会优先执行我们定义的 ISOamso,因此可以达成任意文件读取。
使用该 payload 成功读取:
<!DOCTYPE message [<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"><!ENTITY % ISOamso '<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">%eval;%error;'>%local_dtd;]>

猜一下常见的路径 /flag,对啦✔

总结
算是一道不错的 XXE 利用题目,又学习到了新的利用方式~
References
[1] Google CTF 2019: https://capturetheflag.withgoogle.com[2] Exploiting XXE to retrieve data by repurposing a local DTD: https://portswigger.net/web-security/xxe/blind/lab-xxe-trigger-error-message-by-repurposing-local-dtd


