webug4 0 寬位元組注入

2021-10-01 23:06:34 字數 3336 閱讀 2284

在php+mysql中, 可以通過轉義特殊字元來防止汙染sql語句(防注入),

有兩種情況:

魔術引號, magic_quote_gpc 開關,不過高版本的php將去除這個特性

安全函式, addslashes,mysql_real_escape_string,mysql_escape_string等。

上有計策下有對策, 當程式設計師設定資料庫編碼與php編碼為不同的兩種編碼,那麼就可能產生寬位元組注入, 也稱gbk雙位元組繞過。

也可以採用編碼繞過。

字元(character)是組成字符集(character set)的基本單位。對字元賦予乙個數值(encoding)來確定這個字元在該字符集中的位置。

由於ascii表示的字元只有128個,因此網路世界的規範是使用unicode編碼,但是用ascii表示的字元使用unicode並不高效。因此出現了中間格式字符集,被稱為通用轉換格式,及utf(universal transformation format)。

gb2312、gbk、gb18030、big5、shift_jis等這些都是常說的寬位元組,實際上只有兩位元組。寬位元組帶來的安全問題主要是吃ascii字元(一位元組)的現象,即將兩個ascii字元誤認為是乙個寬位元組字元。

php編碼為utf-8, 而mysql的編碼設定為set  names 'gbk'或set character_set_client=gbk,php中編碼為gbk,函式執行新增的是

ascii編碼,mysql預設字符集是gbk等寬位元組字符集。

這樣配置會引發編碼轉換從而導致的注入漏洞(乙個gbk編碼漢字,占用2個位元組,乙個utf-8編碼的漢字,占用3個位元組)

注入原理很簡單, 就是編碼, 一點一點分析:

假設乙個url有注入, 但是有安全函式, 我們敲單引號會被過濾,那麼怎麼辦呢?這時候就利用gbk雙位元組注入

我們在後邊這麼構造url乙個嘗試:

http://www.****.com/index.php?id=1%df' and 1=1
其中,

%df '  經過安全函式之後在 ' 之前會被加上乙個轉義符號'\', 即:  %df \'

由於採用的是url編碼, 最後轉化為:

%df%5c%27

關鍵就在這,%df會吃掉%5c,形成乙個新的位元組, 形象一點就是%df遇到%5c會把%5c吃掉,形成%df%5c,這個編碼經過**

解碼後會形成乙個漢字「誠」

還不明白? 沒關係, 舉乙個簡單的栗子:

xi'an (西安) ==>  xian(先) 

值得一提的是, 並不是唯一的使用%df, 只要編碼超過ascii碼(128)之後, 可以自己組合。只要是漢字就都可以使用

總的來解釋一下,

因為%df的關係,\的編碼%5c被吃掉了,也就失去了轉義的效果,即安全函式喪失了作用, 被直接帶入到mysql中,然後mysql在解讀時無視了%df%5c形成的新位元組,那麼單引號便重新發揮了效果, 就可以構造注入了。
話不多說, 直接實戰webug4.0 寬字元注入:

1)  嘗試舊方法, 發現不管輸入單引號還是整數型都無效, 於是初步判斷有安全函式

2)  嘗試寬字元注入:

可以看到, %df與轉義符結合形成乙個漢字(亂碼), 然後構造的單引號重新發揮了作用, 注入漏洞就因此產生。

最後我們再在url最後加乙個注釋符, 將php**中的字串引號注釋掉:

最終確認為寬字元注入型

3)  下面就是之前的常規操作了

構造url:  http://localhost:32768/control/sqlinject/width_byte_injection.php?id=1%df%27%20order%20by%203%23

再輸入2正常頁面, 得出欄位數為2

恩, 挺不錯的, 寬位元組注入的題, 關於資料庫也是相同的名字

果然, 引號還是會被安全函式轉義, 這裡採用編碼繞過:

webug_width_byte 對應的十六進製制編碼:  0x77656275675f77696474685f62797465

猜測資料在sqlinjection下

最終發現資料不在webug_width_byte資料庫中....哭暈...

還是老老實實爆webug那個資料庫吧......應該還是在env_list那個表中..

值得一提的是,  1)  記得要用資料庫.表來引用目標表, 因為不確定當前資料庫下也有相同的表名,

2)  通過前面的幾道題, 發現了第幾題的資料在對應題號的id中。

對於寬位元組編碼,有一種最好的修補就是:

(1)使用mysql_set_charset(gbk)指定字符集

(2)使用mysql_real_escape_string進行轉義

原理是,mysql_real_escape_string與addslashes的不同之處在於其會考慮當前設定的字符集,不會出現前面%df和%5c拼接為乙個寬位元組的問題,但是這個「當前字符集」如何確定呢?

就是使用mysql_set_charset進行指定。

上述的兩個條件是「與」運算的關係,少一條都不行。

參考: 

webug4 0 顯錯注入

0x01 mysql資料相關知識 1.mysql三種注釋風格 單行注釋 sql語句後使用字元 或者 進行注釋 多行注釋 使用 將sql語句圈起來注釋 內聯注釋 內聯注釋是mysql資料庫為了保持與其他資料庫相容,特意新增的新功能。把mysql特有的語句放在 中 2.union聯合查詢 1.union...

webug4 0 命令執行

0x01 漏洞利用 1.首先開啟頁面報錯 parse error syntax error,unexpected inc phpstudy www control more tp5 thinkphp library think loader.phpon line21遇到以上錯誤 以後大家記住了,就是...

webug4 0靶場之檔案上傳

webug4.0的檔案上傳靶場包括以下關卡 上傳前將php檔案字尾改為jpg繞過前端字尾名判斷 抓包修改為.php即可 從響應包中得到儲存路徑,訪問讀取phpinfo。繞過前端驗證後改為php字尾時,發現php字元被過濾 改用pht沒有反應,改大小寫也無果 最後發現雙寫php即可繞過 得到上傳路徑,...