攻防世界-Web高手进阶区-Cat
前言
这题其实并不能算是命令执行。总的来说还是比较难而且有点需要脑洞,不过如果知识面非常广的话可能也就不存在所谓的脑洞了。原题是有hint的,不过在攻防世界上面没有给,所以做起来也是有点困难。
WP
首先打开环境提示我输入域名,我输入127.0.0.1,发现有回显,知道了是执行ping命令的。这时候我和几乎所有做过这题的师傅们应该都以为这题是一个命令执行的题目,事实并不是这样。
我尝试了127.0.0.1后面用&&,用||,以及各种发现都被过滤了,返回了Invalid URL。这时候我尝试了各种绕过,最后发现一点用都没有。
看了WP,知道大师傅们在这里进行了fuzz,发现直接在URL里面让url=超过%F7的编码,就会报错。像这样:
这里我一开始有点不懂,也是查了很多东西才明白为什么。
我们把下面的HTML代码复制到html文件里面然后打开,打开的页面是Django的报错页面,里面的gbk说明这个dgango使用的gbk编码。但是为什么会出错呢?
当我们直接在表单的那个框里面输入的时候,里面的URL特殊字符会被URL编码,当然很大部分已经被过滤了,有大师傅进行fuzz,发现@没有被过滤,这个@也就是本题解题的重点。
当我们直接在URL里面输入的时候,URL里面的内容会被解码一次,当我们输入的超过%7f的时候,就超过了7位ASCII码的范围,这时候里面的东西经过解码会变成一些奇奇怪怪的字符,这些字符在gbk中无意义,不能被识别,因此会报错。
接下来其实是有提示的,不然真的想不到:
当 CURLOPT_SAFE_UPLOAD 为 true 时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求,来读取文件。当且仅当文件中存在中文字符的时候,Django 才会报错导致获取文件内容。
我们由报错的那个页面里可以知道使用的是POST。
接下来又是一个点。django项目下一般有个settings.py文件是设置网站数据库路径(django默认使用的的是sqlites数据库),如果使用的是其它数据库的话settings.py则设置用户名和密码。除此外settings.py还会对项目整体的设置进行定义。‘
我们根据报错的内容可以知道了绝对路径是/opt/api/,因此我们可以尝试访问这个设置,也可以直接在报错页面找到设置,里面有数据库的相关信息:
不过如果访问settings.py的话,得是这样:
[email protected]/opt/api/api/settings.py
为什么是两个api我也很迷。。。
不过知道了数据库在哪,直接访问就可以得到flag了:
后记
我只能说这题在没有提示的情况下真的太难了,可能大佬们思路特别强的话也不是那么难,但是对我这样的小白来说感觉全部都是知识盲区。只能说自己知道的还是太少,知识面还是太窄,思路还是太low了,需要慢慢加油。