4 phpMyAdmin本地文件包含漏洞

4.1 摘要

4.1.1 漏洞简介

  • phpMyAdmin是一个web端通用MySQL管理工具,上述版本在/libraries/gis/pma_gis_factory.php文件里的存在任意文件包含漏洞,攻击者利用此漏洞可以获取数据库中敏感信息,存在GETSHELL风险。

4.1.2 漏洞环境

  • Windows XP
  • php 5.2.17
  • phpMyAdmin 4.0.1--4.2.12

4.2 漏洞复现

4.2.1 构造木马

  • 在网站根目录放置phpinfo.txt(包含phpinfo())包含一句话木马等操作,上传后达到GETSEHLL的目的。该文件内PHP代码可以打印出PHP详细的版本等信息,用来测试任意文件包含。

4.2.2 构造URL直接访问

  • 打开http://localhost/页面来访问本地搭建的存在漏洞的phpMyAdmin,创建一个普通用户root,密码root,没有任何权限,登录后只能看到test、mysql、information_schema表:

  • 居然一片空白,没有出现我想要的phpinfo!?

  • 这又涉及到phpmyadmin的一个防御CSRF机制了,来到libraries/common.inc.php ,代码如下:
$token_mismatch = true;
if (PMA_isValid($_REQUEST['token'])) {
$token_mismatch = ($_SESSION[' PMA_token '] != $_REQUEST['token']);
}
//检查$_SESSION[‘ PMA_token ‘] 是否等于 $_REQUEST[‘token’]
if ($token_mismatch) {//如果不等于
/**
* 不安全源允许的参数列表
*/
$allow_list = array(
/* 直接访问所需,参见常见问题1.34
* 此外,服务器需要cookie登录屏幕(多服务器)
*/
'server', 'db', 'table', 'target', 'lang',
/* Session ID */
'phpMyAdmin',
/* Cookie preferences */
'pma_lang', 'pma_collation_connection',
/* Possible login form */
'pma_servername', 'pma_username', 'pma_password',
/* Needed to send the correct reply */
'ajax_request',
/* Permit to log out even if there is a token mismatch */
'old_usr'
);
/**
* 允许在 test/theme.php中更改主题
*/
if (defined('PMA_TEST_THEME')) {
$allow_list[] = 'set_theme';
}
/**
* Require cleanup functions
*/
include './libraries/cleanup.lib.php';
/**
* Do actual cleanup
*/
PMA_remove_request_vars($allow_list);//进入PMA_remove_request_vars函数
}
  • 上面代码检查了$_SESSION[‘ PMA_token ‘] 是否等于 $_REQUEST[‘token’],如果不等于,最后会进入PMA_remove_request_vars函数,代码如下:
function PMA_remove_request_vars(&$whitelist)
{
/*
* 不要只检查$_REQUEST因为它可能已被覆盖
* 并使用类型转换,因为变量可能已经成为字符串
*/
$keys = array_keys(
array_merge((array)$_REQUEST, (array)$_GET, (array)$_POST, (array)$_COOKIE)
);
foreach ($keys as $key) {
if (! in_array($key, $whitelist)) {
unset($_REQUEST[$key], $_GET[$key], $_POST[$key], $GLOBALS[$key]);
} else {
// allowed stuff could be compromised so escape it
// we require it to be a string
if (isset($_REQUEST[$key]) && ! is_string($_REQUEST[$key])) {
unset($_REQUEST[$key]);
}
if (isset($_POST[$key]) && ! is_string($_POST[$key])) {
unset($_POST[$key]);
}
if (isset($_COOKIE[$key]) && ! is_string($_COOKIE[$key])) {
unset($_COOKIE[$key]);
}
if (isset($_GET[$key]) && ! is_string($_GET[$key])) {
unset($_GET[$key]);
}
}
}
}
  • 所有的$_REQUEST $_POST $_COOKIE $_GET都清空了,那么后面的操作肯定不能正常运转了。所以,必须带上token访问。

4.2.3 获取token

  • 使用phpmyadmin时,注意到一般在访问pma的时候都会在url里看到token=xxx这个参数,点击hackbar工具的load url即可将url地址加载到hackbar的栏目中,把该token复制下来,准备下一步操作利用任意文件包含。

  • 在hackbar栏目中输入http://localhost/gis_data_editor.php?token=(上面操作复制的内容粘贴进入这里)&gis_data[gis_type]=/../../../phpinfo.txt%00 输入完毕后点击Execute提交即可,即可包含执行phpinfo.txt中的php代码, 如下图所示:

    ![](http://images2015.cnblogs.com/blog/885499/201706/885499-

    20170617182151243-741741458.png)
  • 打印出PHP详细的版本等信息,漏洞利用成功。

4.3 漏洞分析

  • 分析官方发布的漏洞补丁,libraries/gis/pma_gis_factory.php代码如下:
public static function factory($type)    {
include_once './libraries/gis/pma_gis_geometry.php';
$type_lower = strtolower($type);
if (! file_exists('./libraries/gis/pma_gis_' . $type_lower . '.php')) {
if(! PMA_isValid($type_lower, PMA_Util: :getGISDatatypes())
|| ! file_exits(' ./libraries/gis/pma_gis' . $type_lower . '.php)//file_exists判断文件是否存在
){
return false;
}
if (include_once './libraries/gis/pma_gis_' . $type_lower . '.php') {//include_once包含这个文件
  • 对比下有漏洞的/libraries/gis/pma_gis_factory.php代码:
public static function factory($type)    {
include_once './libraries/gis/pma_gis_geometry.php';
$type_lower = strtolower($type);
if (! file_exists('./libraries/gis/pma_gis_' . $type_lower . '.php')) {
return false;
}
if (include_once './libraries/gis/pma_gis_' . $type_lower . '.php') {
  • 可以看到多了一段 PMA_isValid($type_lower, PMA_Util::getGISDatatypes()) $type_lower参数的判断,大概可以猜测漏洞和这个参数有关系。
  • 这里的代码逻辑是:用file_exists判断文件是否存在,如果存在,就用include_once包含这个文件。如果$type_lower这个变量是可控的,那么就造成文件包含漏洞。追溯$type_lower的来源,可以发现是factory函数的参数,所以找调用factory函数的地方gis_data_editor.php
1     // Get data if any posted
2 $gis_data = array();
3 if (PMA_isValid($_REQUEST['gis_data'], 'array')) {
4 $gis_data = $_REQUEST['gis_data'];//获取到gis_data参数的值
5 }
6 $gis_types = array(
7 'POINT',
8 'MULTIPOINT',
9 'LINESTRING',
10 'MULTILINESTRING',
11 'POLYGON',
12 'MULTIPOLYGON',
13 'GEOMETRYCOLLECTION'
14 );
15 // 从初始调用中提取类型并确保它是有效的。
16 // 判断$gis_data[‘gis_type’]是否已经存在
17 if (! isset($gis_data['gis_type'])) {
18 if (isset($_REQUEST['type']) && $_REQUEST['type'] != '') {
19 $gis_data['gis_type'] = strtoupper($_REQUEST['type']);
20 }
21 if (isset($_REQUEST['value']) && trim($_REQUEST['value']) != '') {
22 $start = (substr($_REQUEST['value'], 0, 1) == "'") ? 1 : 0;
23 $gis_data['gis_type'] = substr(
24 $_REQUEST['value'], $start, strpos($_REQUEST['value'], "(") - $start
25 );
26 }
27 if ((! isset($gis_data['gis_type']))
28 || (! in_array($gis_data['gis_type'], $gis_types))
29 ) {
30 $gis_data['gis_type'] = $gis_types[0];
31 }
32 }
33 $geom_type = $gis_data['gis_type'];//赋值
34 // 通过传递的值生成参数。
35 $gis_obj = PMA_GIS_Factory::factory($geom_type);//传参
  • 首先调用了factory函数,并且参数等于$gis_data['gis_type'],第4行:$gis_data = $_REQUEST['gis_data'];获取到gis_data,判断$gis_data[‘gis_type’]是否已经存在,如果存在则跳过那 一大串if子句。最后就将$gis_data[‘gis_type’]赋值给$geom_type,并传入 PMA_GIS_Factory::factory函数。
  • 实际利用方法其实就是获取$_REQUEST[‘gis_data’][‘gis_type’]并拼接到include_once中,造成任意文件包含。

4.4 修复建议

phpMyAdmin本地文件包含漏洞的更多相关文章

  1. phpMyAdmin 4.8.x 本地文件包含漏洞利用

    phpMyAdmin 4.8.x 本地文件包含漏洞利用 今天ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell.该漏洞利用 ...

  2. Nagios Looking Glass 本地文件包含漏洞

    漏洞名称: Nagios Looking Glass 本地文件包含漏洞 CNNVD编号: CNNVD-201310-682 发布时间: 2013-10-31 更新时间: 2013-10-31 危害等级 ...

  3. WP e-Commerce WordPress Payment Gateways Caller插件本地文件包含漏洞

    漏洞名称: WP e-Commerce WordPress Payment Gateways Caller插件本地文件包含漏洞 CNNVD编号: CNNVD-201310-642 发布时间: 2013 ...

  4. 易酷 cms2.5 本地文件包含漏洞 getshell

    易酷 cms2.5  本地文件包含漏洞 getshell 首先下载源码安装(http://127.0.0.1/test/ekucms2.5/install.php) 安装成功直接进行复现吧 本地包含一 ...

  5. 关于Discuz! X系列UC_Server 本地文件包含漏洞

    最近又发现discuz论坛被挂马了,决定好好研究一下discuz的漏洞,技术债始终要还是要还的 一.问题发现 快要睡觉的时候,突然收到一封邮件,发现服务器上的文件被篡改了,立即登录服务器,清空恶意文件 ...

  6. Elasticsearch 核心插件Kibana 本地文件包含漏洞分析(CVE-2018-17246)

    不久前Elasticsearch发布了最新安全公告, Elasticsearch Kibana 6.4.3之前版本和5.6.13之前版本中的Console插件存在严重的本地文件包含漏洞可导致拒绝服务攻 ...

  7. 易酷CMS2.5本地文件包含漏洞复现

    易酷CMS是一款影片播放CMS.该CMS2.5版本存在本地文件包含漏洞.我们可以利用这个漏洞,让其包含日志文件,然后再利用报错信息将一句话木马写入日志中.然后利用文件包含漏洞包含该日志文件,再用菜刀连 ...

  8. 组合拳 | 本地文件包含漏洞+TFTP=Getshell

    文章声明 安全文章技术仅供参考,此文所提供的信息为漏洞靶场进行渗透,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作. 本文所提供的工具仅用于学习,禁止用于其他,未经授权,严禁转载,如需转 ...

  9. phpmyadmin任意文件包含漏洞分析(含演示)

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

随机推荐

  1. PHP、Lua中的 尾调用

    在程序设计中,递归(Recursion)是一个很常见的概念,合理使用递归,可以提升代码的可读性,但同时也可能会带来一些问题. 下面以阶乘(Factorial)为例来说明一下递归的用法,实现语言是PHP ...

  2. hash专题学习笔记QAQ

    开始说要我给hash写一个专题的时候我是拒绝的,,,我本来想着就把它放到那个考前续命里存个模板就好了 突然想起来之前好像是在蓝书上看到过关于hash的专题?也还有两三道题呢,而且这种思想还是很有意义的 ...

  3. IIS7启用gzip

    压缩什么 服务器基于文件类型选择压缩什么,但这通常受限于对其进行的配置.很多网站就会压缩其HTML文档.压缩脚本和样式表也是非常值得的,压缩的内容包括XML和JSON在内的任何文本响应,但这里只关注脚 ...

  4. zookeeper java调用及权限控制

    import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayLis ...

  5. ASCII对照表

    ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ! 65 A 97 a 2 ST ...

  6. matlab常用方法

    1:matlab进行符号的虚数运算 直接使用符号 a+b*j运算,结果是一个角度值,不是复数. 可以使用  a+b*(1j)    进行运算. 如下 position(index,)=radius; ...

  7. Spark SQL metaData配置到Mysql

    构造以spark为核心的数据仓库: 0.说明     在大数据领域,hive作为老牌的数据仓库比较流行,spark可以考虑兼容hive.但是如果不想用hive做数据仓库也无妨,大不了我们用spark建 ...

  8. Andrew Ng-ML-第十八章-大规模机器学习

    1.学习大数据集 图1.学习大数据集 当数据集量为m=1亿时,进行梯度下降将会花费较大时间. 可以使用小量数据集进行训练,然后得出学习曲线. 左图是高方差,右图是高偏差. 总之是要通过高效的学习算法来 ...

  9. [LeetCode] 221. Maximal Square _ Medium Tag: Dynamic Programming

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...

  10. numpy的prod()函数和pad()函数

    1.np.prod()函数用来计算所有元素的乘积,对于有多个维度的数组可以指定轴,如axis=1指定计算每一行的乘积. 2.np.lib.pad()函数用来把原来的list在原来的维度上进行扩展 例1 ...