SQL安全设置攻略
來(lái)源:賽冰河的個(gè)人網(wǎng)站
日前SQL INJECTION的攻擊測(cè)試愈演愈烈,很多大型的網(wǎng)站和論壇都相繼被注入。這些網(wǎng)站一般使用的多為SQLSERVER數(shù)據(jù)庫(kù),正因?yàn)槿绱?#xff0c;很多人開(kāi)始懷疑SQL SERVER的安全性。其實(shí)SQL SERVER2000已經(jīng)通過(guò)了美國(guó)政府的C2級(jí)安全認(rèn)證-這是該行業(yè)所能擁有的最高認(rèn)證級(jí)別,所以使用SQLSERVER還是相當(dāng)?shù)陌踩摹.?dāng)然和ORCAL、DB2等還是有差距,但是SQL
SERVER的易用性和廣泛性還是能成為我們繼續(xù)使用下去的理由。那怎么樣才能使SQL SERVER的設(shè)置讓人使用的放心呢?第一步肯定是打上SQLSERVER最新的安全補(bǔ)丁,現(xiàn)在補(bǔ)丁已經(jīng)出到了SP3。下載地址:http://www.microsoft.com/sql/downloads/2000/sp3.asp
。如果這一步都沒(méi)有做好,那我們也沒(méi)有繼續(xù)下去的必要了。第二步是修改默認(rèn)的1433端口,并且將SQL SERVER隱藏。這樣能禁止對(duì)試圖枚舉網(wǎng)絡(luò)上現(xiàn)有的 SQL Server
客戶端所發(fā)出的廣播作出響應(yīng)。另外,還需要在TCP/IP篩選中將1433端口屏蔽掉,盡可能的隱藏你的SQLSERVER數(shù)據(jù)庫(kù)。這樣子一但讓攻擊創(chuàng)建了SQLSERVER的賬號(hào),也不能馬上使用查詢分析器遠(yuǎn)程登陸來(lái)進(jìn)行下一步的攻擊。單從ASP,PHP等頁(yè)面構(gòu)造惡意語(yǔ)句的話,還有需要查看返回值的問(wèn)題,總比不上直接查詢分析器來(lái)得利落。所以我們首先要做到即使讓別人注入了,也不能讓攻擊者下一步做得順當(dāng)。修改方法:企業(yè)管理器
--> 你的數(shù)據(jù)庫(kù)組 --> 屬性 --> 常規(guī) --> 網(wǎng)絡(luò)配置 --> TCP/IP --> 屬性
,在這兒將你的默認(rèn)端口進(jìn)行修改,和SQL SERVER的隱藏。第三步是很重要的一步,SQL INJECTION往往在WEBCODE中產(chǎn)生。而做為系統(tǒng)管理員或者數(shù)據(jù)庫(kù)管理員,總不能常常的去看每一段代碼。即使常常看代碼,也不能保證我們?cè)谏厦娴氖韬觥D窃趺崔k?我們就要從數(shù)據(jù)庫(kù)角色著手,讓數(shù)據(jù)庫(kù)用戶的權(quán)限劃分到最低點(diǎn)。SQLSERVER的默認(rèn)權(quán)限讓人真的很頭疼,權(quán)限大得非常的高,權(quán)限小的又什么都做不了,SYSADMIN和db_owner真是讓人又愛(ài)又恨。攻擊者一但確認(rèn)了網(wǎng)站存在SQLINJECTION漏洞,肯定有一步操作步驟就是測(cè)試網(wǎng)站的SQL SERVER使用者具有多大的權(quán)限。一般都會(huì)借助selectIS_SRVROLEMEMBER('sysadmin'),或者select IS_MEMBER('db_owner'),再或者用user= 0(讓字符和數(shù)字進(jìn)行比較,SQLSERVER就會(huì)提示了錯(cuò)誤信息,從該信息中即可知道一些敏感信息)等語(yǔ)句進(jìn)行測(cè)試。方法還有,我也不敢多說(shuō)了。其一怕錯(cuò),其二怕聯(lián)盟中的人扁。在當(dāng)前,如果網(wǎng)站的數(shù)據(jù)庫(kù)使用者用的是SA權(quán)限,再加上確認(rèn)了WEB所處在的絕對(duì)路徑,那么就宣告了你的網(wǎng)站的OVER。db_owner權(quán)限也一樣,如果確認(rèn)了絕對(duì)路徑,那么有50%的機(jī)會(huì)能給你的機(jī)器中上WEB方式的木馬,如海陽(yáng)等。所以這兒我們確認(rèn)了一點(diǎn),我們必須要?jiǎng)?chuàng)建自已的權(quán)限,讓攻擊者找不著下嘴的地方。在這兒引用一個(gè)SQLSERVER聯(lián)機(jī)幫助中的例子:創(chuàng)建 SQL Server 數(shù)據(jù)庫(kù)角色的方法(企業(yè)管理器)
創(chuàng)建 SQL Server 數(shù)據(jù)庫(kù)角色
1. 展開(kāi)服務(wù)器組,然后展開(kāi)服務(wù)器。
2. 展開(kāi)"數(shù)據(jù)庫(kù)"文件夾,然后展開(kāi)要在其中創(chuàng)建角色的數(shù)據(jù)庫(kù)。
3. 右擊"角色",然后單擊"新建數(shù)據(jù)庫(kù)角色"命令。
4. 在"名稱"框中輸入新角色的名稱。
5. 單擊"添加"將成員添加到"標(biāo)準(zhǔn)角色"列表中,然后單擊要添加的一個(gè)或多個(gè)用戶。(可選)
只有選定數(shù)據(jù)庫(kù)中的用戶才能被添加到角色中。對(duì)象權(quán)限
處理數(shù)據(jù)或執(zhí)行過(guò)程時(shí)需要稱為對(duì)象權(quán)限的權(quán)限類別:
· select、insert、update 和 delete 語(yǔ)句權(quán)限,它們可以應(yīng)用到整個(gè)表或視圖中。
· select 和 update 語(yǔ)句權(quán)限,它們可以有選擇性地應(yīng)用到表或視圖中的單個(gè)列上。
· select 權(quán)限,它們可以應(yīng)用到用戶定義函數(shù)。
· insert 和 delete 語(yǔ)句權(quán)限,它們會(huì)影響整行,因此只可以應(yīng)用到表或視圖中,而不能應(yīng)用到單個(gè)列上。
· EXECUTE 語(yǔ)句權(quán)限,它們可以影響存儲(chǔ)過(guò)程和函數(shù)。語(yǔ)句權(quán)限
創(chuàng)建數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)中的項(xiàng)(如表或存儲(chǔ)過(guò)程)所涉及的活動(dòng)要求另一類稱為語(yǔ)句權(quán)限的權(quán)限。例如,如果用戶必須能夠在數(shù)據(jù)庫(kù)中創(chuàng)建表,則應(yīng)該向該用戶授予
create TABLE 語(yǔ)句權(quán)限。語(yǔ)句權(quán)限(如 create DATABASE)適用于語(yǔ)句自身,而不適用于數(shù)據(jù)庫(kù)中定義的特定對(duì)象。
語(yǔ)句權(quán)限有:
· BACKUP DATABASE
· BACKUP LOG
· create DATABASE
· create DEFAULT
· create FUNCTION
· create PROCEDURE
· create RULE
· create TABLE
· create VIEW暗示性權(quán)限
暗示性權(quán)限控制那些只能由預(yù)定義系統(tǒng)角色的成員或數(shù)據(jù)庫(kù)對(duì)象所有者執(zhí)行的活動(dòng)。例如,sysadmin 固定服務(wù)器角色成員自動(dòng)繼承在 SQL
Server 安裝中進(jìn)行操作或查看的全部權(quán)限。
數(shù)據(jù)庫(kù)對(duì)象所有者還有暗示性權(quán)限,可以對(duì)所擁有的對(duì)象執(zhí)行一切活動(dòng)。例如,擁有表的用戶可以查看、添加或刪除數(shù)據(jù),更改表定義,或控制允許其他用戶對(duì)表進(jìn)行操作的權(quán)限。db_owner 在數(shù)據(jù)庫(kù)中有全部權(quán)限。
db_accessadmin 可以添加或刪除用戶 ID。
db_securityadmin 可以管理全部權(quán)限、對(duì)象所有權(quán)、角色和角色成員資格。
db_ddladmin 可以發(fā)出 ALL DDL,但不能發(fā)出 GRANT、REVOKE 或 DENY 語(yǔ)句。
db_backupoperator 可以發(fā)出 DBCC、CHECKPOINT 和 BACKUP 語(yǔ)句。
db_datareader 可以選擇數(shù)據(jù)庫(kù)內(nèi)任何用戶表中的所有數(shù)據(jù)。
db_datawriter 可以更改數(shù)據(jù)庫(kù)內(nèi)任何用戶表中的所有數(shù)據(jù)。
db_denydatareader 不能選擇數(shù)據(jù)庫(kù)內(nèi)任何用戶表中的任何數(shù)據(jù)。
db_denydatawriter 不能更改數(shù)據(jù)庫(kù)內(nèi)任何用戶表中的任何數(shù)據(jù)。在這兒把新建的數(shù)據(jù)庫(kù)角色的權(quán)限配置好,比如需要使用哪個(gè)表、視圖、存儲(chǔ)過(guò)程等。然后把Db_owner和db_securityadmin、db_backupoperator取消,不給攻擊者BACKUP
DATABASE和create
TABLE的機(jī)會(huì),一但攻擊者具有這兩個(gè)權(quán)限,那么你的網(wǎng)站就還處在十分危險(xiǎn)的狀態(tài)。還有注意一下,在創(chuàng)建數(shù)據(jù)庫(kù)賬號(hào)時(shí),千萬(wàn)不能對(duì)服務(wù)器角色進(jìn)行選擇。
第四步是修改SQL SERVER內(nèi)置存儲(chǔ)過(guò)程。SQLSERVER估計(jì)是為了安裝或者其它方面,它內(nèi)置了一批危險(xiǎn)的存儲(chǔ)過(guò)程。能讀到注冊(cè)表信息,能寫(xiě)入注冊(cè)表信息,能讀磁盤(pán)共享信息等等……各位看到這兒,心里可能會(huì)在想,我的網(wǎng)站中有其它的代碼,又不像查詢分析器那樣能查接將結(jié)果輸出。給你這個(gè)權(quán)限,又不能怎么樣,還是看不到信息。如果各位這樣想就大錯(cuò)特錯(cuò)了。提示一下,如果攻擊者有createTABLE的權(quán)限,那么創(chuàng)建一個(gè)臨時(shí)表,然后將信息insert到表中,然select出來(lái),接著跟數(shù)字進(jìn)行比較,讓SQLSERVER報(bào)錯(cuò),那么結(jié)果就全出來(lái)了……所以我們要報(bào)著寧錯(cuò)殺,不放過(guò)的態(tài)度進(jìn)行修補(bǔ)。先來(lái)列出危險(xiǎn)的內(nèi)置存儲(chǔ)過(guò)程:
xp_cmdshell
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwriteActiveX自動(dòng)腳本:sp_OAcreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop以上各項(xiàng)全在我們封殺之列,例如xp_cmdshell屏蔽的方法為:sp_dropextendedproc
'xp_cmdshell',如果需要的話,再用sp_addextendedproc 'xp_cmdshell',
'xpsql70.dll'進(jìn)行恢復(fù)。如果你不知道xp_cmdshell使用的是哪個(gè).dll文件的話,可以使用sp_helpextendedproc
xp_cmdshell來(lái)查看xp_cmdshell使用的是哪個(gè)動(dòng)態(tài)聯(lián)接庫(kù)。另外,將xp_cmdshell屏蔽后,我們還需要做的步驟是將xpsql70.dll文件進(jìn)行改名,以防止獲得SA的攻擊者將它進(jìn)行恢復(fù)。我們做到這兒,你的SQLSERVER就基本上安全了。但是信息還是能一樣的外泄。畢竟select我們是無(wú)法取消的,除非你的網(wǎng)站用的是HTML。SQLINJECTION的防范還需要我們這些程序員來(lái)注意,這才是治本之法。我們?cè)诟呒?jí)設(shè)置篇再接著對(duì)SQLSERVER的安全做下一步的分析。該篇文章如果有什么錯(cuò)漏,請(qǐng)大家多多包涵。謝謝……另外推薦一下,SQL INJECTION的測(cè)試工具NBSI2,這是由聯(lián)盟中小竹同志開(kāi)發(fā),對(duì)SQLINJECTION的注入有代表性的作用,另外一個(gè)就是小弟的NBWEBSHELL了。這些工具都可以到聯(lián)盟網(wǎng)站進(jìn)行下載NB聯(lián)盟-jadesun(褲衩) QQ:280155
NB網(wǎng)站:54nb.com
SQL注入防御方法-程序員篇作者:NB聯(lián)盟-小竹 SQL注入越來(lái)越多的被利用來(lái)入侵網(wǎng)站,部分WEB程序員也開(kāi)始關(guān)注這方面的知識(shí),但由于對(duì)入侵的方法一知半解,導(dǎo)致在過(guò)濾的時(shí)候漏掉某些字符,造成安全漏洞;或者是草木皆兵,把一些合法的用戶請(qǐng)求都拒之門(mén)外,試想一下,當(dāng)用戶想輸入個(gè)I'm
a boy的時(shí)候,卻給你臭罵一頓,他還會(huì)愿意再上你的網(wǎng)站嗎?下面,我從程序方面介紹一下SQL注入的防御方法,首先看這三句最簡(jiǎn)單SQL語(yǔ)句
1.SQL="select * from Users where UserID=" & Request("ID")
2.SQL="select * from Users where UserID='" & Request("ID") & "'"
3.SQL="select * from Users where UserName like '%" & Request("Name")
& "%'"第一句,參數(shù)是數(shù)字型,這個(gè)很明顯。第二句,如果字段UserID是int型,就有些人分不清楚了。其實(shí),區(qū)分第數(shù)字弄和字符型參數(shù),只要看SQL語(yǔ)句參數(shù)兩邊有沒(méi)有單引號(hào)即可,很明顯,第一句沒(méi)單引號(hào),是數(shù)字型;第二第三句有單引號(hào),是字符型。
對(duì)于數(shù)字型變量,傳入的參數(shù)都會(huì)直接附加到SQL語(yǔ)句上執(zhí)行,而因?yàn)閰?shù)是數(shù)字型,所以用isNumeric判斷是很安全的,我曾經(jīng)試過(guò)用之類試圖斷開(kāi)參數(shù),但結(jié)果都是失敗。
對(duì)于字符型變量,傳入的參數(shù)都是做為常量,比如你傳1 and 1=1進(jìn)去,SQL語(yǔ)句就是UserID=? and
1=1',在單引號(hào)界定范圍里面的值永遠(yuǎn)都只是一個(gè)常量,要打破這個(gè)范圍,唯一的字符就是界定的字符:單引號(hào)。所以,字符型變量只要過(guò)濾了'號(hào)就完全安全了,至于如何過(guò)濾,最好是把一個(gè)單引號(hào)替換成兩個(gè)單引號(hào),因?yàn)镾QL語(yǔ)句里面規(guī)定,'常量'這樣表示的常量里面,常量里面如果要有單引號(hào),可以用兩個(gè)單引號(hào)代替。這樣,既可以保持用戶輸入的原貌,又可以保證程序的安全。
下面是兩個(gè)函數(shù),大家可以Copy過(guò)去直接調(diào)用就行了。'---------------------------------------------------------------
' NB聯(lián)盟防注入函數(shù) ReqNum / ReqStr
'---------------------------------------------------------------
Function ReqNum ( StrName )
ReqNum = Request ( StrName )
if Not isNumeric ( ReqNum ) then
Response.Write "參數(shù)必須為數(shù)字型!"
Response.End
End if
End FunctionFunction ReqStr ( StrName )
ReqStr = Replace ( Request(StrName), "'", "''" )
End Function
以上面三句SQL語(yǔ)句,說(shuō)明一下調(diào)用方法:
1.SQL="select * from Users where UserID=" & ReqNum("ID")
2.SQL="select * from Users where UserID='" & ReqStr("ID") & "'"
3.SQL="select * from Users where UserName like '%" & ReqStr("Name")
& "%'" 重申一點(diǎn):上面的方法無(wú)論對(duì)SQLServer庫(kù)還是Access或是其它數(shù)據(jù)庫(kù),都是絕對(duì)適用、絕對(duì)安全,但注意一點(diǎn),SQLServer的存儲(chǔ)過(guò)程是個(gè)例外,該情況下要把單引號(hào)替換成四個(gè)單引號(hào),以保安全。
新聞來(lái)自: 新客網(wǎng)(www.xker.com) 詳文參考:http://www.xker.com/article/articleview/2005-6-6/article_view_1871.htm
轉(zhuǎn)載于:https://www.cnblogs.com/Longkin/articles/1215535.html
總結(jié)
- 上一篇: (非原)如何让.net开发的Winfor
- 下一篇: 设置ComboBox控件的边框颜色.