美文网首页
命令执行漏洞学习总结

命令执行漏洞学习总结

作者: SunJ3t | 来源:发表于2018-07-31 10:00 被阅读0次

    1. 远程命令执行漏洞

    1. 利用系统函数实现远程命令执行

    在PHP下,允许命令执行的函数有:

    • eval()
    • assert()
    • preg_replace()
    • call_user_func()
    • ...

    如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞

    1. eval()函数
    • 定义和用法
      eval() 函数把字符串按照 PHP 代码来计算。
      该字符串必须是合法的 PHP 代码,且必须以分号结尾。
      如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

    • 语法
      eval(phpcode)
      phpcode 必需。规定要计算的 PHP 代码。

    • 例子

    <?php
    $a = $_GET['a'];
    eval($a);
    ?>
    
    http://127.0.0.1/oscommand/1.php?a=phpinfo();
    
    1. assert()函数
    • 定义和用法
      检查一个断言是否为 FALSE

    • 语法

      • PHP 5
        bool assert ( mixed assertion [, stringdescription ] )
      • PHP 7
        bool assert ( mixed assertion [, Throwableexception ] )

    assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动

    • 例子
    <?php
    $a = $_GET['a'];
    assert($a);
    ?>
    
    http://127.0.0.1/oscommand/1.php?a=phpinfo();
    http://127.0.0.1/oscommand/1.php?a=phpinfo()
    

    ps: eval()和assert()区别
    eval()函数正确执行需要满足php的代码规范,而assert()函数则不存在这个问题,对于php的代码规范要求不高

    1. preg_replace()函数
    • 定义和语法
      preg_replace 函数执行一个正则表达式的搜索和替换。

    • 语法
      mixed preg_replace ( mixed pattern , mixedreplacement , mixed subject \[, intlimit = -1 [, int &$count ]] )
      搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
      参数说明:

      • pattern: 要搜索的模式,可以是字符串或一个字符串数组。当pattern处存在一个"/e"修饰符时,$replacement的值会被当成php代码来执行。
      • $replacement: 用于替换的字符串或字符串数组。
      • $subject: 要搜索替换的目标字符串或字符串数组。
      • $limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
      • $count: 可选,为替换执行的次数。
    • 例子

    <?php
    $a = $_GET['a'];
    echo preg_replace("/test/e", $a, "just test!")
    ?>
    
    http://127.0.0.1/oscommand/1.php?a=phpinfo()
    

    ps: 在php5.4及以下版本中,preg_replace()可正常执行代码,而在php5.5及后续版本中会提醒"/e"修饰符已被弃用,要求用preg_replace_callback()函数来代替。

    1. call_user_func()函数
    • 定义和用法
      call_user_func — 把第一个参数作为回调函数调用

    • 语法
      mixed call_user_func ( callable callback \[, mixedparameter [, mixed $... ]] )
      第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

    • 例子

    <?php
    call_user_func($_GET['a'],$_GET['b']);
    ?>
    
    http://127.0.0.1/oscommand/1.php?a=assert&b=phpinfo()
    
    1. 其他函数
    • ob_start()、unserialize()、creat_function()
    • usort()、uasort()、uksort()
    • array_filter()
    • array_reduce()
    • array_map()
    • ...

    2. 系统命令执行漏洞

    1. 系统命令执行的函数
    • system()
    • exec()
    • shell_exec()
    • passthru()
    • pcntl_exec()
    • popen()
    • proc_open()
    • 反引号
    • ...
    1. 环境分析
    <?php
    if (isset($_POST['submit'])){
        $target = $_REQUEST['ip'];
        
        if(isset(php_uname('s'), 'Windows NT')) {
            $cmd = shell_exec('ping ' . $taeget);
            echo '<pre>'.$cmd.'</pre>';
        } else {
                $cmd = shell_exec('ping -c 3 ' . $target);
                echo '<pre>'.$cmd.'</pre>'
        }
    }
    

    页面通过request获取传入的ip参数,并获取当前系统类型之后拼接相应命令"ping + target IP"并执行,在此过程中IP参数可控,所以在IP可拼接命令。

    127.0.0.1&&whoami
    127.0.0.1;whoami
    127.0.0.1||whoami
    
    1. 防范措施
    • 在PHP下禁用高危系统函数
      找到php.ini,查找到disable_functions,添加禁用的函数名
    • 严格过滤关键字符
    $substitutions = array(
        '&&' => '',
        ';' => '',
        '||' => '',
    );
    $target = str_replace(array_keys($substitutions), $substitution, $target);
    
    • 严格限制允许的参数类型
      利用正则表达

    相关文章

      网友评论

          本文标题:命令执行漏洞学习总结

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