phpmyadmin4.8.1后台 文件包含漏洞(CVE-2018-12613)

漏洞复现

 Qiqi's Blog     2018-10-30   1552 words    & views

phpmyadmin4.8.1后台 文件包含漏洞复现(CVE-2018-12613)

漏洞分析

index.php中看到了一个明显的文件包含

第61行,include $_REQUEST['target'];,我们只需要绕过if中的判断就可以传递一个target参数来包含恶意文件

根据第57行正则限制,target开头不能是index

第58行,target不能是黑名单中的import.phpexport.php

第59行,将target参数传入Core::checkPageValidity()方法,只要发挥结果为true就行了

我们找到Core.php

我们调用方法的时候没有传$whitelist参数,所以为默认值空数组

第445~447行:当$whitelist为空时,$whitelist=self::$goto_whitelist,如下

第456~463行:

mb_strpos:int mb_strpos ( string $haystack , string $needle [, int $offset= 0 [, string $encoding= mb_internal_encoding() ]] ),返回 $haystack$needle 首次出现位置的数值

mb_substr:string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] ),从$str字符串中,提取从$start位置开始,长度为$length的字符串

获取$page?前的所有字符串,不存在时获取全部字符串,然后判断是否在$whitelist数组中,若存在返回true

在这里,我们只要使target=db_sql.php?/../../../......类似于这样就可以绕过白名单检测了

进而利用目录穿越,就可以包含本地文件

这里我遇到了一个问题,别的文档里都说要利用后面的urldecode才可以,但是我这里直接用了?也读取成功了

不知道有没有师傅解答一下

正常思路往下走,这里是无法利用的,往后看

第465~473行,和上面基本一样,唯一不一样的就是第465行的$_page = urldecode($page),这是绕过的关键

我们可以双重编码绕过,将?编码两次,变成%253f,首先自动解码一次变成%3f,再通过urldecode变成?,不仅成功绕过白名单,还能够利用目录穿越包含本地文件

漏洞利用

包含本地系统文件

如上

命令执行

利用PHP SESSION序列化数据

每次我们登录phpmyadmin的时候,系统就会产生一个sess_sessionID文件,然后在里面执行的操作,会被记录到这个文件内,我这里实在/tmp目录下的

查看一下phpmyadmin的sessionid

所以我这里的文件就是/tmp/sess_9ec5f43948c5a5d6e54fd70b536a3aec

然后打开sql,执行SELECT '<?php phpinfo()?>;'

同理,我们去包含一下这个session文件

成功执行

尝试SELECT '<?php eval($_GET[c]);exit();?>';

利用mysql的data文件

我们建立一个数据表,再将<?php eval($_GET[c]);?>写入列名

我们用show variables like '%datadir%';语句查询一下data文件的绝对路径是在/var/lib/mysql

但是我发现并没有这个目录

所以没法复现了,如果能够包含到这个数据表文件,我们同样可以执行命令