CVE-2018-12613
Posted yichen115
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CVE-2018-12613相关的知识,希望对你有一定的参考价值。
问题在index.php的55~63行
// 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包含参数
1.不为空
2.是字符串
3.不以index开头
4.不能出现在:$target_blacklist中
5.Core类的checkPageValidity方法判断
前三个基本忽略,第四个发现
/index.php //line 50-52 $target_blacklist = array ( ‘import.php‘, ‘export.php‘ );
也就是target不能是import.php和export.php
最后是Core类checkPageValidity函数判断
//443-478 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;
函数里又是五个判断:
1.$whitelist为空则引用静态声明:$goto_whitelist
2.如果$page没有被定义不是字符串则返回false
3.如果$page存在$whitepage则返回true
4.如果$_page存在$whitelist则返回true($_page是取出$page问号前面的东西)
5.经过url解码后$_Page存在$whitelist中则返回true
当index.php调用checkPageValidity时并没有传$whitelist的值,所以会进入self::$goto_whitelist;
public static $goto_whitelist = array( ‘db_datadict.php‘, ‘db_sql.php‘, ‘db_events.php‘, ‘db_export.php‘, ‘db_importdocsql.php‘, ‘db_multi_table_query.php‘, ‘db_structure.php‘, ...... ‘user_password.php‘, );
在$goto_whitelist中定义了可以被包含的文件名(很多,少些一部分)
第二个满足,直接跳过,第三个:
$_page = mb_substr( $page, 0, mb_strpos($page . ‘?‘, ‘?‘) ); if (in_array($_page, $whitelist)) return true;
如果$page等于$goto_whitelist某个值,则return true
这里考虑到target后面再跟参数的情况将$_page以?分割,然后去前面的字符再判断是否存在于$goto_whitelist中
还考虑到url编码的情况如果未成功下一步url解码
传入二次编码的内容就会让checkPageValidity后返回true
比如传入:?target=db_datadict.php%253f
服务器自动解码一次是?target=db_datadict.php%3f
在经过checkPageValidity函数解码变成:?target=db_datadict.php?
这便符合了?前面内容在白名单里会返回true,但是index.php中的$_REQUEST[‘target‘]仍然是db_datadict.php%3f,而且会被包含,通过目录穿越就会造成任意文件包含漏洞
以上是关于CVE-2018-12613的主要内容,如果未能解决你的问题,请参考以下文章
phpmyadmin 4.8.1远程文件包含漏洞(CVE-2018-12613)