PHP代码审计之命令执行漏洞

前言:

  接上次代码执行漏洞之后,还有一个跟它相似的命令执行漏洞。这两者的区别就是代码执行漏洞完全限制与语言本身,也就是php代码执行漏洞就要遵循PHP语言规则才能执行;而命令执行漏洞只受限制于网站所在系统,也就是Linux网站遵循Linux系统命令,Windows网站遵循windows系统命令。

参考文献:水清云影的教学视频

正文:

  关于命令执行漏洞的概念:命令执行漏洞是程序将不安全的用户数据(表单,cookie,http头等)传递给系统shell时,就有可能存在命令注入。该漏洞的存在原理和代码执行漏洞有点类似,只是使用的函数有所不同。

  关于命令执行漏洞的利用条件:一是存在可执行系统命令的高危函数,二是用户可以直接或间接控制该函数的参数,三是对该参数的过滤不够严谨。

  关于命令执行漏洞的类型:

  1. 代码层过滤不严造成的命令执行漏洞;
  2. 系统本身存在的命令执行漏洞;
  3. 调用的第三方组件存在命令执行漏洞。

PHP中可能造成命令执行漏洞的函数:

  1. system()函数:原型string system( string $command [,int &$return_var ]),本函数执行 command 参数所指定的命令, 并且输出执行结果。如果 PHP 运行在服务器模块中, system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存。
  2. passthru()函数:原型void passthru(string $command [,int &$return_var])passthru() 函数 也是用来执行外部命令(command)的。常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
  3. exec()函数:原型string exec(string $command[,array &$output[,int &$return_var]]),执行 command 参数所指定的系统命令。
  4. shell_exec()函数:原型string exec( $command, [$output, [return_var]]),PHP中的一个内置函数,用于通过shell执行命令并以字符串的形式返回完整的输出。shell_exec是backtick操作符的别名,用于*nix。如果命令失败,则返回NULL,并且这些值对于错误检查不可靠。

命令执行函数使用实例:

  1. system()

    1
    2
    3
    4
    5
    system.php
    <?php
    $shell=$_GET['shell'];
    system($shell);
    ?>

    执行效果如下:p1

      这个函数可以直接将命令带入系统之中,并将结果存为字符串返回输出到浏览界面。而且该函数还可以将结果当作一个字符串返回值进行操作。

  2. passthru()

    1
    2
    3
    4
    5
    passthru.php
    <?php
    $shell=$_GET['shell'];
    passthru($shell);
    ?>

    执行效果如下:p2

      该函数直接将结果打印到浏览器上,没有返回值。

  3. exec()函数

    1
    2
    3
    4
    5
    exec.php
    <?php
    $shell=$_GET['shell'];
    echo exec($shell);
    ?>

    执行效果如下:p3

      该函数执行命令后并不会将结果返回到浏览器上,而且之后保存其中最后一行的结果,这里为方便演示,使用了一个输出关键字,但这并不代表结果是exec函数输出的,只能说明exec在执行完命令后会保存最后一行结果。

  4. shell_exec()

    1
    2
    3
    4
    5
    shell_exec.php
    <?php
    $shell=$_GET['shell'];
    echo shell_exec($shell);
    ?>

    执行效果如下;p4

      该函数与exec函数相似,同样不会直接输出结果到浏览器,但会将命令执行后的所有结果保存下来。与之相似的还有一个反引号,功能与shell_exec()函数完全一样。p5

命令执行漏洞的防范:
  1. 代码层方面对用户的传参进行严格的过滤,如果能将参数写死,尽量不要用可控变量代替;
  2. 系统方面注意定期为系统打补丁;
  3. 有命令执行了漏洞的第三方软件能不要尽量不要使用。

总结:

  本篇文章中主要记录代码层造成的命令注入漏洞,系统层面和第三方组件暂时不做总结,以后找到环境了在总结一波,这些就是我目前掌握的命令执行漏洞,如果有有不正确和不完整的地方,还请大佬们多多批评:

QQ