命令执行漏洞

作者: cws | 来源:发表于2016-07-24 18:12 被阅读4471次

    命令执行

    应用有时需要调用一些执行系统命令的函数,如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. 进一步内网渗透
    5. 等等

    漏洞可能代码(以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");
    }
    ?>

    ![command_execution1.png](http:https://img.haomeiwen.com/i2461408/c5fd85bd2c9a1b61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    * 示例二
    
    > ```php
    <?php
        $arg = $_GET['cmd'];
        if ($arg) {
            system("ping -c 3 $arg");
        }
    
    command_execution2.png
    • 示例三

    <?php
    $arg = $_GET['cmd'];
    if ($arg) {
    system("ls -al "$arg"");
    }

    ![command_execution3.png](http:https://img.haomeiwen.com/i2461408/d33aa1fbbe776039.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    注:若引号被转义,则可以用<b>\`id\`</b>来执行
    
    * 示例四
    
    > ```php
    <?php
        $arg = $_GET['cmd'];
        if ($arg) {
            system("ls -al '$arg'");
        }
    
    command_execution4.png

    其他

    • 代码执行:
      在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")
    

    漏洞修复

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

    相关文章

      网友评论

        本文标题:命令执行漏洞

        本文链接:https://www.haomeiwen.com/subject/oxqgjttx.html