CTFHub上的六道命令注入的例题
无过滤
看看题先,ping一个IP地址。
源码
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$cmd = "ping -c 4 {$_GET['ip']}";
exec($cmd, $res);
}
?>
根据第六行代码,这里直接拼接命令行就可以。猜测flag可能在10240263218889.php文件中。再次拼接命令行,cat一下。
但是没有显示,这里可能有特殊字符无法回显,所先用base64编码再输出看看。
回显正常,将其base64解码即可拿到flag。
过滤cat
第一步还是一样,拼接命令行语句看看根目录。
但是因为这道题过滤了cat命令,所以这一步不能直接用cat读取flag_845521865998.php文件了。除了cat命令。more命令也可以读取文件。二者的区别在于,cat命令一次性将全部内容显示在屏幕上,在读取超长文件时cat显得毫无用处,因此Linux提供more命令一行一行地显示文章内容。
使用more命令,然后进行base64解码,即可得到flag。
过滤空格
前面的步骤还是一样,这里的重点在于如何绕过空格。
Linux中绕过空格的几种方式
cat flag.txt
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
最后得到base64编码的flag,拿去解码即可。
过滤目录分隔符
这题绕过了目录分隔符/。
发现flag文件在flag_is_here目录下。
直接用cat flag_is_here/flag_3238793723392.php肯定是不行的。怎么绕过呢?
先cd进入该目录,然后catflag文件。
127.0.0.1;cd flag_is_here;cat flag_3238793723392.php | base64
然后拿去解码即可。
过滤运算符
过滤了|、&这些运算符。
第一步127.0.0.1;ls,第二步127.0.0.1;cat flag_3076413904999.php。查看源码,发现flag在注释里面。原来之前不用base64编码也是可以的,输出变成了注释所以没法正常回显。
综合过滤练习
组合拳
过滤了 ; 符号,翻看URL编码,%0a可以实现换行,用%0a代替 ; 符号。
过滤了空格和flag,所以用${IFS}代替空格。
在没有定义的情况下,$*在bash中命令执行为空。所以可以吧flag拼接成fl$*ag。
又因为过滤了cat,所以我们用more读取。最后payload为
?ip=127.0.0.1%0Acd${IFS}fl$*ag_is_here%0Amore${IFS}fl$*ag_309191927732.php#
得到flag。