大家注意第4句:DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb"),Server.MapPath方法的作用是將網站中的相對路徑轉變成物理上的絕對路徑。為何要這樣?因為連接數據庫時,須指明它的絕對路徑。(這裡可能有人不明白,什麼相對路徑、絕對路徑?IIS為了不讓訪問者知道真實的實際路徑,並且確保網站不因變換地址而影響使用,它采用了一種相對路徑來表示目錄與文件之間的關系。也就是網址目錄只表示從根目錄起的相對位置。
比如:上面的網站中,網站:http://219.237.81.46的根目錄為:"D:\111\"雨點下載目錄則在根目錄(D:\111)內的"yddown"下,我們網站訪問該站時,就是在訪問D:\111\yddown\目錄,而http://219.237.81.46/yddown/admin/,它只表明了admin與yddown這個目錄的相對關系,把這個網站放在e:盤,也一樣不改變admin位於yddown目錄下的關系。
當Server.MapPath方法將相對路徑轉為真實路徑時,它實際是三部分路徑加在一起得到真實路徑的:網頁目前執行時所在的相對路徑,也就是從網站物理根目錄起的相對路徑,比如上面例子中conn.ASP處在從根目錄起的"/yddown/"下;然後調用的數據庫的相對路徑是admin/rds_dbd32rfd213fg.mdb,這樣就得到從根目錄起的完整相對路徑:"/yddown/admin/rds_dbd32rfd213fg.mdb"。
這些都只是相對的路徑,如何變為真實路徑呢?
設置過IIS的人都會知道,每一個網站,都必須指定它在硬盤上的物理目錄,比如上例中,網站根目錄所在的物理目錄為:"D:\111",Server.MapPath方法正是通過把"網站根目錄的物理地址+完整的相對路徑",從而得到真實的物理路徑。這樣,數據庫在硬盤上的物理路徑是:d:\111\yddown\admin\rds_dbd32rfd213fg.mdb。
在這裡,IIS以"\"表示真實路徑的目錄關系,而以"/"表示虛擬路徑,這可能就是IE會自動把我們地址中的"\"轉為"/"的原因吧。
明白這些,我們再來理解暴庫就不難了,當我們提交http://219.237.81.46/yddown%5cview.asp?id=3時,vIEw.asp調用conn.ASP後,得到的網頁相對路徑是這樣的:/yddown\ (見上),再加上"admin/rds_dbd32rfd213fg.mdb",就得到"/yddown\"+admin/rds_dbd32rfd213fg.mdb。在IIS中,"/"和"\"代表著不同的意義,遇到了"\"時,認為它已到了根目錄所在的物理路徑,不再往上解析(為何不再往上解析?後面還會分析的),於是網站的完整相對路徑變成了
:"admin/rds_dbd32rfd213fg.mdb",再加上根目錄的物理路徑,得到的真實路徑變成:"D:\111\admin\rds_dbd32rfd213fg.mdb",而這個路徑是不存在的,數據庫連接當然會失敗,於是IIS會報錯,並給出錯誤原因:
Microsoft JET Database Engine 錯誤 ’80004005’
’D:\111\admin\rds_dbd32rfd213fg.mdb’不是一個有效的路徑。 確定路徑名稱拼寫是否正確,以及是否連接到文件存放的服務器。
/yddown/conn.ASP,行12
這就是暴庫語句的來歷。
《再談%5c暴庫的利用》一文中說,必須是網址中的第二個才可以成功,第一個不行。我們從理論上來分析一下,看到底有無規律:
還以上面網址為例,如果將第一個"/"換成"%5c",得到的網站相對路徑變成\yddows/admin/rds_dbd32rfd213fg.mdb,解析到"\"時,認為已到物理目錄,不再往前解析。而事實上,它確實也是根目錄,所以得到的物理路徑為:"D:\111\dydow\admin\rds_dbd32rfd213fg.mdb"
這個路徑是正確的,所以不會出錯,當然不會暴出數據庫路徑。
第二個個"/"換成"%5c"的情況,我們上面已作分析,那是不是真的就第二個可以暴出呢,事實上,它只是因為二級網站較為常見,並不是真理。如果這個下載系統是某一個網站中的三級目錄,變第三個也是可以的。有時,變第三個成功的可能性更大。也就是說,最右邊第一個成功可能性大。
不信?我先舉個例子,再說原因:
http://nice.xmu.edu.cn/channely%5cblog/showlog.ASP?cat_id=31&log_id=246
這個網址,變第二個"/"為"%5c"時,網站打開很慢,但沒有出錯。
當我們把第三個"/"變成"%5c"後,提交:
http://nice.xmu.edu.cn/channely/blog%5cshowlog.ASP?cat_id=31&log_id=246
可以看到,數據庫暴出來了!
Microsoft JET Database Engine 錯誤 ’80004005’
’H:\channely\log_mdb\%29dlog_mdb%29.ASP’不是一個有效的路徑。 確定路徑名稱拼寫是否正確,以及是否連接到文件存放的服務器。
/channely/blog/conn.ASP,行18