一、命令执行漏洞的概念
当操作人员需要应用调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system , exec , shell_exec等当用户可以控制命令执行函数中的参数时,将恶意系统命令可注入到正常命令中,造成命令执行攻击。
二、命令执行漏洞的危害
它可以继承web服务程序的权限去执行系统命令或者读写文件
反弹Shell
控制整个网站或者整个服务器
进一步内网渗透
三、命令执行漏洞的原理
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如果用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常的命令中,造成命令执行漏洞。
在操作系统中,“&、I、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,从而造成漏洞。
四、命令执行漏洞成因
1、代码层过滤不严格
商业应用需要执行命令,商业应用的一些核心代码可能封住在二进制文件当中,在web应用中通过system函数调用。例如system(" /bin/program --arg $arg");
2、系统漏洞造成命令注入
例如bash破壳漏洞(CVE-2014-6271),如果我们控制执行的bash的环境变量,就可以通过破壳漏洞来执行任意代码。
3、第三方组件造成命令注入
如Wordpress,可以选择ImageMagick这个常用的图片处理组件,处理用户上传图片时造成命令执行。再如JAVA中Struts2/ElasticsearchGroovy等。
五、命令执行漏洞常见函数
1、system函数
system ( string $command [, int &$return_var ])
同C版本的system()函数一样 本函数执行command参数所指定的命令,并且输出执行结果命令执行后的返回值为输出值的最后一行 函数本身也会打印全部的输出值
2、Exec函数
exec ( string $command [, array &$output [, int &$return_var ] )
这个函数的作用是执行command参数所指定的命令
命令执行后的值为输出值的最后一行
函数本身不会打印任何内容
3、Passthru函数
passthru ( string $command [, int &$return_var ])
同exec()函数类似
passthru()函数也是用来执行外部命令command的
当所执行的系统命令输出二进制数据,并且需要直接传送到浏览器的时候,需要用此函数来替代exec()或system()函数。
六、命令执行漏洞连接符
&:顺序执行多条命令,而不管命令是否执行成功;
&&:逻辑与,当用此连接符连接多个命令时,前面的命令执行成功,才会执行后面的命令,前面的命令执行失败,后面的命令不会执行,与||正好相反﹔
|:显示后面命令的结果;
||:逻辑或,当用此连接符连接多个命令时,前面的命令执行成功,则后面的命令不会执行。前面的命令执行失败,后面的命令才会执行;