天天看點

淺談對寬位元組注入的認識

寬位元組注入之前看到過,但是沒有實戰過,後面也沒有找到合适的測試環境,今天剛好看到一個關于寬位元組注入的ctf題,是以借此來學習下寬位元組注入,如果寫得不好的地方,煩請各位多多指導,謝謝!本文主要是簡單介紹下寬位元組注入,以及如何通過手工和工具進行寬位元組注入的一個利用,通過本文我主要學習到以下三點:

1、擴充了我對SQL注入進行探測的一個思路!

2、學習了如何使用寬位元組探測注入!

3、如何使用sqlmap自動化對寬位元組進行注入!

這裡的寬位元組注入是利用mysql的一個特性,mysql在使用GBK編碼(GBK就是常說的寬位元組之一,實際上隻有兩位元組)的時候,會認為兩個字元是一個漢字(前一個ascii碼要大于128,才到漢字的範圍),而當我們輸入有單引号時會自動加入\進行轉義而變為\’(在PHP配置檔案中magic_quotes_gpc=On的情況下或者使用addslashes函數,icov函數,mysql_real_escape_string函數、mysql_escape_string函數等,送出的參數中如果帶有單引号’,就會被自動轉義\’,使得多數注入攻擊無效),由于寬位元組帶來的安全問題主要是吃ASCII字元(一位元組)的現象,将後面的一個位元組與前一個大于128的ascii碼進行組合成為一個完整的字元(mysql判斷一個字元是不是漢字,首先兩個字元時一個漢字,另外根據gbk編碼,第一個位元組ascii碼大于128,基本上就可以了),此時’前的\就被吃了,我們就可以使用’了,利用這個特性進而可實施SQL注入的利用。

<a href="https://s3.51cto.com/wyfs02/M02/A4/96/wKioL1muOe7zTMH1AAAl9kGa0t4720.png" target="_blank"></a>

圖1   将十進制129轉換為十六進制

本次實驗環境如下:

URL位址:http://103.238.227.13:10083/

相關版本資訊:PHP 7.0.7、mysql 5.5.48-log!

WebServer: nginx!

Content-Type: text/html; charset=gbk!

以上多數資訊可使用F12進行簡單的資訊收集(近期我正在将我目前會的滲透實戰中常用的資訊收集進行整理,其中第一個資訊收集就是F12資訊收集),通過F12我們收集到如圖2所示資訊,另外我們也可通過添加火狐插件server-spy進行這些資訊的擷取。

<a href="https://s2.51cto.com/wyfs02/M01/A4/96/wKioL1muOkLDwHDQAABYoweGnro917.jpg" target="_blank"></a>

圖2   F12資訊收集

今天學習到了一個SQL注入探測的一個簡單思路,而不是說就簡單的and或者or以及’進行探測,或者直接使用sqlmap的-b參數來進行探測(以前的我是這樣的),是以可能錯過了好幾個億。對SQL注入進行探測主要可根據以下思路來進行:

第一步: 簡單使用and、or、’,判斷是否有注入,不行接着加入一些自己創的語句簡單判斷(如order by看有沒有報錯等)!

第二步,如果第一步沒有看到效果,可進行寬位元組注入探測,輸入%bf'(或者%81’),發現報錯,存在寬位元組注入!

第三步,如果上述兩步都沒有效果,可以接着但不限于http頭注入探測(sqlmap的話使用—level參數進行設定),等等。

SQL注入根據不同的标準有不同的分類,如根據參數類型可分為數值型注入、字元型注入,根據注入的位置可分為POST注入、GET注入、cookie注入等,而sqlmap則将注入分為基于布爾的盲注、基于時間的盲注、基于報錯的注入、聯合查詢注入、堆查詢注入,這裡為了友善我将SQL分為寬位元組注入和非寬位元組注入(個人分類,沒有依據)。

寬位元組注入在實際滲透測試中也是存在的,隻是很少很少,這次剛好看到一個寬位元組注入的ctf,也順便再認真學習寫寬位元組注入的一些基本知識。如圖3,通過提示我們可知該題是一道字元型的注入。

<a href="https://s3.51cto.com/wyfs02/M02/A4/96/wKioL1muOk_C1Fb_AAA6YZw0gTI732.jpg" target="_blank"></a>

圖3   注入測試提示

既然是字元型的注入,那麼我們可以使用’和and來進行簡單的判斷,該測試點是否是SQL注入點!通過使用’,我們無法判斷是否存在注入,沒有可供我們判斷的資訊,如圖4所示。

<a href="https://s5.51cto.com/wyfs02/M00/05/E6/wKiom1muOnihS8I2AAA3Bg_y1k8106.jpg" target="_blank"></a>

圖4   ‘無法判斷是否是注入

我們結合and來進一步判斷,但是依舊沒有任何資訊可供我們進行判斷該測試點是否是注入點,如圖5所示。

<a href="https://s5.51cto.com/wyfs02/M00/05/E6/wKiom1muOoiB10ETAABCELi4Z0A630.jpg" target="_blank"></a>

圖5   and也無法判斷是否是注入點

難道是不存注入(這肯定不是這樣的),那我們使用神器sqlmap盲跑試試,但是很失望,居然沒有直接告訴我們有沒有存在注入點,如圖6所示。

<a href="https://s4.51cto.com/wyfs02/M00/A4/97/wKioL1muOnjR5nf6AAAkUqeDLGQ281.jpg" target="_blank"></a>

圖6   sqlmap提示不像是注入

如果按照我以前的思路,我可能就已經放棄了,在實戰中的話可能就認為真的不是注入點了(有點草率),此時我們使用思路的第二步來進行判斷,該測試點是不是寬位元組注入,我們使用ascii碼的129(也即是%81,可以使用常使用的%df)進行探測,如圖7所示,發現頁面報錯了,根據頁面資訊可判斷該測試點存在SQL注入,并且是寬位元組注入。

<a href="https://s3.51cto.com/wyfs02/M00/A4/97/wKioL1muOoKwSHmaAAAhcbpRoLY297.jpg" target="_blank"></a>

圖7   判斷注入是寬位元組注入

通過上面我們可知,該注入點是寬位元組注入,且是字元型的注入,此時我們可通過構造SQL語句來進行SQL的寬位元組注入,另外我們也可測試下我們輸入的’是否被轉義成為了\’,如圖8所示,我們輸入的’确實被轉義了!

<a href="https://s1.51cto.com/wyfs02/M01/05/E6/wKiom1muOqqhapyAAAAiB_UYRQo004.jpg" target="_blank"></a>

圖8   '被轉義了

此時我們可構造語句%81’ and 1=1---來進行注入,原因是’被轉義成為\’,而%81的ascii碼大于128,此時%81’就被看作一個字元(兩個位元組),此時’就可以使用了,而後面我們構造一個數值型的注入語句,最後再加注釋把最後的那個’注釋點,如圖9所示。

<a href="https://s2.51cto.com/wyfs02/M01/A4/97/wKioL1muOpjT5TcSAABCE9Wtyz8805.png" target="_blank"></a>

圖9   寬位元組注入

此時我們使用order by來看看目前資料庫有幾列,發現資料庫有三列,如圖10所示

<a href="https://s1.51cto.com/wyfs02/M02/05/E6/wKiom1muOsSipo4tAAD0YdXNDdc961.png" target="_blank"></a>

圖10  目前資料庫有3列

我們看看我們将要查詢的資料會在頁面中哪些地方顯示,如圖11所示。

<a href="https://s5.51cto.com/wyfs02/M00/05/E6/wKiom1muOs-T_KFxAAAnGzYiai0006.jpg" target="_blank"></a>

圖11   查詢在頁面中顯示的位置

在前面我們直接使用sqlmap盲跑,是沒有發現該測試點是SQL注入點的,根據上面的特性,我們可以在id後面添加一個%81’,然後在使用sqlmap進行注入,注入語句為:

1

<code>sqlmap.py -u</code><code>"http://103.238.227.13:10083/?id=1%81’"</code> <code>-b</code>

這是,我們發現sqlmap可成功發現該注入點了,如圖12所示。

<a href="https://s3.51cto.com/wyfs02/M02/A4/97/wKioL1muOryR6xMAAAAYsdziOtE861.jpg" target="_blank"></a>

圖12 sqlmap成功檢測出該注入點

除了上面的這種方法外,我們可以使用寬位元組注入腳本來使用sqlmap進行注入,注入語句為:

<code>sqlmap.py -u</code><code>"http://103.238.227.13:10083/?id=1"</code> <code>-b --tamper=unmagicquotes.py</code>

這樣我們也能成功探測出該注入點,如圖13所示,對于後續的注入此處不再累贅!

<a href="https://s2.51cto.com/wyfs02/M01/05/E6/wKiom1muOubBzsm8AABr6mBp9g8691.jpg" target="_blank"></a>

圖13   sqlmap成功檢測出注入點

就是在初始化連接配接和字元集之後,使用SET character_set_client=binary來設定用戶端的字元集是二進制的,另外對于伺服器端傳回的錯誤資訊要麼進行自定義,要麼進行歸一化的錯誤提示!以上建議僅供參考!

本文轉自 eth10 51CTO部落格,原文連結:http://blog.51cto.com/eth10/1962804

下一篇: BIP