SQL安全設置攻略

發布時間:2007年02月24日      浏覽次數:3051 次
日前sql injection的攻擊測試愈演愈烈,很多大(dà)型的網站和論壇都相繼被注入。這些網站一(yī)般使用的多爲sql server數據庫,正因爲如此,很多人開(kāi)始懷疑sql server的安全性。其實sql server 2000已經通過了美國政府的c2級安全認證-這是該行業所能擁有的最高認證級别,所以使用sql server還是相當的安全的。當然和orcal、db2等還是有差距,但是sql server的易用性和廣泛性還是能成爲我(wǒ)(wǒ)們繼續使用下(xià)去(qù)的理由。那怎麽樣才能使sql server的設置讓人使用的放(fàng)心呢?
第一(yī)步肯定是打上sql server最新的安全補丁,現在補丁已經出到了sp3。下(xià)載地址:http://www.microsoft.com/sql/downloads/2000/sp3.asp 。如果這一(yī)步都沒有做好,那我(wǒ)(wǒ)們也沒有繼續下(xià)去(qù)的必要了。
第二步是修改默認的1433端口,并且将sql server隐藏。這樣能禁止對試圖枚舉網絡上現有的 sql server 客戶端所發出的廣播作出響應。另外(wài),還需要在tcp/ip篩選中(zhōng)将1433端口屏蔽掉,盡可能的隐藏你的sql server數據庫。這樣子一(yī)但讓攻擊創建了sql server的賬号,也不能馬上使用查詢分(fēn)析器遠程登陸來進行下(xià)一(yī)步的攻擊。單從asp,php等頁面構造惡意語句的話(huà),還有需要查看返回值的問題,總比不上直接查詢分(fēn)析器來得利落。所以我(wǒ)(wǒ)們首先要做到即使讓别人注入了,也不能讓攻擊者下(xià)一(yī)步做得順當。修改方法:企業管理器 --> 你的數據庫組 --> 屬性 --> 常規 --> 網絡配置 --> tcp/ip --> 屬性 ,在這兒将你的默認端口進行修改,和sql server的隐藏。
第三步是很重要的一(yī)步,sql injection往往在web code中(zhōng)産生(shēng)。而做爲系統管理員(yuán)或者數據庫管理員(yuán),總不能常常的去(qù)看每一(yī)段代碼。即使常常看代碼,也不能保證我(wǒ)(wǒ)們在上面的疏忽。那怎麽辦?我(wǒ)(wǒ)們就要從數據庫角色着手,讓數據庫用戶的權限劃分(fēn)到最低點。sql server的默認權限讓人真的很頭疼,權限大(dà)得非常的高,權限小(xiǎo)的又(yòu)什麽都做不了,sysadmin和db_owner真是讓人又(yòu)愛又(yòu)恨。攻擊者一(yī)但确認了網站存在sql injection漏洞,肯定有一(yī)步操作步驟就是測試網站的sql server使用者具有多大(dà)的權限。一(yī)般都會借助select is_srvrolemember('sysadmin'),或者select is_member('db_owner'),再或者用user = 0(讓字符和數字進行比較,sql server就會提示了錯誤信息,從該信息中(zhōng)即可知(zhī)道一(yī)些敏感信息)等語句進行測試。方法還有,我(wǒ)(wǒ)也不敢多說了。其一(yī)怕錯,其二怕聯盟中(zhōng)的人扁。在當前,如果網站的數據庫使用者用的是sa權限,再加上确認了web所處在的絕對路徑,那麽就宣告了你的網站的over。db_owner權限也一(yī)樣,如果确認了絕對路徑,那麽有50%的機會能給你的機器中(zhōng)上web 方式的木馬,如海陽等。所以這兒我(wǒ)(wǒ)們确認了一(yī)點,我(wǒ)(wǒ)們必須要創建自已的權限,讓攻擊者找不着下(xià)嘴的地方。在這兒引用一(yī)個sql server聯機幫助中(zhōng)的例子:
創建 sql server 數據庫角色的方法(企業管理器)
創建 sql server 數據庫角色
1. 展開(kāi)服務器組,然後展開(kāi)服務器。
2. 展開(kāi)"數據庫"文件夾,然後展開(kāi)要在其中(zhōng)創建角色的數據庫。
3. 右擊"角色",然後單擊"新建數據庫角色"命令。
4. 在"名稱"框中(zhōng)輸入新角色的名稱。
5. 單擊"添加"将成員(yuán)添加到"标準角色"列表中(zhōng),然後單擊要添加的一(yī)個或多個用戶。(可選)
隻有選定數據庫中(zhōng)的用戶才能被添加到角色中(zhōng)。
對象權限
處理數據或執行過程時需要稱爲對象權限的權限類别:
· select、insert、update 和 delete 語句權限,它們可以應用到整個表或視圖中(zhōng)。
· select 和 update 語句權限,它們可以有選擇性地應用到表或視圖中(zhōng)的單個列上。
· select 權限,它們可以應用到用戶定義函數。
· insert 和 delete 語句權限,它們會影響整行,因此隻可以應用到表或視圖中(zhōng),而不能應用到單個列上。
· execute 語句權限,它們可以影響存儲過程和函數。
語句權限
創建數據庫或數據庫中(zhōng)的項(如表或存儲過程)所涉及的活動要求另一(yī)類稱爲語句權限的權限。例如,如果用戶必須能夠在數據庫中(zhōng)創建表,則應該向該用戶授予 create table 語句權限。語句權限(如 create database)适用于語句自身,而不适用于數據庫中(zhōng)定義的特定對象。
語句權限有:
· backup database
· backup log
· create database
· create default
· create function
· create procedure
· create rule
· create table
· create view
暗示性權限
暗示性權限控制那些隻能由預定義系統角色的成員(yuán)或數據庫對象所有者執行的活動。例如,sysadmin 固定服務器角色成員(yuán)自動繼承在 sql server 安裝中(zhōng)進行操作或查看的全部權限。
數據庫對象所有者還有暗示性權限,可以對所擁有的對象執行一(yī)切活動。例如,擁有表的用戶可以查看、添加或删除數據,更改表定義,或控制允許其他用戶對表進行操作的權限。
db_owner 在數據庫中(zhōng)有全部權限。
db_accessadmin 可以添加或删除用戶 id。
db_securityadmin 可以管理全部權限、對象所有權、角色和角色成員(yuán)資(zī)格。
db_ddladmin 可以發出 all ddl,但不能發出 grant、revoke 或 deny 語句。
db_backupoperator 可以發出 dbcc、checkpoint 和 backup 語句。
db_datareader 可以選擇數據庫内任何用戶表中(zhōng)的所有數據。
db_datawriter 可以更改數據庫内任何用戶表中(zhōng)的所有數據。
db_denydatareader 不能選擇數據庫内任何用戶表中(zhōng)的任何數據。
db_denydatawriter 不能更改數據庫内任何用戶表中(zhōng)的任何數據。
在這兒把新建的數據庫角色的權限配置好,比如需要使用哪個表、視圖、存儲過程等。然後把db_owner和db_securityadmin、db_backupoperator取消,不給攻擊者backup database和create table的機會,一(yī)但攻擊者具有這兩個權限,那麽你的網站就還處在十分(fēn)危險的狀态。還有注意一(yī)下(xià),在創建數據庫賬号時,千萬不能對服務器角色進行選擇。
第四步是修改sql server内置存儲過程。sql server估計是爲了安裝或者其它方面,它内置了一(yī)批危險的存儲過程。能讀到注冊表信息,能寫入注冊表信息,能讀磁盤共享信息等等......各位看到這兒,心裏可能會在想,我(wǒ)(wǒ)的網站中(zhōng)有其它的代碼,又(yòu)不像查詢分(fēn)析器那樣能查接将結果輸出。給你這個權限,又(yòu)不能怎麽樣,還是看不到信息。如果各位這樣想就大(dà)錯特錯了。提示一(yī)下(xià),如果攻擊者有create table的權限,那麽創建一(yī)個臨時表,然後将信息insert到表中(zhōng),然select出來,接着跟數字進行比較,讓sql server報錯,那麽結果就全出來了......所以我(wǒ)(wǒ)們要報着甯錯殺,不放(fàng)過的态度進行修補。
先來列出危險的内置存儲過程:
xp_cmdshell
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
activex自動腳本:
sp_oacreate
sp_oadestroy
sp_oamethod
sp_oagetproperty
sp_oasetproperty
sp_oageterrorinfo
sp_oastop
以上各項全在我(wǒ)(wǒ)們封殺之列,例如xp_cmdshell屏蔽的方法爲:sp_dropextendedproc 'xp_cmdshell',如果需要的話(huà),再用sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'進行恢複。如果你不知(zhī)道xp_cmdshell使用的是哪個.dll文件的話(huà),可以使用sp_helpextendedproc xp_cmdshell來查看xp_cmdshell使用的是哪個動态聯接庫。另外(wài),将xp_cmdshell屏蔽後,我(wǒ)(wǒ)們還需要做的步驟是将xpsql70.dll文件進行改名,以防止獲得sa的攻擊者将它進行恢複。
我(wǒ)(wǒ)們做到這兒,你的sql server就基本上安全了。但是信息還是能一(yī)樣的外(wài)洩。畢竟select我(wǒ)(wǒ)們是無法取消的,除非你的網站用的是html。sql injection的防範還需要我(wǒ)(wǒ)們這些程序員(yuán)來注意,這才是治本之法。我(wǒ)(wǒ)們在高級設置篇再接着對sql server的安全做下(xià)一(yī)步的分(fēn)析。該篇文章如果有什麽錯漏,請大(dà)家多多包涵。謝謝......
另外(wài)推薦一(yī)下(xià),sql injection的測試工(gōng)具nbsi2,這是由聯盟中(zhōng)小(xiǎo)竹同志(zhì)開(kāi)發,對sql injection的注入有代表性的作用,另外(wài)一(yī)個就是小(xiǎo)弟(dì)的nbwebshell了。這些工(gōng)具都可以到聯盟網站進行下(xià)載
nb聯盟-jadesun(褲衩) qq:280155
nb網站:www.54nb.com
sql注入防禦方法-程序員(yuán)篇
作者:nb聯盟-小(xiǎo)竹
  sql注入越來越多的被利用來入侵網站,部分(fēn)web程序員(yuán)也開(kāi)始關注這方面的知(zhī)識,但由于對入侵的方法一(yī)知(zhī)半解,導緻在過濾的時候漏掉某些字符,造成安全漏洞;或者是草木皆兵,把一(yī)些合法的用戶請求都拒之門外(wài),試想一(yī)下(xià),當用戶想輸入個i'm a boy的時候,卻給你臭罵一(yī)頓,他還會願意再上你的網站嗎(ma)?
下(xià)面,我(wǒ)(wǒ)從程序方面介紹一(yī)下(xià)sql注入的防禦方法,首先看這三句最簡單sql語句
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") & "%'"
第一(yī)句,參數是數字型,這個很明顯。第二句,如果字段userid是int型,就有些人分(fēn)不清楚了。其實,區分(fēn)第數字弄和字符型參數,隻要看sql語句參數兩邊有沒有單引号即可,很明顯,第一(yī)句沒單引号,是數字型;第二第三句有單引号,是字符型。
  對于數字型變量,傳入的參數都會直接附加到sql語句上執行,而因爲參數是數字型,所以用isnumeric判斷是很安全的,我(wǒ)(wǒ)曾經試過用\0之類試圖斷開(kāi)參數,但結果都是失敗。
  對于字符型變量,傳入的參數都是做爲常量,比如你傳1 and 1=1進去(qù),sql語句就是userid='1 and 1=1',在單引号界定範圍裏面的值永遠都隻是一(yī)個常量,要打破這個範圍,唯一(yī)的字符就是界定的字符:單引号。所以,字符型變量隻要過濾了'号就完全安全了,至于如何過濾,最好是把一(yī)個單引号替換成兩個單引号,因爲sql語句裏面規定,'常量'這樣表示的常量裏面,常量裏面如果要有單引号,可以用兩個單引号代替。這樣,既可以保持用戶輸入的原貌,又(yòu)可以保證程序的安全。
  下(xià)面是兩個函數,大(dà)家可以copy過去(qù)直接調用就行了。
'---------------------------------------------------------------
' nb聯盟防注入函數 reqnum / reqstr
'---------------------------------------------------------------
function reqnum ( strname )
reqnum = request ( strname )
if not isnumeric ( reqnum ) then
response.write "參數必須爲數字型!"
response.end
end if
end function
function reqstr ( strname )
reqstr = replace ( request(strname), "'", "''" )
end function
以上面三句sql語句,說明一(yī)下(xià)調用方法:
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") & "%'"
  重申一(yī)點:上面的方法無論對sqlserver庫還是access或是其它數據庫,都是絕對适用、絕對安全,但注意一(yī)點,sqlserver的存儲過程是個例外(wài),該情況下(xià)要把單引号替換成四個單引号,以保安全。
免責聲明:本站相關技術文章信息部分(fēn)來自網絡,目的主要是傳播更多信息,如果您認爲本站的某些信息侵犯了您的版權,請與我(wǒ)(wǒ)們聯系,我(wǒ)(wǒ)們會即時妥善的處理,謝謝合作!