對于一些網(wǎng)站,只需要把站點鏈接的最后一個“/”改為“%5c”,就能夠暴露出網(wǎng)站的數(shù)據(jù)庫地址。為什么會出現(xiàn)這樣的奇怪情況呢?
在“conn.asp”文件中的幾句數(shù)據(jù)庫連接代碼語句,看上去覺得并沒什么問題,而且數(shù)據(jù)庫的名字取得很怪,攻擊者能猜到這樣的數(shù)據(jù)庫名幾率幾乎為零。但是將網(wǎng)頁連接地址的“/”做一個小小的變換,改成“%5c”,由于 IE 瀏覽器的解碼,將錯誤的網(wǎng)站路徑傳輸給網(wǎng)站服務(wù)器,就可以通過返回的錯誤信息報出數(shù)據(jù)庫的真實位置。
1,絕對路徑、相對路徑和虛擬目錄
上面我們提到,由于瀏覽器對“相對路徑”解碼的錯誤,才導(dǎo)致數(shù)據(jù)庫暴露出漏洞。那么什么是“相對路徑”呢?
在網(wǎng)站服務(wù)中,“相對路徑”就是指相對于網(wǎng)站 Web 根目錄的路徑。例如,服務(wù)器的 web 根目錄為“D:\web\”,我們在根目錄中建立了一個名為“asp”的目錄,“asp”目錄就是相對于“D:\web”的一級子目錄。對應(yīng)到網(wǎng)站鏈接上來看的話,“D:\web\”對應(yīng)的就是“http://localhost”,而“asp”目錄就是相對于“http://localhost”的一級目錄。因此,在 web 服務(wù)中訪問“asp”目錄時,只需在瀏覽器中輸入相對路徑“http://localhost/asp”即可。
所謂的絕對路徑,是指在服務(wù)器磁盤中的真實路徑,這里“asp”目錄的絕對路徑就是“D:\web\asp\”,是一個二級目錄。
在IIS中,還有一個特殊的目錄路徑--“虛擬目錄”。每個 Web 服務(wù)可以從多個目錄中發(fā)布,Web 服務(wù)器可擁有一個宿主目錄和任意數(shù)量的其他發(fā)布目錄,其他發(fā)布目錄就被稱為虛擬目錄。以上面的 Web 服務(wù)為例,Web 服務(wù)的根目錄為“d:\web\”,通過IIS虛擬目錄功能,可以發(fā)布一個論壇服務(wù),論壇程序可以位于任意的路徑,如在“E:\bbs”。通過IIS的虛擬目錄設(shè)置,仍能把“bbs”轉(zhuǎn)化為在“Web”目錄下,直接用“http://localhost/bbs”進行訪問。
使用虛擬目錄時,此目錄指向的是一個絕對地址的物理路徑。在IIS中,為了辨別當前訪問的是否為虛擬目錄,通常是查詢每個目錄是否指向一個物理路徑,而進行查詢判斷時,是以鏈接的“\”符號做為標志的。也就是說,當IIS獲取某個目錄時,如果碰到“\”符號,則將“\”符號之后的路徑作為物理的絕對路徑,而忽略“\”符號之前的路徑信息。
2,"server.mappath"方法
在“conn.asp”數(shù)據(jù)庫連接文件中,基本上都會有這么一條語句:
Data Source=server.MapPth("xxxxx.mdb")
其中“server.mappath”方法的作用,就是把相對路徑轉(zhuǎn)換為物理上的絕對路徑,只有經(jīng)過轉(zhuǎn)換,服務(wù)器才能正確地獲得數(shù)據(jù)庫的路徑,進行數(shù)據(jù)讀寫。
由于當前 Web 根目錄為“D:\web”,在 Web 根目錄下有“asp” 文件夾,網(wǎng)頁程序“test.asp”和數(shù)據(jù)庫“xxxxx.mdb”,都放在“asp”文件夾中。數(shù)據(jù)庫文件的絕對路徑為“D:\web\asp\xxxxx.mdb”。
“server.mappath”方法獲取數(shù)據(jù)庫文件的路徑時,讀取的路徑為“Web根目錄+相對路徑+指定的路徑”。Web 根目錄為“D:\web”,“conn.asp”數(shù)據(jù)庫連接文件的相對路徑是“\asp\”,指定的數(shù)據(jù)庫文件路徑是“xxxxx.mdb”,因此可獲得真實的數(shù)據(jù)庫絕對路徑“D:\web\asp\xxxxx.mdb”。
3,%5c 暴庫的原理--相對路徑出錯
通常情況下,數(shù)據(jù)庫連接文件中的“server.mappath”方法,可以正常獲得數(shù)據(jù)庫的物理路徑。但是,當瀏覽器中的鏈接地址被修改提交后,網(wǎng)頁的相對路徑就發(fā)生了變化,從而使得路徑出錯,報出數(shù)據(jù)庫信息。
先來看看 IE 瀏覽器的一個特性:如果直接在瀏覽器中提交的鏈接地址中包含“\”,瀏覽器會自動把“\”轉(zhuǎn)換為“/”,從而訪問到正常的鏈接地址。例如,在上面的例子中,如果提交“http://localhost/asp\conn.asp”或者“http://localhost/asp\test.asp”,最終在 IE 瀏覽器中顯示的都還是正常網(wǎng)頁。
在瀏覽器鏈接中包含的“\”,會被自動轉(zhuǎn)化為“/”,但是對“\”做一個小小的編碼轉(zhuǎn)換,就可避免 IE 瀏覽器的自動轉(zhuǎn)化。如上面提交的鏈接,變化編碼后變成了:“http://localhost/asp%5cconn.asp”或“http://localhost/asp%5ctest.asp”。
在瀏覽器中,提交“%5c”是不會被自動轉(zhuǎn)換的,地址中的“%5c”會被原樣提交。其實,“%5c”就是“\”的 16 進制代碼,當 IIS 服務(wù)器收到用戶提交的信息并做出解析時,又會將 “%5c” 還原成“\”。于是在 IIS 服務(wù)器中,用戶提交的網(wǎng)址相對路徑就變成了“asp\test.asp”或“asp\conn.asp”。問題便由此而產(chǎn)生了。
此時,“server.mappath”方法獲得的數(shù)據(jù)庫路徑,變成了“D:\web”+“asp\xxxxx.mdb”。由于在 IIS 中,以“\”表示真實路徑的目錄關(guān)系,以“/”表示虛擬路徑。在前面提到了“當IIS獲取某個目錄時,如果碰到“\”符號,則將“\”符號之后的路徑作為物理的絕對路徑,而忽略“\”符號之前的路徑信息”,由此可知IIS會將“asp\xxxxx.mdb”當成一個絕對路徑,忽略掉“\”符號之前的“asp”目錄。因此,加上根目錄的物理路徑“D:\web”,此時得到的數(shù)據(jù)庫真實路徑變成為“D:\web\xxxxx.mdb”。
由于“D:\web\xxxxx.mdb”這個路徑是不存在的,數(shù)據(jù)庫連接當然會失敗,于是 IIS 會報錯,并返回出錯的信息:
錯誤類型:
Microsoft JET Database Engine (0x80004005)
找不到文件 'D:\web\xxxxx.mdb'。
/asp\conn.asp,第4行
這便是 “%5c” 暴庫方法的原理。利用該方法,攻擊者可以讓網(wǎng)站隱藏的數(shù)據(jù)庫文件路徑報出,無論建站者將數(shù)據(jù)庫文件名修改得再怪異、路徑藏得再深,在攻擊者面前也形同虛設(shè)。
不過要說明的一點是,在報出的數(shù)據(jù)庫信息中,顯示的數(shù)據(jù)庫路徑是不完全正確的。例如,在上面的命令中,顯示的數(shù)據(jù)庫路徑為“D:\web\xxxxx.mdb”,而真實的數(shù)據(jù)庫路徑為“D:\web\asp\xxxxx.mdb”。為什么會這樣呢?在上面已知提到了,IIS將“\”之前的相對路徑信息忽略了,因此在將報出的數(shù)據(jù)庫地址變?yōu)檎鎸嵉臄?shù)據(jù)庫地址時,需要加上“\”之前的相對目錄。這里將被忽略的“\asp\”目錄加入,即可得到真實的數(shù)據(jù)庫地址。