說到%5c,你是不是想起了當前流行的那個%5c暴庫漏洞,呵呵,本文就是對%5c利用的探索(呵呵,當然有我提出的新東東,或許對你有幫助哦^_^)。
好,我們先追根溯源,找到那個漏洞的老底??纯淳G盟2001年的漏洞公告:_bug&do=view&bug_id=1429">http://www.nsfocus.net/index.php?act=sec_bug&do=view&bug_id=1429
N年以前利用這個漏洞可以實現目錄遍歷,雖然微軟出了補丁,不過好像補丁是用來限制iis只能訪問虛擬目錄的,所以漏洞還是存在,只不過利用方式變了。對iis來說,提交一個含有%5c的url能夠找到文件,但是該文件里以相對路徑引用的其他文件卻找不到了(%5c是\的url編碼,iis跳轉到上一級目錄去找,當然找不到;頭暈了吧,哈哈,我也頭暈?。?/p>
后來這個漏洞就被牛人挖掘出來了,也就是傳說中的%5c暴庫:由于連接數據庫的文件引用的相對路徑,提交%5c找不到文件,所以導致出錯,iis就會老老實實的說出數據庫的路徑(不明白?找google)。
一個偶然的機會我發現還可以利用%5c繞過asp的驗證;當我們暴庫失敗的時候不妨試試。
廢話少說,看下面的代碼:
<!--#INCLUDE file="conn.asp" -->
<%
guest_user=trim(request("guest_user"))
guest_password=trim(request("guest_password"))
Set rs= Server.createObject("ADODB.Recordset")
sql="select * from admin where id=1"
rs.open sql,conn,3,2
readuser=rs("guest_user")
readpassword=rs("guest_password")
if readuser<>guest_user or readpassword<>guest_password then
response.write "請輸入正確地管理員密碼!"
response.end
else
session("admin")=1 '登陸后寫入seesion中保存
response.write("登陸成功,請返回信息頁")
end if
%>
看到沒有,要想通過驗證必須讓數據庫里的用戶名密碼與提交的一致;想到什么?讓我們再看看數據庫連接文件代碼:
<%
on error resume next
set conn=server.createobject("adodb.connection")
DBPath = Server.MapPath("guestbook.asp")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
%>
啊,有容錯語句不能暴庫!等等,如果提交%5c數據庫找不到,由于容錯,所以程序會繼續執行,那么說來從數據庫得到的用戶名密碼皆為空(想想有時暴庫失敗是不是看到空空的框架,因為數據都是空嘛),哈哈,這樣我們就繞過驗證了!
知道怎么做了吧,把登陸頁面保存到本地,修改提交的url,把最后一個/改成%5c,用戶名密碼用空格(有的程序會檢查用戶名密碼是否為空,空格會被程序過濾),提交,就ok了。
誒,各位不要以為我自己沒事寫段代碼來搗鼓,實際上這個是我們學校一個高手做的留言板程序,就掛在學校的主頁,呵呵。
既然弄懂了原理,當然要找實際漏洞啦,自然是拿大名鼎鼎的"洞"網論壇開刀。不過失敗了,因為它的數據庫連接文件里有這么一段:
If Err Then
err.Clear
Set Conn = Nothing
Response.Write "數據庫連接出錯,請檢查連接字串。"
Response.End
End If
數據庫找不到程序就結束了,呵呵,空歡喜一場。
接著又去down了bbsxp論壇,打開數據庫連接文件,暈,根本沒有容錯語句;呵呵,不過可以暴庫哦。
我又不是BT,所以不去找事了,寫篇文章,算是給各位高手提供資料吧。
總結一下這個攻擊方法成功的條件:1、數據庫連接用的相對路徑且僅有簡單的容錯語句;2、服務器iis版本為4或5;3、程序里不檢查空字符或者檢查時不過濾空格而比較時過濾空格;4、程序不能位于一級目錄
至于防范,呵呵,既然攻擊條件知道了,防范措施自然也出來了^_^