RCE命令注入

RCE命令注入

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。

------本页内容已结束,喜欢请分享------

文章作者
能不能吃完饭再说
隐私政策
PrivacyPolicy
用户协议
UseGenerator
许可协议
NC-SA 4.0


© 版权声明
THE END
喜欢就支持一下吧
点赞15赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片