Web安全

命令执行漏洞

2020-03-14  本文已影响0人  Splunker

命令执行

应用有时需要调用一些执行系统命令的函数,
如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上,不能用 ; 可以用 &、&&、|、|| 代替

A&B 前面的语句为假则直接执行后面的

A&&B A执行成功,然后才会执行B

A|B A的输出,作为B的输入

A||B A执行失败,然后才会执行B

漏洞利用

示例一

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

示例二

其他

在cmd.php中的代码如下:

<?php
    eval($_REQUEST['code']);
?>

提交http:/127.0.0.1/1.php?code=phpinfo() 后就会执行phpinfo()

在cmd.php中的代码如下:

<?php
    $fun = $_GET['fun'];
    $par = $_GET['par'];
    $fun($par);
?>

提交http://127.0.0.1/1.php?fun=system&par=ipconfig,最终执行的是system("ipconfig")

漏洞修复

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

猜你喜欢

热点阅读