[CTF题目总结-web篇]攻防世界:Cat

简单的命令注入不起作用,本地文件爆破怎么样?

一、题目分析

题目链接:攻防世界-Cat

1.标题是Cloud Automated Testing,并且要求输入一个域名,由此可以猜想此网页会执行PING之类的网络测试命令——有命令执行,那就有命令注入。
2.但是命令注入被过滤了,于是寻找下一个突破口:经过一轮fuzz之后,发现页面会在参数url是%FF时报错(字符编码错误),报错信息很丰富——负责执行PING命令的不是PHP,而是另一个后端Django,这两者之间有交互。
3.怎么交互?PHP通过cURL将参数url发送给Django,Django解析收到的url并执行PING命令。
4.我们猜想flag在数据库中(具体路径可从报错信息中获得),结合前面的报错有这样一个想法:假如此数据库文件含有无法被Django解析的字符,Django会报错从而回显flag。
5.PHP的cURL支持这一点:如果选项CURLOPT_POSTFILEDS设置为true,那么PHP可以向服务器POST一个文件,此文件名以@开头并且要求是绝对路径。

知识点小结:
URL编码、Django、cURL本地文件POST。

二、具体思路

  1. 根据标题及提示输入127.0.0.1,从回显结果看出这个网站提供PING服务。
    在这里插入图片描述

  2. 简单的命令注入试探(如 ’| ls),由回显结果猜想有关键字符过滤。
    在这里插入图片描述

  3. 另辟蹊径:考察参数url发现其使用了URL编码,URL编码中ascii字符的边界是%7F,fuzz发现当url=%FF时报错(是一段html文本)。
    在这里插入图片描述
    4.将html在浏览器中打开,可以看出后端运行Django,由于字符编码问题而报错。在请求信息POST一项中可以找到参数url,于是大致可以猜想到是PHP向本机的Django发出了POST请求,参数就是我们输入的url。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. PHP通常使用cURL库与作为客户端与服务器通信,在cURL库的CURLOPT_POSTFILEDS选项中可以找到突破口,借此我们可以爆出数据库内容。
    在这里插入图片描述

  5. 根据前面发现的数据库路径,构造payload “url=@/opt/api/database.sqlite3”, 成功爆出报错信息,并由此在POST数据中找到了flag。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三、题目总结

URL编码:HTTP只能传输约定的ASCII字符(即ASCII码值127以内),若要传输其他字符和一些ASCII值在127以内的特殊字符,则需要对其转义——方法是在其十六进制ASCII值前加一个%,注意约定字符也可以编码但是效果一样。URL编码的临界值为%7F(127),由于计算机普遍存在的编码转换问题,我们常常可以在这里fuzz一下。
在这里插入图片描述

Django:Django是一个用python写成的web应用框架。

Django项目的目录布局如下:
在这里插入图片描述
Django项目中app的目录布局如下:
在这里插入图片描述
PHP的cURL库:PHP中的cURL库支持PHP作为客户端访问其他服务器,并支持多种协议。这里从报错信息中可以看出,与Django的交互是使用HTTP协议。
在这里插入图片描述

发布了24 篇原创文章 · 获赞 19 · 访问量 6891

猜你喜欢

转载自blog.csdn.net/tch3430493902/article/details/103832382