發新話題

ASP網絡安全講述

ASP網絡安全講述

一 前言  
  Microsoft Active Server Pages(ASP)是服務器端腳本編寫環境,使用它可以創建和運行動態、交互的 Web 服務器應用程序。使用 ASP 可以組合 HTML 頁 、腳本命令和 ActiveX 組件以創建交互的 Web 頁和基於 Web 的功能強大的應用程序。  
現在很多網站特別是電子商務方面的網站,在前台上大都用ASP來實現。以至於現在ASP在網站應用上很普遍。  
ASP是開發網站應用的快速工具,但是有些網站管理員只看到ASP的快速開發能力,卻忽視了ASP安全問題。ASP從一開始就一直受到眾多漏洞,後門的困擾,包括%81的噩夢,密碼驗證問題,IIS漏洞等等都一直使ASP網站開發人員心驚膽跳。  
本文試圖從開放了ASP服務的操作系統漏洞和ASP程序本身漏洞,闡述ASP安全問題,並給出解決方法或者建議。  

二 關鍵字  
  ASP,網絡安全,IIS,SSL,加密。  

三 ASP工作機理  
  Active Server Page技術為應用開發商提供了基於腳本的直觀、快速、高效的應用開發手段,極大地提高了開發的效果。在討論ASP的安全性問題之前,讓我們來看看ASP是怎麼工作的。ASP腳本是採用明文(plain text)方式來編寫的。  
  ASP腳本是一系列按特定語法(目前支持vbscript和jscript兩種腳本語言)編寫的,與標準HTML頁面混合在一起的腳本所構成的文本格式的文件。當客戶端的最終用戶用WEB瀏覽器通過INTERNET來訪問基於ASP腳本的應用時,WEB瀏覽器將向WEB服務器發出HTTP請求。WEB服務器分析、判斷出該請求是ASP腳本的應用後,自動通過ISAPI接口調用ASP腳本的解釋運行引擎(ASP.DLL)。ASP.DLL將從文件系統或內部緩衝區獲取指定的ASP腳本文件,接著就進行語法分析並解釋執行。最終的處理結果將形成HTML格式的內容,通過WEB服務器"原路"返回給WEB瀏覽器,由WEB瀏覽器在客戶端形成最終的結果呈現。這樣就完成了一次完整的ASP腳本調用。若干個有機的ASP腳本調用就組成了一個完整的ASP腳本應用。  
  讓我們來看看運行ASP所需的環境:  
Microsoft Internet Information Server 3.0/4.0/5.0 on NT Server  
Microsoft Internet Information Server 3.0/4.0/5.0 on Win2000  
Microsoft Personal Web Server on Windows 95/98  
  WINDOWS NT Option Pack所帶的Microsoft IIS提供了強大的功能,但是IIS在網絡安全方面卻是比較危險的。因為很少有人會用Windows 95/98當服務器,因此本文我更多的從NT中的IIS安全問題來探討。  

四 微軟自稱的ASP的安全優點  
  雖然我們本文的重點是探討ASP漏洞和後門,但是有必要談談ASP在網絡安全方面的"優點",之所以加個"",是因為有時這些微軟宣稱的"優點"恰恰是其安全隱犯。  
  微軟稱ASP在網絡安全方面一大優點就是用戶不能看到ASP的源程序,從ASP的原理上看,ASP在服務端執行並解釋成標準的HTML語句,再傳送給客戶端瀏覽器。"屏蔽"源程序能很好的維護ASP開發人員的版權,試想你辛辛苦苦做了一個很優秀的程序,給人任意COPY,你會怎麼想?而且黑客還能分析你的ASP程序,挑出漏洞。更重要的是有些ASP開發者喜歡把密碼,有特權的用戶名和路徑直接寫在程序中,這樣別人通過猜密碼,猜路徑,很容易找到攻擊系統的"入口"。但是目前已經發現了很多能查看ASP源程序的漏洞,後面我們還要討論。  
  IIS支持虛擬目錄,通過在"服務器屬性"對話框中的"目錄"標籤可以管理虛擬目錄。建立虛擬目錄對於管理WEB站點具有非常重要的意義。虛擬目錄隱藏了有關站點目錄結構的重要信息。因為在瀏覽器中,客戶通過選擇"查看源代碼",很容易就能獲取頁面的文件路徑信息,如果在WEB頁中使用物理路徑,將暴露有關站點目錄的重要信息,這容易導致系統受到攻擊。其次,只要兩台機器具有相同的虛擬目錄,你就可以在不對頁面代碼做任何改動的情況下,將WEB頁面從一台機器上移到另一台機器。還有就是,當你將WEB頁面放置於虛擬目錄下後,你可以對目錄設置不同的屬性,如:Read、Excute、Script。讀訪問表示將目錄內容從IIS傳遞到瀏覽器。而執行訪問則可以使在該目錄內執行可執行的文件。當你需要使用ASP時,就必須將你存放.asp文件的目錄設置為"Excute(執行)"。建議大家在設置WEB站點時,將HTML文件同ASP文件分開放置在不同的目錄下,然後將HTML子目錄設置為"讀",將ASP子目錄設置為"執行",這不僅方便了對WEB的管理,而且最重要的提高了ASP程序的安全性,防止了程序內容被客戶所訪問。  

五 ASP漏洞分析和解決方法  
 有人說一台不和外面聯繫的電腦是最安全的電腦,一個關閉所有端口,不提供任何服務的電腦也是最安全的。黑客經常利用我們所開放的端口實施攻擊,這些攻擊最常見的是DDOS(拒絕服務攻擊).下面我會列出ASP的二十幾個漏洞,每個漏洞都會有漏洞描述和解決方法。  
1 在ASP程序後加個特殊符號,能看到ASP源程序  
  受影響的版本:  
  win95+pws  
  IIS3.0  
  98+pws4 不存在這個漏洞。  
  IIS4.0以上的版本也不存在這個漏洞。  
  問題描述:  
  這些特殊符號包括小數點,%81, :DATA。比如:  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
http:// someurl/somepage.asp%81  
http:// someurl/somepage.asp:DATA  
http:// someurl/somepage.asp %2e  
http:// someurl/somepage %2e%41sp  
http:// someurl/somepage%2e%asp  
http:// someurl/somepage.asp %2e  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員 (可以看到boot.ini的文件內容)  
  那麼在安裝有IIS3.0和win95+PWS的瀏覽中就很容易看到somepage.asp的源程序。究竟是什麼原因造成了這種可怕的漏洞呢?究其根源其實是 Windows NT 特有的文件系統在做怪。有一點常識的人都知道在 NT 提供了一種完全不同於 FAT 的文件系統:NTFS,這種被稱之為新技術文件系統的技術使得 NT 具有了較高的安全機制,但也正是因為它而產生了不少令人頭痛的隱患。大家可能不知道, NTFS 支持包含在一個文件中 的多數據流,而這個包含了所有內容的主數據流被稱之為"DATA",因此使得在瀏覽器 裡直接訪問 NTFS 系統的這個特性而輕易的捕獲在文件中的腳本程序成為了可能。然而 直接導致 :DATA 的原因是由於 IIS 在解析文件名的時候出了問題,它沒有很好地規範文件名。  
  解決方法和建議:  
  如果是Winodws NT用戶,安裝IIS4.0或者IIS5.0,Windows2000不存在這個問題。如果是win95用戶,安裝WIN98和PWS4.0。  
2 ACCESS mdb 數據庫有可能被下載的漏洞  
  問題描述:  
  在用ACCESS做後台數據庫時,如果有人通過各種方法知道或者猜到了服務器的ACCESS數據庫的路徑和數據庫名稱,那麼他能夠下載這個ACCESS數據庫文件,這是非常危險的。比如:如果你的ACCESS數據庫book.mdb放在虛擬目錄下的database目錄下,那麼有人在瀏覽器中打入:  
http:// someurl/database/book.mdb  
  如果你的book.mdb數據庫沒有事先加密的話,那book.mdb中所有重要的數據都掌握在別人的手中。  
  解決方法:  
  (1) 為你的數據庫文件名稱起個複雜的非常規的名字,並把他放在幾目  
錄下。所謂"非常規",打個比方:比如有個數據庫要保存的是有關書籍的信息,可不要把他起個"book.mdb"的名字,起個怪怪的名稱,比如d34ksfslf.mdb,再把他放在如./kdslf/i44/studi/ 的幾層目錄下,這樣黑客要想通過猜的方式得到你的ACCESS數據庫文件就難上加難了  
  (2)不要把數據庫名寫在程序中。有些人喜歡把DSN寫在程序中,比如:  
DBPath = Server.MapPath("cmddb.mdb")  
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath  
  假如萬一給人拿到了源程序,你的ACCESS數據庫的名字就一覽無餘。因此建議你在ODBC裡設置數據源,再在程序中這樣寫:  
conn.open "shujiyuan"  
  (3)使用ACCESS來為數據庫文件編碼及加密。首先在選取"工具->安  
全->加密/解密數據庫,選取數據庫(如:employer.mdb),然後接確定,接著會出現"數據庫加密後另存為"的窗口,存為:employer1.mdb。接著employer.mdb就會被編碼,然後存為employer1.mdb..  
  要注意的是,以上的動作並不是對數據庫設置密碼,而只是對數據庫文件加以編碼,目的是為了防止他人使用別的工具來查看數據庫文件的內容。  
  接下來我們為數據庫加密,首先以打開經過編碼了的employer1.mdb,在打開時,選擇"獨佔"方式。然後選取功能表的"工具->安全->設置數據庫密碼",接著輸入密碼即可。  
  為employer1.mdb設置密碼之後,接下來如果再使用ACCEES數據庫文件時,則ACCESS會先要求輸入密碼,驗證正確後才能夠啟動數據庫。  
  不過要在ASP程序中的connection對象的open方法中增加PWD的參數即可,例如:  
param="driver={Microsoft Access Driver (*.mdb)}wd=yfdsfs"  
param=param&";dbq="&server.mappath("employer1.mdb")  
conn.open param  
  這樣即使他人得到了employer1.mdb文件,沒有密碼他是無法看到employer1.mdb的。  

五 ASP漏洞分析和解決方法  
3 code.asp文件會洩漏ASP代碼  
  問題描述:  
  舉個很簡單的例子,在微軟提供的 ASP1.0 的例程裡有一個 .asp 文件,專門用來查看其它 .asp 文件的源代碼,該文件為 ASPSamp/Samples/code.asp。如果有人把這個程序上傳到服務器,而服務器端沒有任何防範措施的話,他就可以很容易地查看他人的程序。例如 :  
  code.asp?source=/directory/file.asp  
  不過這是個比較舊的漏洞了,相信現在很少會出現這種漏洞。  
  下面這命令是比較新的:  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
  最大的危害莫過於asa文件可以被上述方式讀出;數據庫密碼以明文形式暴露在黑客眼前;  
  問題解決或建議:  
  對於IIS自帶的show asp code的asp程序文件,刪除該文件或者禁止訪問該目錄即可  

4、filesystemobject 組件篡改下載 fat 分區上的任何文件的漏洞  
  問題描述:  
  IIS3、 IIS4 的 ASP 的文件操作都可以通過 filesystemobject 實現,包括文本文件的讀寫目錄操作、文件的拷貝改名刪除等,但是這個強大的功能也留下了非常危險的 "後門"。利用 filesystemobjet 可以篡改下載 fat 分區上的任何文件。即使是 ntfs 分區,如果權限沒有設定好的話,同樣也能破壞,一不小心你就可能遭受"滅頂之災 "。遺憾的是很多 webmaster 只知道讓 web 服務器運行起來,很少對 ntfs 進行權限 設置,而 NT 目錄權限的默認設置偏偏安全性又低得可怕。因此,如果你是 Webmaster,建議你密切關注服務器的設置,盡量將 web 目錄建在 ntfs 分區上,目錄不要設定 everyone full control,即使是是管理員組的成員一般也沒什麼必要 full control,只要有讀取、更改權限就足夠了。 也可以把filesystemobject的組件刪除或者改名。  
5、輸入標準的HTML語句或者javascript語句會改變輸出結果  
  問題描述:  
  在輸入框中打入標準的HTML語句會得到什麼相的結果呢?  
  比如一個留言本,我們留言內容中打入:  
你好!  
  如果你的ASP程序中沒有屏蔽html語句,那麼就會改變"你好"字體的大小。在留言本中改變字體大小和貼圖有時並不是什麼壞事,反而可以使留言本生動。但是如果在輸入框中寫個 javascript 的死循環,比如:特大新聞  
  那麼其他查看該留言的客人只要移動鼠標到"特大新聞",上就會使用戶的瀏覽器因死循環而死掉。  
  解決方法和建議:  
  編寫類似程序時應該做好對此類操作的防範,譬如可以寫一段程序判斷客戶端的輸入,並屏蔽掉所有的 HTML、 Javascript 語句。  
五 ASP漏洞分析和解決方法  
6、ASP程序密碼驗證漏洞  
  漏洞描述:  
  很多網站把密碼放到數據庫中,在登陸驗證中用以下sql,(以asp為例)  
sql="select * from user where username=』"&username&"』and pass=』"& pass &』"  
  此時,您只要根據sql構造一個特殊的用戶名和密碼,如:ben』 or 』1』=』1  
就可以進入本來你沒有特權的頁面。再來看看上面那個語句吧:  
sql="select * from user where username=』"&username&"』and pass=』"& pass&』"  
  此時,您只要根據sql構造一個特殊的用戶名和密碼,如:ben』 or 』1』=』1  
這樣,程序將會變成這樣: sql="select*from username where username="&ben』or』1』=1&"and pass="&pass&"  
or 是一個邏輯運算符,作用是在判斷兩個條件的時候,只要其中一個條件成立,那麼等式將會成立.而在語言中,是以1來代表真的(成立).那麼在這行語句中,原語句的"and"驗證將不再繼續,而因為"1=1"和"or"令語句返回為真值.。  
  另外我們也可以構造以下的用戶名:  
username=』aa』 or username<>』aa』  
pass=』aa』 or pass<>』aa』  
  相應的在瀏覽器端的用戶名框內寫入:aa』 or username<>』aa 口令框內寫入:aa』 or pass<>』aa,注意這兩個字符串兩頭是沒有』的。這樣就可以成功的騙過系統而進入。  
  後一種方法理論雖然如此,但要實踐是非常困難的,下面兩個條件都必須具備。  
  1. 你首先要能夠準確的知道系統在表中是用哪兩個字段存儲用戶名和口令的,只有這樣你才能準確的構造出這個進攻性的字符串。實際上這是很難猜中的。  
  2.系統對你輸入的字符串不進行有效性檢查。  
  問題解決和建議:  
  對輸入的內容驗證和"』"號的處理。  
7、IIS4或者IIS5中安裝有INDEX SERVER服務會漏洞ASP源程序  
  問題描述:  
  在運行IIS4或者IIS5的Index Server,輸入特殊的字符格式可以看到ASP源程序或者其它頁面的程序。甚至以及添打了最近關於參看源代碼的補丁程序的系統,或者沒有.htw文件的系統,一樣存在該問題。獲得asp程序,甚至global.asa文件的源代碼,無疑對系統是一個非常重大的安全隱患。往往這些代碼中包含了用戶密碼和ID,以及數據庫的源路徑和名稱等等。這對於攻擊者收集系統信息,進行下一步的入侵都是非常重要的。  
通過構建下面的特殊程序可以參看該程序源代碼:  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
  這樣只是返回一些html格式的文件代碼,但是當你添加%20到CiWebHitsFile的參數後面,如下:  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
  這將獲得該程序的源代碼。  
  (注意:/default.asp是以web的根開始計算。如某站點的訪客無法瀏覽此圖片或連結,請先 註冊登入會員 那麼對應就是:  訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
  由於』null.htw』文件並非真正的系統映射文件,所以只是一個儲存在系統內存中的虛擬文件。哪怕你已經從你的系統中刪除了所有的真實的.htw文件,但是由於對null.htw文件的請求默認是由webhits.dll來處理。所以,IIS仍然收到該漏洞的威脅。  
  問題解決或者建議:  
  如果該webhits提供的功能是系統必須的,請下載相應的補丁程序。如果沒必要,請用IIS的MMC管理工具簡單移除.htw的映像文件。  
補丁程序如下:  
Index Server 2.0:  
Intel:  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
Alpha:  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
Indexing Services for Windows 2000:  
Intel:  
訪客無法瀏覽此圖片或連結,請先 註冊登入會員   
8、ASP聊天室程序的漏洞  
  問題描述:  
  如果聊天室ASP程序設計不當,很容易會給他人利用來做壞事:可以踢人,穿牆,搗亂.  
首先,我們看看聊天室裡有什麼漏洞,大家看看下面這段代碼:  



…………………………  
………………  
………  

OnSubmit="return chksend();">  
******  
********  

發言:   

悄悄:  
對像:  
表情:
!!!!!!  
!!!!  
 以上這段代碼是我在某個聊天室用"測試者"作代號登陸後在發言幀當下來的, 這只是一小部份,但在這一小部份代碼裡面就有兩個漏洞。  
  第一個漏洞  
  大家看看上面的代碼加上"*"號的那兩句,其中第一句中的"測試者"就是我登陸的名字,還有,第二句中的"boy"是登陸時的性別,還有再看看下面我加上"!" 號的兩句,第一句裡還是有我登陸時的名字,這幾句都是我現在想說的兩個漏洞所在點。如果想在這個聊天室裡穿牆的話,只要把發言幀的代碼當下來另存,把"form"的"action"改成聊天室的地址,然後把再"*"號的第一句的"測試者"兩字改成想要的名字就可以了。也可以變換性別,只要把第二句的 "boy"改成"girl"。這就是所謂的穿牆術了。你甚至可以把它改成在線人的名字,然後發言,這樣就冒充別人的姓名談話。  
  第二個漏洞  
  踢人的漏洞就是這個了,我們看一下帶"!"號的第一句,上面有是合法用戶登陸的名字,再看第二句,他有"getout",再加上上面還有一段"form"標籤,這段就是我們退出聊天室時的代碼,這個有什麼用呢?我們先試試看,首先還是把"form"標籤的"action"改成 聊天室的地址,不然就不知道提交給哪個傢伙了。然後把"風風"改成你想踢下去的人的名字然後單擊"退出",那就把那個人踢出聊天室了。這個就是聊天室踢人的漏洞。  
  這兩個漏洞主要的原因是這兩個漏洞使服務程序不識別客戶發出的指令是不是合法用戶。 以上兩漏騙服務程序來更名發出發言,或更名退出,使得真正的使用者受害。  
  當然上面的程序中還有一個漏洞,輸入框沒有對HTML語句和JAVASCRIPT語句做過濾。這個問題我們在漏洞5中已有詳細分析,這裡就不談了。  
  問題解決或者建議:  
  在程序設計中讓服務程序能識別到底是哪個傢伙發出的指令就可以了,具體做法可以為每個聊天者發一個識別碼,像五筆字一樣,也可以用每個聊天者的密碼識別,也可以把聊天者的密碼隨機加密後用作識別等等 ,反正能使你的服務程序識別到底是誰發出的指令就可以了。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。