下面我要談到一些Sqlserver新的Bug,雖然本人經(jīng)過(guò)長(zhǎng)時(shí)間的努力,當(dāng)然也有點(diǎn)幸運(yùn)的成分在內(nèi),才得以發(fā)現(xiàn),不敢一個(gè)人獨(dú)享,拿出來(lái)請(qǐng)大家鑒別。
1.關(guān)于Openrowset和Opendatasource
可能這個(gè)技巧早有人已經(jīng)會(huì)了,就是利用openrowset發(fā)送本地命令。通常我們的用法是(包括MSDN的列子)如下:
|
可見(jiàn)(即使從字面意義上看)openrowset只是作為一個(gè)快捷的遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn),它必須跟在select后面,也就是說(shuō)需要返回一個(gè)recordset 。
那么我們能不能利用它調(diào)用xp_cmdshell呢?答案是肯定的!
|
那么如果我們要調(diào)用sp_addlogin呢,他不會(huì)像xp_cmdshell返回任何集合的,我們就不能再依靠fmtonly設(shè)置了,可以如下操作:
|
2.關(guān)于Msdasql兩次請(qǐng)求的問(wèn)題
不知道大家有沒(méi)有試過(guò)用msdasql連接遠(yuǎn)程數(shù)據(jù)庫(kù),當(dāng)然這個(gè)api必須是sqlserver的管理員才可以調(diào)用,那么如下:
|
3.可怕的后門(mén)
以前在網(wǎng)上看到有人說(shuō)在 sqlserver上留后門(mén)可以通過(guò)添加triger、jobs或改寫(xiě)sp_addlogin和sp_addsrvrolemember做到,這些方法當(dāng)然可行,但是很容易會(huì)被發(fā)現(xiàn)。不知道大家有沒(méi)有想過(guò)sqloledb的本地連接映射。呵呵,比如你在對(duì)方的sqlserver上用sqlserver的管理員賬號(hào)執(zhí)行如下的命令:
|
另外還有一個(gè)猜測(cè),不知道大家有沒(méi)有注意過(guò)windows默認(rèn)附帶的兩個(gè)dsn,一個(gè)是localserver一個(gè)是msqi,這兩個(gè)在建立的時(shí)候是本地管理員賬號(hào)連接sqlserver的,如果對(duì)方的 sqlserver是通過(guò)自定義的power user啟動(dòng),那么sa的權(quán)限就和power user一樣,很難有所大作為,但是我們通過(guò)如下的命令:
|
應(yīng)該可以利用localserver的管理員賬號(hào)連接本地sqlserver然后再以這個(gè)賬號(hào)的權(quán)限執(zhí)行本地命令了,這是后我想應(yīng)該能突破sa那個(gè)power user權(quán)限了。現(xiàn)在的問(wèn)題是sqloledb無(wú)法調(diào)用dsn連接,而msdasql非管理員不讓調(diào)用,所以我現(xiàn)在正在尋找guest調(diào)用msdasql 的方法。
如果有人知道這個(gè)bug如何突破,或有新的想法,我們可以一起討論一下,這個(gè)發(fā)放如果能成功被guest利用,將會(huì)是一個(gè)很?chē)?yán)重的安全漏洞。因?yàn)槲覀兦懊嫣岬降娜魏蝧ql語(yǔ)句都可以提交給對(duì)方的asp去幫我們執(zhí)行。
4.利用T-sql騙過(guò)Ids或攻擊Ids
現(xiàn)在的Ids已經(jīng)變得越來(lái)越聰明了。有的ids加入了xp_cmdshell sp_addlogin 的監(jiān)視,但是畢竟人工智能沒(méi)有出現(xiàn)的今天,這種監(jiān)視總是有種騙人的感覺(jué)。
先說(shuō)說(shuō)欺騙Ids
Ids既然監(jiān)視xp_cmdshell關(guān)鍵字,那么我們可以這么做:
|
這個(gè)代碼相信大家都能看明白,還有xp_cmdshell作為一個(gè)store procedure在master庫(kù)內(nèi)有一個(gè)id號(hào),固定的,我們也可以這么做:
假設(shè)這個(gè)id=988456
|
當(dāng)然也可以:
|
這種做法排列組合,ids根本不可能做的到完全監(jiān)視。同理,sp_addlogin也可以這么做。
再說(shuō)說(shuō)攻擊Ids
因?yàn)镮ds數(shù)據(jù)量很大,日至通常備份到常規(guī)數(shù)據(jù)庫(kù),比如sql server。
如果用古老的recordset.addnew做法,會(huì)嚴(yán)重影響ids的性能,因?yàn)橥ㄟ^(guò)ado做t-sql請(qǐng)求,不但效率高,而且有一部分工作可以交給sql server 去做,通常程序會(huì)這么寫(xiě):
|
那么我們想想看,如果用 temp') exec xp_cmdshell 'dir c:\' -- 提交后會(huì)變成:
|
這樣,xp_cmdshell就可以在ids的數(shù)據(jù)庫(kù)運(yùn)行了。當(dāng)然ids是一個(gè)嗅嘆器,他會(huì)抓所有的報(bào),而瀏覽器提交的時(shí)候會(huì)把空格變成 。因此, 會(huì)被提交到sql server,這樣你的命令就無(wú)法執(zhí)行了。 唯一的辦法就是:
|
用/**/代替空格做間隔符,這樣你的t-sql才能在ids的數(shù)據(jù)庫(kù)內(nèi)執(zhí)行。當(dāng)然也可以用其他語(yǔ)句,可以破壞,備份ids的數(shù)據(jù)庫(kù)到你的共享目錄。
其實(shí)這種方法的原理和攻擊asp是一樣的,只是把空格變成了/**/ 。本來(lái)asp是select語(yǔ)句,那么用'就可以屏蔽。現(xiàn)在ids用insert語(yǔ)句,那么用')屏蔽。
好了,其他很多新的入侵語(yǔ)句大家可以自己慢慢想,最好的測(cè)試工具就是query analyzer了。


