ASP安全配置不完全手冊

——從asp程序編寫到服務器配置
ASP全稱Active Server Pages,是微軟推出的用來取代CGI(Common Gateway Interface)的動態服務器網頁技術。由於ASP比較簡單易學,又有微軟這個強大後臺的支持,所以應用比較廣泛,相對來說發現的缺陷和針對各程序的漏洞也比較多。ASP可運行的服務器端平臺包括:WinNT、Win2k、WinXP和Win2003,在Win98環境下裝上PWS4.0也可以運行。現在我們就針對Win2k和Win2003這兩個系統來談談ASP的安全配置。

ASP程序安全篇:
在做安全配置前,我們先了解一下***者的***手法。現在很流行注入***,所謂注入***,就是利用提交特殊地址將ASP中引用的正常SQL語句和***者所需要的SQL語句一併執行,使***者達到***的目的。現在更是有一些腳本注入工具發佈,使菜鳥也可以輕鬆完成對ASP的注入***。那麼我們先來了解一下這些工具是怎樣注入的。
首先,***者會對一個網站確定可不可以進行注入,假設一篇文章的地址爲:[url]http://www.antian365.com/news.asp?id=1[/url]一般會以提交兩個地址來測試,如:
[url]http://www.antian365.com/news.asp?id=1[/url] and 1=1
[url]http://www.antian365.com/news.asp?id=1[/url] and 1=2
第一個地址後面加了 and 1=1,構成的SQL語句也就變爲了:Select * from 表單名 where id=1 and 1=1這句話要成立就必須and前後語句都成立。那麼前面的文章地址是可以訪問的,後面的1=1也是客觀成立的,那麼第一個地址就可以正常顯示;相反1=2是顯然不成立的,關鍵就看這步了,如果提交and 1=2頁面還是正常顯示說明他並沒有將and 1=2寫入SQL語句,此站也就不存在注入漏洞;但如果提交and 1=2之後返回了錯誤頁面則說明此站點將後面的語句帶入了SQL語句並執行了,也就說明他可以進行SQL注入。(注:如果地址後面跟的是news.asp?id='1'就得變爲news.asp?id=1' and '1'='1來補全引號了)
那麼,知道可以注入後***者可以做什麼呢?
這裏就簡單的說一下,比如提交這樣的地址:
[url]http://www.antian365.com/news.asp?id=1[/url] and exists (select * from 表名 where 列名=數據)
根據返回的正確或錯誤頁面來判斷猜的表名和列名是否正確,具體實現時是先猜表名再猜列名。當猜出表名和列名之後還可以用ASC和MID函數來猜出各列的數據。MID函數的格式爲:mid(變量名,第幾個字符開始讀取,讀取幾個字符),比如:mid(pwd,1,2)就可以從變量pwd中的第一位開始讀取兩位的字符。ASC函數的格式爲:ASC("字符串"),如:asc("a")就可以讀出字母a的ASCII碼了。那麼實際應用的時候就可以寫爲:asc(mid(pwd,1,1))這樣讀取的就是pwd列的第一個字符的ASCII碼,提交: asc(mid(pwd,1,1))>97以返回的頁面是否爲正確頁面來判斷pwd列的第一個字符的ASCII碼是否大於97(a的ASCII碼),如果正確就再試是否小於122(z的ASCII碼)……這樣慢慢縮小字符的ASCII碼的範圍,猜到真實的ASCII碼也只是時間的問題。一位一位的猜就可以得到數據庫中的用戶名和密碼了。還有一種ASP驗證缺陷——就是用戶名和密碼都輸'or '1'='1,構造SQL語句Select * form 表單名 where username='' or '1'='1' and pwd='' or '1'='1'就可以達到繞過密碼驗證的目的。
說了那麼多,其實防範的方法很簡單,我們把特殊字符(如and、or、'、")都禁止提交就可以防止注入了。ASP傳輸數據分爲get和post兩種, get是通過將數據添加到URL後提交的方式,post則是利用郵寄信息數據字段將數據傳送到服務器。
那麼,我們先來看看如何將get方式提交數據中的特殊字符過濾。首先要知道,IIS是以字符串的形式將get請求傳給asp.dll的,在將數據傳遞給Request.QueryString之後,asp解析器會解析出Request.QueryString的信息,然後跟據"&"來分出各個數組內的數據。現在我們要讓get方式不能提交以下字符:
'、and、exec、insert、select、delete、update、count、*、%、chr、mid、master、truncate、char、declare
那麼,防止get方式注入的代碼就如下:
<%
dim sql_leach,sql_leach_0,Sql_DATA
sql_leach = "',and,exec,insert,select,delete,update,count,*,%,chr,mid,master,truncate,char,declare"
sql_leach_0 = split(sql_leach,",")

If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(sql_leach_0)
if instr(Request.QueryString(SQL_Get),sql_leach_0(Sql_DATA))>0 Then
Response.Write "請不要嘗試進行SQL注入!"
Response.end
end if
next
Next
End If
%>
其中,變量sql_leach中的字符串就是指定過濾的字符,以","隔開。
接着過濾post提交方式的注入,我們可以看到,request.form也是以數組形式存在的,只要對它再進行一次循環判斷就可以了。防止以post方式注入的ASP代碼如下:
<%
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(sql_leach_0)
if instr(Request.Form(Sql_Post),sql_leach_0(Sql_DATA))>0 Then
Response.Write "請不要嘗試進行SQL注入!"
Response.end
end if
next
next
end if
%>
這樣,get和post注入都被禁止了。
另外就是數據庫的問題,首先現在很流行的用*.asp命名數據庫已經沒什麼意義了,因爲可以用下載軟件來下載;在數據庫名前加#的作用也不大,雖然訪問時瀏覽器只訪問#前面的內容,但是如果將#用其unicode表達法(%23)替換掉就可以訪問了。既然這樣,那麼我們禁止***者暴庫就可以了。一般暴數據庫的方法,是將讀取數據庫的文件名(如conn.asp)前的"/"替換爲"%5c"("\"的unicode表達法)這樣就可以使ASP將%5c解釋爲訪問網站根目錄,而實際是數據庫不在指定位置,找不到數據庫,再將IE設置爲"顯示友好的HTTP錯誤信息"的情況下自然就暴出了數據庫的路徑。
防範的方法也比較簡單,就是讓ASP程序即使在出錯的情況下也不報錯直接執行下一步就可以了。在ASP文件中加這麼一句:on error resume next就OK了。
還有幾點要注意的:
1.數據庫命名長些並儘量放在網站根目錄下,數據庫的表名和字段名儘量不合常規;2.保存敏感信息(如用戶和密碼)的數據庫儘量和在前臺頁面引用的數據庫分開(如果用新的暴庫方法由前臺頁面暴出了數據庫,那麼***者也得不到有價值的信息);3.後臺的目錄名和登陸頁面的名字要改的不尋常些,千萬不可出現admin或者login之類的字符,以免被注入軟件掃描到後臺。4.如果前臺或後臺有上傳文件的功能,切記不能有任何其他功能直接的或間接的擁有更改文件名的權限。這樣的多重保障就更加安全些了。


ASP服務器安全配置篇(針對win2k和win2003):
我們從裸機說起——
首先,拔掉網線,按需求分區之後將所有盤格式化爲NTFS,在D盤安裝系統。系統裝完之後立刻做一個裸系統的ghost備份,以防後面配置的過程中出意外。
先把驅動都裝上是必要的。之後先裝防火牆,選擇一款好的防火牆是很重要的。能買硬件防火牆最好,推薦的選擇:cisco pix系列、天融信 NGFW系列、冰之眼(***檢測系統)。沒有硬件防火牆的情況下,使用軟件防火牆,推薦:Blackice(我個人的最愛)、Checkpoint(以色列國家級防火牆)、ZoneAlarm(不太熟悉,但口碑不錯),雖然比較喜歡天網防火牆,但是不推薦服務器用天網。
裝完防火牆裝殺毒軟件,推薦:KV江民殺毒軟件(好東西)、諾頓(雖然好,但比較霸道)、卡巴斯基(聽說比較耗內存,但對病毒療效狂好)。
開始安裝各種需要的軟件,如果是2003系統,別忘了裝IIS。以上所有軟件都裝在一個非系統盤的指定盤裏。
下面開始給系統打補丁,首先用手頭有的光盤給2k打上SP4或給2003打上SP1。在本地操作的情況下將能打系統和軟件的補丁都打上。之後,在確認防火牆和殺毒軟件都設置好的情況下插上網線,開始window update,並升級殺毒軟件至最新病毒庫。打完所有的系統和軟件的補丁之後,將網線拔掉,把所有臨時文件和系統補丁留下的卸載文件全部刪除,如果覺得佔用空間太多還可以把%systemroot%\System32\dllcache\下的所有文件刪除(系統備份文件),這將使最後的ghost備份文件體積比較小。然後再次用ghost備份系統。
之後刪除不安全的組件,需要將WScript.Shell, WScript.Network, Shell.application刪除掉。在cmd下分別輸入(以2k爲例,2003路經爲D:\windows):
regsvr32/u D:\WINNT\System32\wshom.ocx
del D:\WINNT\System32\wshom.ocx
重新啓動,就OK了。另外***者可以利用getobject("WINNT")獲得用戶和進程的列表,可以將Workstation服務禁用作爲防範措施。
設置權限是必要的。首先,確定IIS裏要建立幾個站點,之後爲每個站點建立一個用戶。在IIS站點的目錄安全性裏選擇讓這個用戶作爲匿名訪問的帳戶。再設置所有分區都禁止這個用戶訪問,而在站點對應的文件夾設置允許此用戶訪問。這樣即使站點被***,***者也拿不到服務器的shell。
一切做好之後用ghost再次備份,並將做好的備份文件放在與服務器不在同一局域網的機器上或相對安全的地方。插上網線,服務器就可以安全的正常工作了。之後可以在每次服務器重起時還原一次系統,這都是後話了。


好了,基本上就這麼多了,以上說的可能不太完全,僅作參考之用,不足之處還請高手多多補充。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章