日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

metinfo mysql_Metinfo 5.3.17 前台SQL注入漏洞

發布時間:2024/8/23 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

沒有什么其他條件了,無需登錄即可觸發。

總結

以上是生活随笔為你收集整理的metinfo mysql_Metinfo 5.3.17 前台SQL注入漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。