天天看點

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的注入攻擊。那麼我們先來了解一下這些工具是怎樣注入的。

第一個位址後面加了 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來補全引号了)

    那麼,知道可以注入後入侵者可以做什麼呢?

    這裡就簡單的說一下,比如送出這樣的位址:

根據傳回的正确或錯誤頁面來判斷猜的表名和列名是否正确,具體實作時是先猜表名再猜列名。當猜出表名和列名之後還可以用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

if instr(Request.Form(Sql_Post),sql_leach_0(Sql_DATA))>0 Then

    這樣,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。以上所有軟體都裝在一個非系統盤的指定盤裡。

下面開始給系統打更新檔,首先用手頭有的CD光牒給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再次備份,并将做好的備份檔案放在與伺服器不在同一區域網路的機器上或相對安全的地方。插上網線,伺服器就可以安全的正常工作了。之後可以在每次伺服器重起時還原一次系統,這都是後話了。

本文轉自loveme2351CTO部落格,原文連結:http://blog.51cto.com/loveme23/8219 ,如需轉載請自行聯系原作者

上一篇: servermask
下一篇: owasp資源