RCE简介
RCE(remote command/code execute):远程命令/代码执行。
命令执行漏洞: 直接调用操作系统命令。
代码执行漏洞: 靠执行脚本代码调用操作系统命令。
原因:在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
原理
攻击者在一些能够执行系统命令的位置,输入恶意的系统命令,服务器端没有针对执行函数做严格的过滤,导致服务器执行了该恶意的系统命令,从而对服务器产生了安全威胁。
命令执行和代码执行的区别:命令执行漏洞是直接调用操作系统命令,而代码执行漏洞则是靠执行脚本代码调用操作系统命令。
命令执行
系统命令执行函数
System():system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下: system(command,return_var) 其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。
Exec():exec函数可以用来执行一个外部的应用程序 exec (command, output, return_var) 其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值。
Passthru():passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:passthru (command, return_var)
其中,command是要执行的命令,return_var存放执行命令后的状态值。
Shell_exec():执行shell命令并返回输出的字符串,函数原型如下: shell_exec (command) 其中,command是要执行的命令。
popen() proc_open() pcntl_exec()
利用管道符
Window系列
" | ":直接执行后面的语句。例如:ping 127.0.0.1 | whoami。
“ || ”:如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。例如:ping 127.0.0.1 || whoami
" & " :如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如: ping 127.0.0.1 &whoami。
“ && ”: 如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1 && whoami。
Linux 系统
“;”执行完前面的语句再执行后面的。例如: ping 127.0.0.1;whoami
“ | ”:显示后面语句的执行结果。例如: ping 127.0.0.1 | whoami。
“ || ”: 当前面的语句执行出错时,执行后面的语句。例如: ping 1|| whoami。
“ & ”: 如果前面的语句执行为假则直接执行后面的语句。前面的语句可真可假。例如:ping 127.0.0.1 & whoami。
“ && ”:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。例如: ping 127.0.0.1 && whoami。
代码执行
脚本代码执行函数
eval():把字符串按照 PHP 代码来执行。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
assert():普通调用
preg_replace() :对一个字符串进行正则处理
call_user_func()array_map()
绕过
绕过空格
{cat,flag.txt}cat${IFS}flag.txtcat$IFS$9flag.txt
cat<flag.txt cat<>flag.txtca\t fl\ag
通配符绕过
???在linux里面可以进行代替字母 /???/c?t flag.txt
*在linux里面可以进行模糊匹配cat flag.* *进行模糊匹配php
?
代表一个字符*
代表一串字符同功能语句替换
编码绕过
base64、hex编码绕过、unicode编码
关键字符绕过
函数绕过
print_r(scandir(pos(localeconv()))) //当前目录print_r(scandir(’/’)) //查看根目录文件输出目录中倒数第二个文件内容:print_r(next(array_reverse(scandir(pos(localeconv())))))
绕过长度限制
>
和>>
两个符号的使用
>
命令会将原有文件内容覆盖,如果是存入不存在的文件名,那么就会新建文件再存入
>>
符号的作用是将字符串添加到文件内容末尾,不会覆盖原内容
防御
1、参数值尽量使用引号包括
2、尽量少用执行命令的函数或者直接禁用
3、在使用动态函数之前,确保使用的函数是指定的函数之一
4、在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
5、能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用。
如果觉得《命令执行(RCE)漏洞》对你有帮助,请点赞、收藏,并留下你的观点哦!