偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

對(duì)寬字節(jié)注入的漏洞實(shí)現(xiàn)淺析和如何簡(jiǎn)單修復(fù)

原創(chuàng)
安全 漏洞
本文主要是簡(jiǎn)單介紹下寬字節(jié)注入,以及如何通過手工和工具進(jìn)行寬字節(jié)注入的一個(gè)利用。在初始化連接和字符集之后,使用SET character_set_client=binary來設(shè)定客戶端的字符集是二進(jìn)制的,另外對(duì)于服務(wù)器端返回的錯(cuò)誤信息要么進(jìn)行自定義,要么進(jìn)行歸一化的錯(cuò)誤提示!

【51CTO.com原創(chuàng)稿件】寬字節(jié)注入之前我看到過,但是沒有實(shí)戰(zhàn)過,后面也沒有找到合適的測(cè)試環(huán)境,今天剛好看到一個(gè)關(guān)于寬字節(jié)注入的ctf題,因此借此來學(xué)習(xí)下寬字節(jié)注入,如果寫得不好的地方,煩請(qǐng)各位多多指導(dǎo)!

本文主要是簡(jiǎn)單介紹下寬字節(jié)注入,以及如何通過手工和工具進(jìn)行寬字節(jié)注入的一個(gè)利用,通過本文主要可學(xué)習(xí)到以下三點(diǎn):

  1. 擴(kuò)展了對(duì)SQL注入進(jìn)行探測(cè)的一個(gè)思路!
  2. 學(xué)習(xí)了如何使用寬字節(jié)探測(cè)注入!
  3. 如何使用sqlmap自動(dòng)化對(duì)寬字節(jié)進(jìn)行注入!

1. 寬字節(jié)注入

這里的寬字節(jié)注入是利用MySQL的一個(gè)特性,MySQL在使用GBK編碼(GBK就是常說的寬字節(jié)之一,實(shí)際上只有兩字節(jié))的時(shí)候,會(huì)認(rèn)為兩個(gè)字符是一個(gè)漢字(前一個(gè)ascii碼要大于128,才到漢字的范圍),而當(dāng)我們輸入有單引號(hào)時(shí)會(huì)自動(dòng)加入\進(jìn)行轉(zhuǎn)義而變?yōu)閈’(在PHP配置文件中magic_quotes_gpc=On的情況下或者使用addslashes函數(shù),icov函數(shù),mysql_real_escape_string函數(shù)、mysql_escape_string函數(shù)等,提交的參數(shù)中如果帶有單引號(hào)’,就會(huì)被自動(dòng)轉(zhuǎn)義\’,使得多數(shù)注入攻擊無效),由于寬字節(jié)帶來的安全問題主要是吃ASCII字符(一字節(jié))的現(xiàn)象,將后面的一個(gè)字節(jié)與前一個(gè)大于128的ascii碼進(jìn)行組合成為一個(gè)完整的字符(MySQL判斷一個(gè)字符是不是漢字,首先兩個(gè)字符是一個(gè)漢字,另外根據(jù)gbk編碼,第一個(gè)字節(jié)ascii碼大于128,基本上就可以了),此時(shí)’前的\就被吃了,我們就可以使用’了,利用這個(gè)特性從而可實(shí)施SQL注入的利用。

最常使用的寬字節(jié)注入是利用%df,其實(shí)只要第一個(gè)ascii碼大于128就可以了,比如ascii碼為129的就可以,但是我們?cè)趺磳⑺D(zhuǎn)換為URL編碼呢?其實(shí)很簡(jiǎn)單,我們先將129(十進(jìn)制)轉(zhuǎn)換為十六進(jìn)制,為0x81,如圖1所示,然后在十六進(jìn)制前面加%即可,即為%81,任意進(jìn)制在線轉(zhuǎn)換網(wǎng)站請(qǐng)點(diǎn)擊此處!另外可以直接記住GBK首字節(jié)對(duì)應(yīng)0×81-0xFE,尾字節(jié)對(duì)應(yīng)0×40-0xFE(除0×7F),則尾字節(jié)會(huì)被吃點(diǎn),如轉(zhuǎn)義符號(hào)\對(duì)應(yīng)的編碼0×5C!另外簡(jiǎn)單提一下,GB2312是被GBK兼容的,它的高位范圍是0xA1-0xF7,低位范圍是0xA1-0xFE(0x5C不在該范圍內(nèi)),因此不能使用編碼吃掉%5c。

將十進(jìn)制129轉(zhuǎn)換為十六進(jìn)制

圖1 將十進(jìn)制129轉(zhuǎn)換為十六進(jìn)制

2. 實(shí)驗(yàn)環(huán)境

本次實(shí)驗(yàn)環(huán)境如下:

URL地址:http://103.238.227.13:10083/

相關(guān)版本信息:

  • PHP 7.0.7、mysql 5.5.48-log!
  • WebServer: nginx!
  • Content-Type: text/html; charset=gbk!

以上多數(shù)信息可使用F12進(jìn)行簡(jiǎn)單的信息收集(近期我正在將我目前會(huì)的滲透實(shí)戰(zhàn)中常用的信息收集進(jìn)行整理,其中第一個(gè)信息收集就是F12信息收集),通過F12我們收集到如圖2所示信息,另外我們也可通過添加火狐插件server-spy進(jìn)行這些信息的獲取。

F12信息收集

圖2 F12信息收集

3. SQL注入簡(jiǎn)單思路

今天學(xué)習(xí)到了一個(gè)SQL注入探測(cè)的一個(gè)簡(jiǎn)單思路,而不是說就簡(jiǎn)單的and或者or以及’進(jìn)行探測(cè),或者直接使用sqlmap的-b參數(shù)來進(jìn)行探測(cè)(以前的我是這樣的),因此可能錯(cuò)過了好幾個(gè)億。對(duì)SQL注入進(jìn)行探測(cè)可根據(jù)以下思路來進(jìn)行:

第一步: 簡(jiǎn)單使用and、or、’,判斷是否有注入,不行接著加入一些自創(chuàng)的語句進(jìn)行簡(jiǎn)單判斷(如order by看有沒有報(bào)錯(cuò)等)!

第二步,如果第一步?jīng)]有看到效果,可進(jìn)行寬字節(jié)注入探測(cè),輸入%bf'(或者%81’),發(fā)現(xiàn)報(bào)錯(cuò),存在寬字節(jié)注入!

第三步,如果上述兩步都沒有效果,可以接著但不限于http頭注入探測(cè)(sqlmap的話使用—level參數(shù)進(jìn)行設(shè)置),等等。

4. 注入類型探測(cè)

SQL注入根據(jù)不同的標(biāo)準(zhǔn)有不同的分類,如根據(jù)參數(shù)類型可分為數(shù)值型注入、字符型注入,根據(jù)注入的位置可分為POST注入、GET注入、cookie注入等,而sqlmap則將注入分為基于布爾的盲注、基于時(shí)間的盲注、基于報(bào)錯(cuò)的注入、聯(lián)合查詢注入、堆查詢注入,這里為了方便我將SQL分為寬字節(jié)注入和非寬字節(jié)注入(個(gè)人分類,沒有依據(jù))。

寬字節(jié)注入在實(shí)際滲透測(cè)試中也是存在的,只是很少很少,這次剛好看到一個(gè)寬字節(jié)注入的ctf,也順便再認(rèn)真學(xué)習(xí)寫寬字節(jié)注入的一些基本知識(shí)。如圖3,通過提示我們可知該題是一道字符型的注入。

注入測(cè)試提示

圖3 注入測(cè)試提示

既然是字符型的注入,那么我們可以使用’和and來進(jìn)行簡(jiǎn)單的判斷,該測(cè)試點(diǎn)是否是SQL注入點(diǎn)!通過使用’,我們無法判斷是否存在注入,沒有可供我們判斷的信息,如圖4所示。

‘無法判斷是否是注入

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

我們結(jié)合and來進(jìn)一步判斷,但是依舊沒有任何信息可供我們進(jìn)行判斷該測(cè)試點(diǎn)是否是注入點(diǎn),如圖5所示。

and也無法判斷是否是注入點(diǎn)

圖5 and也無法判斷是否是注入點(diǎn)

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

sqlmap提示不像是注入

圖6 sqlmap提示不像是注入

如果按照我以前的思路,我可能就已經(jīng)放棄了,在實(shí)戰(zhàn)中的話可能就認(rèn)為真的不是注入點(diǎn)了(有點(diǎn)草率),此時(shí)我們使用思路的第二步來進(jìn)行判斷,該測(cè)試點(diǎn)是不是寬字節(jié)注入,我們使用ascii碼的129(也即是%81,可以使用常使用的%df)進(jìn)行探測(cè),如圖7所示,發(fā)現(xiàn)頁面報(bào)錯(cuò)了,根據(jù)頁面信息可判斷該測(cè)試點(diǎn)存在SQL注入,并且是寬字節(jié)注入。

判斷注入是寬字節(jié)注入

圖7 判斷注入是寬字節(jié)注入

5. 寬字節(jié)手工簡(jiǎn)單注入

通過上面的說明,我們可知該注入點(diǎn)是寬字節(jié)注入,且是字符型的注入,此時(shí)我們可通過構(gòu)造SQL語句來進(jìn)行SQL的寬字節(jié)注入,另外我們也可測(cè)試下我們輸入的’是否被轉(zhuǎn)義成為了\’,如圖8所示,我們輸入的’確實(shí)被轉(zhuǎn)義了!

‘被轉(zhuǎn)義了

圖8 ‘被轉(zhuǎn)義了

此時(shí)我們可構(gòu)造語句%81’ and 1=1-- -來進(jìn)行注入,原因是’被轉(zhuǎn)義成為\’,而%81的ascii碼大于128,此時(shí)%81’就被看作一個(gè)字符(兩個(gè)字節(jié)),此時(shí)’就可以使用了,而后面我們構(gòu)造一個(gè)數(shù)值型的注入語句,最后再加注釋把最后的那個(gè)’注釋掉,如圖9所示。

寬字節(jié)注入

圖9 寬字節(jié)注入

此時(shí)我們使用order by來看看當(dāng)前數(shù)據(jù)庫有幾列,發(fā)現(xiàn)數(shù)據(jù)庫有三列,如圖10所示:

當(dāng)前數(shù)據(jù)庫有3列

圖10 當(dāng)前數(shù)據(jù)庫有3列

我們看看我們將要查詢的數(shù)據(jù)會(huì)在頁面中哪些地方顯示,如圖11所示。

查詢?cè)陧撁嬷酗@示的位置

圖11 查詢?cè)陧撁嬷酗@示的位置

到此,手工注入就結(jié)束了,后續(xù)操作請(qǐng)查看我的文章《mysql手工注入》的最后部分!

6. 寬字節(jié)sqlmap注入

在前面我們直接使用sqlmap盲跑,是沒有發(fā)現(xiàn)該測(cè)試點(diǎn)是SQL注入點(diǎn)的,根據(jù)上面的特性,我們可以在id后面添加一個(gè)%81’,然后在使用sqlmap進(jìn)行注入,注入語句為:

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

這時(shí),我們發(fā)現(xiàn)sqlmap可成功發(fā)現(xiàn)該注入點(diǎn)了,如圖12所示。

sqlmap成功檢測(cè)出該注入點(diǎn)

圖12 sqlmap成功檢測(cè)出該注入點(diǎn)

除了上面的這種方法外,我們可以使用寬字節(jié)注入腳本來使用sqlmap進(jìn)行注入,注入語句為:

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

這樣我們也能成功探測(cè)出該注入點(diǎn),如圖13所示,對(duì)于后續(xù)的注入此處不再累贅!

sqlmap成功檢測(cè)出注入點(diǎn)

圖13 sqlmap成功檢測(cè)出注入點(diǎn)

7. 簡(jiǎn)單修復(fù)建議

在初始化連接和字符集之后,使用SET character_set_client=binary來設(shè)定客戶端的字符集是二進(jìn)制的,另外對(duì)于服務(wù)器端返回的錯(cuò)誤信息要么進(jìn)行自定義,要么進(jìn)行歸一化的錯(cuò)誤提示!

【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】

責(zé)任編輯:趙寧寧 來源: 51CTO.com
相關(guān)推薦

2014-04-08 16:02:28

寬字節(jié)注入數(shù)據(jù)安全MYSQL

2009-03-27 10:53:52

注入SQLMySQL

2010-09-09 17:22:14

2011-10-26 10:33:42

phpMyFAQ

2018-11-21 10:13:35

2021-09-16 09:05:45

SQL注入漏洞網(wǎng)絡(luò)攻擊

2009-07-02 10:03:02

DataView排序

2013-08-19 13:55:42

2013-08-19 16:02:31

2015-03-25 19:15:08

2010-12-16 10:56:23

2024-12-05 08:58:47

2015-09-16 16:51:21

2010-10-12 16:33:40

2021-03-29 12:57:31

漏洞OpenSSLDos

2010-05-14 12:00:36

2010-11-01 17:01:22

2009-10-23 13:08:23

2009-01-16 16:26:19

2010-10-22 15:18:18

SQL注入漏洞
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)