metinfo mysql_Metinfo 5.3.17 前台SQL注入漏洞

Metinfo 8月1日升级了版本,修复了一个影响小于等于5.3.17版本(几乎可以追溯到所有5.x版本)的SQL注入漏洞。这个SQL注入漏洞不受软WAF影响,可以直接获取数据,影响较广。

### 0x01. 漏洞原理分析

漏洞出现在 `/include/global.func.php` 文件的 `jump_pseudo` 函数:

```

/*静态页面跳转*/

function jump_pseudo(){

global $db,$met_skin_user,$pseudo_jump;

global $met_column,$met_news,$met_product,$met_download,$met_img,$met_job;

global $class1,$class2,$class3,$id,$lang,$page,$selectedjob;

global $met_index_type,$index,$met_pseudo;

if($met_pseudo){

$metadmin[pagename]=1;

$pseudo_url=$_SERVER[HTTP_X_REWRITE_URL]?$_SERVER[HTTP_X_REWRITE_URL]:$_SERVER[REQUEST_URI];

$pseudo_jump=@strstr($_SERVER['SERVER_SOFTWARE'],'IIS')&&$_SERVER[HTTP_X_REWRITE_URL]==''?1:$pseudo_jump;

$dirs=explode('/',$pseudo_url);

$dir_dirname=$dirs[count($dirs)-2];

$dir_filename=$dirs[count($dirs)-1];

if($pseudo_jump!=1){

$dir_filenames=explode('?',$dir_filename);

switch($dir_filenames[0]){

case 'index.php':

if(!$class1&&!$class2&&!$class3){

if($index=='index'){

if($lang==$met_index_type){

$jump['url']='./';

}else{

$jump['url']='index-'.$lang.'.html';

}

}else{

if($lang==$met_index_type){

$jump['url']='./';

}else{

$id=$class3?$class3:($class2?$class2:$class1);

if($id){

$query="select * from $met_column where id='$id'";

}else{

$query="select * from $met_column where foldername='$dir_dirname' and lang='$lang' and (classtype='1' or releclass!='0') order by id asc";

}

$jump=$db->get_one($query);

$psid= ($jump['filename']<>"" and $metadmin['pagename'])?$jump['filename']:$jump['id'];

if($jump[module]==1){

$jump['url']='./'.$psid.'-'.$lang.'.html';

}else if($jump[module]==8){

$jump['url']='./'.'index-'.$lang.'.html';

}

else{

if($page&&$page!=1)$psid.='-'.$page;

$jump['url']='./'.'list-'.$psid.'-'.$lang.'.html';

}

}

}

...

}

```

代码截的不全,只关注一下这几个操作:

1. `$pseudo_url=$_SERVER[HTTP_X_REWRITE_URL]?$_SERVER[HTTP_X_REWRITE_URL]:$_SERVER[REQUEST_URI];`: 从`$_SERVER[HTTP_X_REWRITE_URL]`中获取`$pseudo_url`变量

2. `$dirs=explode('/',$pseudo_url);`:将`$pseudo_url`变量用斜线分割成$dirs数组

3. `$dir_dirname=$dirs[count($dirs)-2];`:获取`$dir`s的倒数第二个元素作为`$dir_dirnamr`变量

4. `$query="select * from $met_column where foldername='$dir_dirname' and lang='$lang' and (classtype='1' or releclass!='0') order by id asc";`:`$dir_dirname`变量被拼接进SQL语句

所以,通过分析可知,`$_SERVER[HTTP_X_REWRITE_URL]`的一部分,最终被拼接进SQL语句。那么,如果Metinfo没有对HTTP头进行验证的情况下,将导致一个SQL注入漏洞。

看一下Metinfo对于变量的获取方式:

```

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {

foreach($$_request as $_key => $_value) {

$_key{0} != '_' && $$_key = daddslashes($_value,0,0,1);

$_M['form'][$_key] = daddslashes($_value,0,0,1);

}

}

```

使用`daddslashes`函数过滤GPC变量,`daddslashes`这个函数确实很讨厌,不光有转义,而且有很不友好的软WAF。但我们这里这个注入点是来自于SERVER变量,所以是不受软WAF影响的。

### 0x02. 漏洞利用缺陷

那么,我们看看如何才能进入这个注入的位置。

`jump_pseudo`函数前面有一些条件语句,归纳一下主要有下面几个:

1. 需要满足`if($met_pseudo)...`

2. 需要满足`if($pseudo_jump!=1)...`

3. 需要满足`switch($dir_filenames[0]){ case 'index.php':...`

4. 需要满足`if(!$class1&&!$class2&&!$class3)...`

5. 不能满足`if($index=='index')...`

6. 不能满足`if($lang==$met_index_type)...`

翻译成汉字,大意就是:

1. `$met_pseudo`必须为真。`$met_pseudo`这个变量是指系统是否开启了伪静态,也就说这个漏洞需要开启伪静态才能够利用。

2. `$pseudo_jump`不等于1。这个条件,只要`$_SERVER[HTTP_X_REWRITE_URL]`有值即可满足。

3. `$dir_filenames[0`]必须等于`'index.php'`,这个变量是可控的。

4. `class1`、`class2`、`class`3不能有值。这个条件,只要我访问的是`index.php`,并且不主动传入这三个参数,即可满足。

5. `$index`不能等于`'index'`,这个变量也是可控的,传入参数`index=xxxx`即可

5. `$lang`不能等于`$met_index_type`

这6个条件语句中,2~5中的变量都可控,1中的变量只要开启伪静态即可满足,唯独6需要单独分析一下。

`$lang`是我们传入的参数,代表给访客显示的语言是什么。Metinfo默认安装时,将存在3种语言:简体中文(cn)、英文(en)、繁体中文(tc),而`$met_index_type`表示默认语言类型,默认是中文,也就是cn。

而Metinfo的配置(包括伪静态相关的配置),是和语言有关系的,不同语言的配置不相同。默认情况下,如果管理员在后台开启伪静态,将只会修改lang=cn时的配置。

那么,正常情况下,我们传入`index.php?lang=cn`,将会导致`if($lang==$met_index_type)...`这个条件成立,也就没法进入SQL注入的语句中;如果我们传入`index.php?lang=en`,又导致伪静态配置恢复默认,也就是`$met_pseudo = 0`,导致进不去步骤1的if语句;如果我们传入一个不存在的lang,比如`index.php?lang=xxx`,将会导致报错:`No data in the database,please reinstall.`

这就比较蛋疼。此时,就需要利用到Mysql的一个特性。

### 0x03. Mysql 大小写特性回顾

Mysql对于内容的存储方式,有如下两个概念:字符集(character set)和collation(比对方法)。

二者组合成Mysql的字符格式,一般来说分为这两类:

```

__

_bin

```

比如,最常用的`utf8_general_ci`,就是第一种格式。

我们这里需要关注的就是最后一串:ci、cs、bin,这三个究竟是什么?

ci 其实就是 case insensitive (大小写不敏感)的缩写, cs 是 case sensitive (大小写敏感)的缩写。也就是说,当我们用的字符格式是`utf8_general_ci`时,Mysql中比对字符串的时候是大小写不敏感的。

bin指的是比较的时候,按照二进制的方式比较,这种情况下就不存在大小写的问题了。bin方式还可以解决有些小语种上的特性,这个就不展开说了。

我们随便找了个数据表,做个小实验:

![](https://images.seebug.org/1502171597164)

可见上图,虽然我查询的SQL语句是```SELECT * FROM `wp_users` WHERE `user_login`='AdmIN'```,但实际上查询出来了用户名是admin的用户账户。

### 0x04. 完成漏洞利用

回到Metinfo,我们可以利用0x03中说到的Mysql特点,来绕过`if($lang==$met_index_type)...`的判断。

我们来看看Metinfo是如何获取系统配置的:

```

/*默认语言*/

$met_index_type = $db->get_one("SELECT * FROM $met_config WHERE name='met_index_type' and lang='metinfo'");

$met_index_type = $met_index_type['value'];

$lang=($lang=="")?$met_index_type:$lang;

$langoks = $db->get_one("SELECT * FROM $met_lang WHERE lang='$lang'");

if(!$langoks)die('No data in the database,please reinstall.');

if(!$langoks[useok]&&!$metinfoadminok)okinfo('../404.html');

if(count($met_langok)==1)$lang=$met_index_type;

/*读配置数据*/

$_M[config][tablepre]=$tablepre;

$query = "SELECT * FROM $met_config WHERE lang='$lang' or lang='metinfo'";

$result = $db->query($query);

while($list_config= $db->fetch_array($result)){

$_M[config][$list_config['name']]=$list_config['value'];

if($metinfoadminok)$list_config['value']=str_replace('"', '"', str_replace("'", ''',$list_config['value']));

$settings_arr[]=$list_config;

if($list_config['columnid']){

$settings[$list_config['name'].'_'.$list_config['columnid']]=$list_config['value'];

}else{

$settings[$list_config['name']]=$list_config['value'];

}

if($list_config['flashid']){

$list_config['value']=explode('|',$list_config['value']);

$falshval['type']=$list_config['value'][0];

$falshval['x']=$list_config['value'][1];

$falshval['y']=$list_config['value'][2];

$falshval['imgtype']=$list_config['value'][3];

$list_config['mobile_value']=explode('|',$list_config['mobile_value']);

$falshval['wap_type']=$list_config['mobile_value'][0];

$falshval['wap_y']=$list_config['mobile_value'][1];

$met_flasharray[$list_config['flashid']]=$falshval;

}

}

$_M[lang]=$lang;

@extract($settings);

```

可见,这里执行了这条SQL语句`SELECT * FROM $met_config WHERE lang='$lang' or lang='metinfo`',然后将结果`extract`到上下文中。

而`$met_config`这个表,格式就是`utf8_general_ci`,大小写不敏感。

所以,我只需要传入`index.php?lang=Cn`,在执行上述SQL语句的时候,不影响SQL语句的执行结果;而在进行`if($lang==$met_index_type)...`比较的时候,`Cn != cn`,成功进入else语句。

最后,构造下面数据包,注入获取结果:

![](https://images.seebug.org/1502171671620)

### 0x05. 漏洞利用条件

主要条件就是,需要管理员开启伪静态:

![](https://images.seebug.org/1502171689998)

没有什么其他条件了,无需登录即可触发。

loading-bars.svg

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

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

相关文章

冒泡和快速排序的时间复杂度_三分钟快速记住冒泡排序算法

冒泡排序名字由来&#xff1a;是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列)&#xff0c;就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样&#xff0c;故名“冒泡排序”。冒泡排序原理&#xff1a;①、比较相邻的元素。如果第一个比第二个大&#xf…

js二维数组arr中表示读取第i行第j列的是:_c++ c语言 数组与字符串

c语法7 - 数组与字符串概述定义&#xff1a;把具有相同类型的若干变量按有序形式组织起来称为数组。C语言数组属于构造数据类型。一个数组可以分解为多个数组元素&#xff0c;这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同&#xff0c;数组又可分为数…

eprime经典程序案例_小程序经典案例!写字楼里的小店铺如何利用小程序增加人流量!...

大家好&#xff0c;我是柳州木子科技&#xff0c;当前短视频营销如火如荼&#xff0c;相比之下小程序不温不火&#xff0c;我还是那句话&#xff0c;是因为小程序没有把成功案例挖掘出来&#xff0c;通过小程序卖货赚钱的大有人在。前几篇分享了小程序玩赚的文章案例&#xff0…

怎么看电脑配置高不高_电脑店学徒写的电脑配置单处处都是“亮点”,能“气死”师傅...

无论选择哪种类型的电脑都要把重点放在电脑硬件配置上面&#xff0c;电脑的性能完全依靠硬件配置的组合情况&#xff0c;电脑的价格高低标准依据同样是看电脑硬件配置组合情况&#xff0c;对于组装电脑来说&#xff0c;那硬件组合情况就格外重要了&#xff0c;因为组装电脑的硬…

hao123电脑版主页_百度浏览器停更没关系,hao123才令人唏嘘!

月初&#xff0c;百度浏览器官网发布公告&#xff0c;“由于部门业务调整&#xff0c;官方将于2019年4月30日对产品部分功能停止服务。相关的产品包括桌面百度、百度工具栏、百度地址栏、百度极速浏览器、hao123浏览器&#xff0c;产品将不再更新&#xff0c;基本功能本地仍可使…

笔记本电脑摄像头不能用_电脑没有摄像头怎么办

现在大多数家庭电脑都没有配备摄像头&#xff0c;或者大多数普通笔记本电脑的摄像头又非常模糊&#xff0c;如果突然要用摄像头的话又不能马上买。但是手机上的摄像头又那么清楚&#xff0c;有没有办法把手机上的摄像头装到电脑上面呢&#xff1f;今天我要推荐的一款软件是Droi…

excel取消隐藏_猴哥讲述:对excel工作表进行隐藏和取消隐藏的操作行为

有的时候因为工作需要&#xff0c;我们会在一个工作簿中创建插入多个excel工作表&#xff0c;如果工作表越来越多&#xff0c;我们在选择操作工作表的时候很不方便&#xff0c;我们这时候就可以对excel工作表进行隐藏&#xff0c;excel工作表隐藏和取消隐藏的操作方法如下&…

mysql大量数据合并_mysql中将多行数据合并成一行数据

一个字段可能对应多条数据&#xff0c;用mysql实现将多行数据合并成一行数据例如&#xff1a;一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句&#xff1a;1 SELECT am.activeId,m.modelName2 FROM activemodel am3 JOIN model m4 ON am.modelId m.modelId5…

不同图像锐化算子提取的图像信息有哪些不同_传统图像处理

传统图像处理一、边缘检测算子①Sobel算子该算子中引入了类似局部平均的运算&#xff0c;因此对噪声具有平滑作用&#xff0c;能很好的消除噪声的影响。与Prewitt算子相比&#xff0c;Sobel算子对于像素的位置的影响做了加权&#xff0c;可以降低边缘模糊程度&#xff0c;因此效…

文本聚类分析算法_聚类分析算法综述

前 言聚类是人类认识未知世界的一种重要的认知手段。在生产和生活中,人们往往面对非常复杂的事和物,如果能够把相似的东西归为一类,有明显区别的事物分属在不同的类别中,处理起来就大为简便。所谓“物以类聚,人以群分”,说的就是这个道理。譬如人们将生物分为动物和植物,又根据…

按照标题排序mysql_Oracle EBS Form中实现点击列标题进行排序

在做EBS表单开发时&#xff0c;虽然使用folder功能提供了排序功能&#xff0c;对多行数据块可以对前三列进行指定排序&#xff0c;也可以单击前三列的列标题进行排27.1 问题描述在做EBS表单开发时&#xff0c;虽然使用folder功能提供了排序功能&#xff0c;对多行数据块可以对前…

vscode导入本地jar包_go导入本地包踩坑(已解决!)

当我想要仿照C语言的大程序结构&#xff0c;来写go语言的程序&#xff0c;出现下面的报错&#xff08;ps&#xff1a;系统是windows&#xff0c;文本编辑器&#xff08;或称IDE&#xff09;是vscode&#xff09;然后vscode还会时不时地在右下角出现这样地提示信息对于go语言新手…

java super用法_Java基础面试题汇总

blog.csdn.net/ThinkWon/article/details/104390612Java概述何为编程编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码&#xff0c;并最终得到结果的过程。为了使计算机能够理解人的意图&#xff0c;人类就必须要将需解决的问题的思路、方法、和手段通过计算…

java string返回_Java的String字符串内容总结

String--字符串获取字符串的长度使用Sring类的length()方法可获取字符串对象的长度&#xff0c;例&#xff1a;str.length();str代表指定的字符串对象;返回值为返回指定字符串的长度。例&#xff1a;获取字符串中指定字符的索引位置String类提供了indexOf()和lastIndexOf()方法…

汉诺塔java程序_Java编写一个汉诺塔的过程

[java]代码库/** 需求&#xff1a;用Java编写一个汉诺塔的过程* 汉若塔问题&#xff0c;就是把A柱子上面从大到小一次叠放的盘子借助B柱移到C柱上去&#xff0c;规则是一次只能移动一个盘子&#xff0c;大盘子不能放到小盘子之上** 思想&#xff1a;采用递归的方法来接* 1. 先将…

ajax 同步_第3部分-0:同步和异步,还有回调需要了解一下

同步是什么异步是什么 异步场景&#xff1a; &#xff08;1&#xff09;定时任务 &#xff08;2&#xff09;网络请求&#xff1a;Ajax 、图片加载 全面分析前端的网络请求方式 &#xff08;3&#xff09;事件绑定 异步产生知识点&#xff1a; 进程和线程 单线程 记一次 Vue 移…

音频重采样有什么用_最佳音频接口基本购买指南

音频接口是计算机实现录音功能的媒介设备&#xff0c;用于将乐器和麦克风发出的声音转换为数字信息&#xff0c;以便计算机可以理解并存储在硬盘上。在播放音频时&#xff0c;接口将数字音频文件重新转换为模拟信号&#xff0c;然后用监听音箱或耳机播放出来。简而言之&#xf…

java 正则 最后一个字符_正则表达式怎么匹配字符串中最后一串数字?

展开全部importretempDwellTime:666mre.search(r\d*,temp)printrepr(m.group()),m.start(),m.end()mre.search(r\d,temp)printrepr(m.group()),m.start(),m.end()printre.findall(r\d*,temp)输出&#xff1a;006661114[,,,,,,,,,,,666,]扩展资料正则表达式&#xff0c;校验数字…

lombok原理_听说学会用 Lombok 就可以让你早点下班?(你还不看)

听说隔壁用 Lombok 的六点就下班了&#xff0c;我也想六点下班&#xff01;好的&#xff0c;那么这篇文章就介绍下什么是 Lombok&#xff0c;Lombok 做了什么以及 Lombok 是怎么做的&#xff1f;在介绍之前&#xff0c;先通过是否使用 Lombok 的效果来看下对比&#xff0c;首先…

idea jar包导入_IDEA 实用功能Auto Import:自动优化导包(自动删除、导入包)

下面介绍一下IDEA的一个能显著提升写代码效率的非常好用的功能设置—— Auto ImportAuto Import的功能是可以帮助我们自动删除无用的包Import(未被引用)&#xff0c;以及自动Import填充尚未导入的包。完全智能化地帮助我们在开发程序时&#xff0c;省略了导包的操作&#xff0c…