RCE漏洞基本概念
命令执行漏洞是指攻击者可以随意执行系统命令,氛围远程代码执行和系统命令执行,黑客可以直接在web应用中执行系统命令,从而获取敏感信息或者拿下shell权限。
程序应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell exec、passthru、popen、proc _popen等,当用户能控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击
由于开发人员编写源码时,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句,并提交服务端执行
命令注入攻击中,Web服务器没有过滤类似system、eval和exec等函数,是该漏洞攻击成功的主要原因。
利用条件:
-
应该调用执行系统命令的函数
-
将用户输入作为系统命令的参数拼接到了命令行中
-
没有对用户输入进行过滤或过滤不严
漏洞产生的原因
一、代码层过滤不严
-
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用: system(“/bin/program --arg $arg”);
二、系统的漏洞造成命令注入
-
bash破壳漏洞(CVE-2014-6271)
三、调用的第三方组件存在代码执行漏洞
-
如wordPress中用来处理图片的imageMagick组件
-
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
-
ThinkPHP命令执行
php命令执行
-
system函数
-
exec函数
-
shell_exec函数
-
passthru函数
-
popen函数
-
``
Windown 命令连接符
一、&
-
无论左边是false还是true,右边都执行,按顺序执行
二、&&
-
具有短路效果,左边是false,右边不执行
三、|
-
表示A命令语句的输出,作为B命令语句的输入执行。当A为false的时候将不会执
四、||
-
AIIB,表示A命令语句执行失败,然后才执行B命令语句。
Linux 命令连接符
一、&
-
在后台运行
二、;
-
分号(;)可以进行多条命令的无关联执行,每一条执行结果不会影响其他命令的执行
三、&&
-
按照顺序执行,如果前面应该正确就会执行下一个,如果错误那么就不会执行下一个
四、||
-
如果||左边的命令执行失败(返回1表示失败),才执行|右边的命令,否则不执行右边的命令,具有短路功能。
五、()
-
如果想执行几个命令,则需要用命令分隔符分号隔开每个命令,并使用圆括号()把所有命令组合起来
rce 绕过
在执行命令的时候可能会过滤空格,或一些命令,这时候就需要绕过
一、空格过滤
1、${IFS}
-
cat${IFS}flag.txt
2、重定向符<>
-
cat<>flag.txt
3、%09(需要PHP环境)
-
cat%09flag.txt
二、黑名单绕过
-
拼接
-
A=c;b=at;c=fla;d=g.txt;$a$b $c$d
-
-
base64编码
-
echo 'Y2F0IGZsYWcudHh0==' |base64 -d
-
-
单引号、双引号
-
cat ' 't fla " " g.txt
-
-
反斜线
-
cat\t fla \g.txt
-
-
$1,$2等和 $@
三、读文件绕过
当cat命令被拦截时,可以使用其它的一些命令
-
More
-
Less
-
Head
-
Tac
-
Tail
-
Nl
-
0d
-
Vi
-
Vim
-
Sort
-
Uniq
-
File -f
四、通配符绕过
-
?字符代表单个字符
-
*字符代表任意数量的字符
-
[...]匹配方括号之中的任意一个字符
-
#存在文件a.txt和 b.txt
-
$ ls [ab].txt
-
a.txt b.txt
-
$ Is *[ab].txt
-
ab.txt a.txt b.txt
五、内联执行绕过
-
命令
和$(命令)都是执行命令的方式 -
反引号
是命令替换,命令替换是指Shell可以先执行
中的命令,将输出结果暂时保存在适当的地方输出。语法:command
漏洞防御
-
尽量少使用执行命令函数或者禁用disable_functions(php.ini)
-
在进入执行命令的函数之前,对参数进行过滤,对敏感字符进行转义
-
参数值尽量使用引号包括,并在拼接前调用addslashe进行转义