“%5c”暴庫(kù)法,它不是網(wǎng)頁(yè)本身的漏洞,而是利用了IIS解碼方式中的一個(gè)特性,如果IIS安全設(shè)置不周全,而網(wǎng)頁(yè)設(shè)計(jì)者未考慮IIS錯(cuò)誤,就會(huì)被人利用。為何要用“%5c”?它實(shí)際上是“\”的十六進(jìn)制代碼,也就是“\”的另一種表示法。在電腦中,它們是同一個(gè)東東,但提交“\”和“%5c”卻會(huì)產(chǎn)生不同的結(jié)果。在IE中,我們把下面第一個(gè)地址中的“/”換成“\”提交:
http://219.237.81.46/yddown/view.asp?id=3
http://219.237.81.46/yddown\view.asp?id=3
二者的訪問(wèn)結(jié)果是一樣的。IE會(huì)自動(dòng)把“\”轉(zhuǎn)變成“/”,從而訪問(wèn)到同一地址。但是,當(dāng)我們把“/”換成十六進(jìn)制寫法“%5c”時(shí),IE不會(huì)對(duì)此進(jìn)行轉(zhuǎn)換。地址中的“%5c”被原樣提交了,抓包結(jié)果如下:
GET /yddown%5cview.asp?id=3 HTTP/1.1
當(dāng)IIS收到并做出解析時(shí),又會(huì)將%5c還原成“\”。這樣,IIS中網(wǎng)址的相對(duì)路徑就變成/yddown\view.asp,這一點(diǎn)很重要,問(wèn)題正是從這里開(kāi)始的。
在ASP網(wǎng)頁(yè)中,凡調(diào)用數(shù)據(jù)庫(kù)時(shí),都會(huì)用到一個(gè)連接數(shù)據(jù)庫(kù)的網(wǎng)頁(yè)Conn.asp,它會(huì)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象,定義要調(diào)用的數(shù)據(jù)庫(kù)路徑,一個(gè)典型的Conn.asp如下:
<%
dim conn
dim dbpath
set conn=server.createobject("adodb.connection")
DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
%>
大家注意第4句:“DBPath = Server.MapPath("admin/rds_dbd32rfd213fg.mdb")”,Server.MapPath方法的作用是將網(wǎng)站中的相對(duì)路徑轉(zhuǎn)變成物理上的絕對(duì)路徑,為何要這樣?因?yàn)檫B接數(shù)據(jù)庫(kù)時(shí),須指明它的絕對(duì)路徑才能讀取和寫入。那什么是相對(duì)路徑、絕對(duì)路徑?IIS為了不讓訪問(wèn)者知道真實(shí)的實(shí)際路徑,并且確保網(wǎng)站不因變換地址而影響使用,它采用了一種相對(duì)路徑來(lái)表示目錄與文件之間的關(guān)系。也就是網(wǎng)址目錄只表示從根目錄起的相對(duì)位置。比如網(wǎng)站:http://219.237.81.46的根目錄為:“D:\111\”,雨點(diǎn)下載目錄則在根目錄(D:\111)內(nèi)的“yddown”下,我們網(wǎng)站訪問(wèn)該站時(shí),就是在訪問(wèn)D:\111\yddown\目錄,而http://219.237.81.46/yddown/admin/只表明了Admin與Yddown這個(gè)目錄的相對(duì)關(guān)系,把這個(gè)網(wǎng)站放在E盤,也一樣不改變Admin位于Yddown目錄下的關(guān)系。
當(dāng)Server.MapPath方法將相對(duì)路徑轉(zhuǎn)為真實(shí)路徑時(shí),它實(shí)際是三部分路徑加在一起得到真實(shí)路徑的:網(wǎng)頁(yè)目前執(zhí)行時(shí)所在的相對(duì)路徑,也就是從網(wǎng)站物理根目錄起的相對(duì)路徑,比如上面例子中Conn.asp處在從根目錄起的“/yddown/”下;然后調(diào)用的數(shù)據(jù)庫(kù)的相對(duì)路徑是admin/rds_dbd32rfd213fg.mdb,這樣就得到從根目錄起的完整相對(duì)路徑:“/yddown/admin/rds_dbd32rfd213fg.mdb”。這些都只是相對(duì)的路徑,如何變?yōu)檎鎸?shí)路徑呢?
設(shè)置過(guò)IIS的人都會(huì)知道,每一個(gè)網(wǎng)站,都必須指定它在硬盤上的物理目錄,比如上例中,網(wǎng)站根目錄所在的物理目錄為:“D:\111”,Server.MapPath方法正是通過(guò)把“網(wǎng)站根目錄的物理地址+完整的相對(duì)路徑”,從而得到真實(shí)的物理路徑,數(shù)據(jù)庫(kù)在硬盤上的物理路徑是:D:\111\yddown\admin\rds_dbd32rfd213fg.mdb。IIS以“\”表示真實(shí)路徑的目錄關(guān)系,而以“/”表示虛擬路徑,這可能就是IE會(huì)自動(dòng)把我們地址中的“\”轉(zhuǎn)為“/”的原因。
明白這些,我們?cè)賮?lái)理解暴庫(kù)就不難了,當(dāng)我們提交:http://219.237.81.46/yddown%5cview.asp?id=3時(shí),View.asp調(diào)用Conn.asp后,得到的網(wǎng)頁(yè)相對(duì)路徑是這樣的:“/yddown\”,再加上“admin/rds_dbd32rfd213fg.mdb”,就得到“/yddown\+admin/rds_dbd32rfd213fg.mdb”。在IIS中,“/”和“\”代表著不同的意義,遇到了“\”時(shí),認(rèn)為它已到了根目錄所在的物理路徑,不再往上解析(為何不再往上解析?后面還會(huì)分析),于是網(wǎng)站的完整相對(duì)路徑變成了:“admin/rds_dbd32rfd213fg.mdb”,再加上根目錄的物理路徑,得到的真實(shí)路徑變成:“D:\111\admin\rds_dbd32rfd213fg.mdb”,而這個(gè)路徑是不存在的,數(shù)據(jù)庫(kù)連接當(dāng)然會(huì)失敗,于是IIS會(huì)報(bào)錯(cuò),并給出錯(cuò)誤原因:
Microsoft JET Database Engine 錯(cuò)誤 &&9;80004005&&9;
&&9;D:\111\admin\rds_dbd32rfd213fg.mdb&&9;不是一個(gè)有效的路徑。 確定路徑名稱拼寫是
否正確,以及是否連接到文件存放的服務(wù)器。
/yddown/conn.asp,行12
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。