当前位置:网站首页>phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
2022-08-08 20:45:00 【sayo.】
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
$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;
}
你需要:
1.$_REQUEST['target']不为空
2.$_REQUEST['target']是字符串
3.$_REQUEST['target']不以index开头
4.$_REQUEST['target']不在$target_blacklist中
‘import.php’, ‘export.php’
5.Core::checkPageValidity($_REQUEST['target'])为真
代码在libraries\classes\Core.php 443-476行
check函数本身
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;
}
上面提到的whitelist就是白名单
$_page是取出$page问号前的东西,是考虑到target有参数的情况,只要$_page在白名单中就直接return true
但还考虑了url编码的情况,所以如果这步判断未成功,下一步又进行url解码
看似能够非常完美地能够验证请求的文件是正确的,但是利用url二次编码就可以绕过了。
由于服务器会自动解码一次,所以在checkPageValidity()中,$page的值一开始会是db_datadict.php%3f,又一次url解码后变成了db_datadict.php?,这次便符合了?前内容在白名单的要求,函数返回true
但在index.php中$_REQUEST[‘target’]仍然是db_datadict.php%3f,而且会被include,通过目录穿越,就可造成任意文件包含
其实也就是说在返回true的前提下进行目录穿越就可以了,直接的?,也是可以的
边栏推荐
猜你喜欢
随机推荐
The new database is online | CnOpenData information transmission, software and information technology service industry basic information data of industrial and commercial registered enterprises
XTU OJ 1075 求最小公倍数
关于KotlinAndroid遇到的小知识
MySQL权限管理
com.alibaba.fastjson.JSONException: default constructor not found. class
DCT变换
箭头函数this指向的解释
二分查找的坑
Kotlin之JSON格式解析
什么是仿射函数?
Kotlin反射
Ansible自动化运维工具(二)playbook剧本
IO in Kotlin flow
Kotlin - learn the fifth day of the Handler
兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04
源码分析MyCat专栏
nacos作用
投资基金定投安全吗
WPF主窗体调用 User32的SetWindowPos 设置窗体置顶会导致与其他窗体抢夺焦点的问题
Flask 教程 第十一章:美化









