命令执行漏洞学习总结

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);
  • 严格限制允许的参数类型
    利用正则表达
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于PCRE的介绍以及实现正则表达式功能的所有说明,都可以在官方手册中看到:正则表达式(兼容 Perl) 一、认识...
    拿破仑蛋糕阅读 5,490评论 0 1
  • 0x00 背景 在bwapp的注入部分有一个个php injection,这是第一次接触,在做题的过程中查阅各种资...
    陈奕迅大佬阅读 5,482评论 2 1
  • 把当前目录作为Root Document只需要这条命令即可:php -S localhost:3300 也可以指定...
    绚烂的时光阅读 4,068评论 0 1
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,957评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,225评论 0 10

友情链接更多精彩内容