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函数 -  PHP: system - Manual 
 
-  
-  exec函数 -  PHP: exec - Manual 
 
-  
-  shell_exec函数 -  PHP: shell_exec - Manual 
 
-  
-  passthru函数 -  PHP: passthru - Manual 
 
-  
-  popen函数 -  PHP: popen - Manual 
 
-  
-  `` 
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进行转义