在网页里随便点点看看,在city的下拉框里选择一个城市,点击submit会有不同的回显,没发现什么有用的地方,放dirsearch扫也没有什么隐藏目录
这里看到它会给api/search发送post请求,发送的数据是json数据,这串数据的具体含义后来了解到是我们在盲文点上所选择的城市的代表,具体的可以去下面这个网址查看:
https://www.pharmabraille.com/pharmaceutical-braille/the-braille-alphabet/
当然,这些数据的含义了解与否与这道题没有太大的关系,大佬说过有json数据的地方可能存在xxe,这是一道XXE的题目,之前正好不是很了解XXE,可以借此机会学习一下。
因为这次要不断修改发送包的内容,所以选择了使用POSTMAN这个工具。
先把默认发送的数据放进去看看是否正常回显
在此基础上我们修改Content-Type为application/xml
可以看到我们得到了一个错误,意思应该是start标签没有找到第一行第一列,这意味着它需要某种XML数据,所以在做任何事情之前,让我们继续尝试看看,是否有任何实体扩展
我们将JSON数据修改为一个有效的XML字符串,<?xml version="1.0" encoding="UTF-8"?>//这一行是 XML 文档定义,然后将整个数值包装在成为根节点的消息标记中
我们得到了一个错误,它说没有找到DTD文件,让我们在DTD中添加一个简单的实体。
可以看到报错没有元素消息的声明,显然解析器需要在DTD中声明以定义的元素,有点像在使用变量之前声明变量。所以让我们给它想要的,我们要做的就是在DTD中声明消息,我们可以通过使用数据,指定名为message的元素来实现这一点,定义类型设置为PC数据,现在让我们继续尝试。
这里得说一下DTD
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。带有DTD的XML文档实例
可以看到成功回显,证明起作用了
现在我们看看我们是否可以从内部向外部世界提出请求或者只是向我们选择的网站提出请求
为了测试这一点,我将使用Beeceptor,https://beeceptor.com/这是一个简单的服务,它为你提供一个子域,并快速而简单的保存向该网站发出的所有请求的日志。
添加一个外部实体来发出出口请求。
但它似乎未能加载外部实体。似乎我们不允许加载。任何外部DTDS。
那我们尝试加载一个文件
我们得到一个标记错误。这意味着文件已经正确加载了,但由于它不是个格式良好的xml文件 所以它中断了。现在我们有了一种枚举文件名的方法,让我们看看是否可以找到/flag文件。
我们得到了同样的输出。这意味着标志就存在路由中,然后被标记为一个文件。我们所要做的就是以某种方式来读取它。但是怎么读取呢?
由于我们不被允许加载外部的DTDS,我们怎么加载内部的DTDS呢?有内部的DTDS吗?如果有的话我想我们可以加载它们。因为我们可以加载HC密码。并破解它。但是这是另外一个原因,所以我们现在需要找到一个内部文件。它是一个可以包含有效XML文件,并且以某种方式获取flag。
https://mohemiv.com/tags/xxe/
上面这篇博客有一篇,关于利用本地DTD文件和XXE的经常博客文章本质上我们可以使用本地DTD文件的实体,但是我们需要在完全加载它之前对它进行定义。因为xml选择器将选择我们定义它的快速处理器。如果你想了解更多这个如何工作的信息。可以阅读这篇文章。
在block-post中也提到,Linux设备可能在/usr/share/xml/scrollkeeper/dtds/scrollkeeper-omf.dtd中有一个DTD文件。并且这个文件又一个名为ISOamsa的实体,所以我们可以使用它来写DTD代码。现在我们来制作DTD代码。
因为我们知道我们为这个例子,发送的输入是一个错误的文件名。
我们在响应中得到的文件名也与错误的文件名相同,这是可以被滥用的。
首先我们读取了所需文件的内容,它可以是一个/flag,它也可以使/etc/password,然后我们可以尝试读取另一份文件,但是我们要确保第二个是个假文件名是我们刚刚读取第一份文件的内容,显然这会给我们一个错误,因为没有文件名作为第一个文件的内容,在错误中我们得到了文件的名称,我们尝试阅读那些意味着,我们也会取回第一个文件的内容,因此使用本地DTD,通过XXE读取任意文件,让我们尝试这个阶段
最后的数据:
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///aaaaa/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
成功拿到flag
原文来自CSDN博主「lmonstergg」|侵删
![[GoogleCTF2019 Quals]Bnv-解题步骤详解 [GoogleCTF2019 Quals]Bnv-解题步骤详解](https://cn-sec.com/wp-content/uploads/2022/04/7-1650005816.png)
![[GoogleCTF2019 Quals]Bnv-解题步骤详解 [GoogleCTF2019 Quals]Bnv-解题步骤详解](https://cn-sec.com/wp-content/uploads/2022/04/2-1650005817.png)
原文始发于微信公众号(寰宇卫士):[GoogleCTF2019 Quals]Bnv-解题步骤详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论