在本文中,主要探討Web應用程序的安全性,主要包括漏洞攻擊者如何利用不安全的Web應用程序來危害整個服務器或者破壞一個網站、以及開發人員如 何避免引入這些漏洞。主要介紹業界幾個需要被著重考慮的Web應用程序的安全問題:SQL注入、表格和腳本以及Cookies和會話管理。
一、防止SQL注入
SQL(結構化查詢語言)是基于美國國家標準學會(ANSI)標準,并作為共同的語言與數據庫通信。每個數據庫系統增加了一些專有功能到基本的ANSI SQL。
SQL注入是一門將制作好的SQL注入用戶輸入字段的一種技術,它是網頁形式的一部分——用來繞過自定義登錄到網站。然而,SQL注入也可以用于登錄或者接管一個網站,因此要確保其能防止攻擊很重要。
開發人員和管理員可以采取許多不同的步驟解決SQL注入的問題。以下是為開發者提供的解決方案:
· 過濾的所有輸入字段單引號(' ),以防止未經授權的登錄。
· 過濾器SQL命令的所有輸入字段,如插入,選擇,工會,刪除和exec ,以保護服務器操作。 (請確保操作是在過濾單引號后進行)
· 限制輸入字段長度(這將限制攻擊者的選擇),并用服務器端腳本驗證輸入長度。
表1 常見的攻擊者攻擊SQL服務器儲存過程
當我們談Web應用安全的時候 主要談哪些
· 使用選項來過濾“轉義字符” (用于注入SQL代碼,比如單引號) ,如果該數據庫提供了該功能。
· 除了Web 服務器,將數據庫在不同的計算機的Web服務器上。一旦數據庫遭到黑客攻擊,也很難攻擊到Web服務期。
· 限制的服務器端腳本的用戶權限。從服務器端腳本中記錄到數據庫的通常的做法是使用管理用戶,但這可能同事也讓攻擊者趁機運行需要管理用戶的數據庫任務(如修改表或運行存儲過程) 。所以用最小的用戶權限分配來達到此目的。
· 刪除所有不必要的擴展存儲過程來限制攻擊者的可能性。
· 將數據庫放置到一個單獨的空間(在防火墻后面) ,與Web容器和應用服務器相隔離。
不同于開發商,管理員沒有代碼的控制權,不能代表程序員產生變化。然而管理員可以通過運行一些測試,并確保代碼安全來降低風險:
· 確保Web服務器給返回一個自定義錯誤頁。這樣一來,服務器將不會返回SQL錯誤,這將使攻擊者更難獲得SQL數據。(自定義錯誤頁面不應該包含任何可能有助于攻擊者的信息,不同于常規將返回部分SQL的錯誤頁面。)
· 只部署從Web服務器分離數據的Web應用程序。
· 聘請外部機構對Web服務器上執行穿透測試,并尋找SQL注入攻擊。
· 使用一個專用的自動掃描設備來探索由程序員的失誤導致的SQL注入漏洞。
· 部署安全解決方案來驗證用戶輸入并過濾SQL注入企圖。
二、防止窗體和腳本泄密
窗體用于允許用戶輸入,但也可以用來管理會話,并在會話內傳輸的重要數據(如用戶或會話標識符)。攻擊者可以暴露嵌入在創窗口中的數據,并通過Web應用暴露其他用戶信息,或以較低的價格在電子商務中進行交易。3種暴露形式如下:
· 禁用客戶端腳本
· 在URL中傳遞參數
· 通過隱藏字段傳遞參數
1. 客戶端腳本
一些開發人員使用客戶端腳本來驗證各種方式輸入字段:
· 限制輸入字段的大小
· 禁止某些字符(如單引號)
· 執行其他類型的驗證(這些可以具體到每個站點)
通過禁用客戶端腳本( JavaScript或VBScript)中,此驗證可輕松繞過。開發人員應該在服務器端驗證所有字段。這可能需要服務器上的額外資源。
2. 通過URL傳遞參數
窗口有兩種方法來傳遞數據: post和get 。 post命令。在內容流發送數據和get命令在URL中發送數據。攻擊者可以利用get命令來發送無效或不正確的數據,或發送惡意代碼。
例如,假設我們有這樣的形式:
…
Username:
Password:
…
讓我們假設用戶輸入someusername作為用戶名,somepassword為密碼。瀏覽器會被重定向到這個URL
http://thesite/login.asp?username=someusername?password=somepassword
攻擊者可以通過簡單地修改URL的數據(利用此類型的URL在瀏覽器的地址欄)。這個方法可以用在電子商務網站來改變項目的價格。例如,看看下面的網址:
http://somesite/checkout.asp?totalprice=100
攻擊者可以簡單地改變“TOTALPRICE”的值,并執行檢出有以較低的價格比之意。這可以簡單地通過改變這樣的URL來完成:
http://somesite/checkout.asp?totalprice=50
Web應用程序將執行檢驗,但總價為50美元(代替了100美元)。
另一種情況是,在登錄后,用戶識別正在使用GET發送,讓攻擊者修改它,并在另一個用戶的名義執行操作。以下網址就是一個例子
http://somesite/changeuserinfo.asp?user=134
攻擊者可以更改“用戶”的值,并當存在用戶的時候獲得該用戶的數據。
3. 通過隱藏字段傳遞數據
POST在發送數據的時候使用的是HTTP命令。不同于get,這種方法不會顯示在URL中的數據,但它也更容易被利用。考慮以下表格:
…
…
這種形式使用POST傳輸用戶的標識符。攻擊者可以保存HTML ,修改用戶ID字段,修改檢測路徑(鏈接到原來的網站,如:
4. 解決數據傳輸問題
開發人員可以使用GUID 或通過加密的信息,修改管理會話信息隱藏起來的數據來阻止攻擊者。
· 管理會話信息: 大多數服務器端腳本技術允許開發人員來存儲用戶的會話信息,這是節省特殊會話信息最安全的方法,因為所有的數據都存儲在本地Web服務器計算機上。
· 使用GUID:全局唯一標識符或GUID是一個128位的隨機生成的數字具有2128的可能值。GUID可以作為用戶標識符被Web應用程序程序員使用。 假設一個Web服務器有40億用戶(大約232 ,遠遠超過了上網人數),這意味著平均每個用戶有296可能值(2128 /232 = 296 )。由于296接近于7后面28個0,攻擊者就沒有機會猜測,訪問正確的GUID 。
· 對數據進行加密:開發人員可以加密通過數據,而不是用明文通過數據。這些數據應該用主密鑰加密(僅在Web服務器上儲存的對稱密鑰用于儲存客戶端數據) 。如果攻擊者試圖修改加密數據,客戶端將檢測到有人篡改數據。
值得注意的是:切勿使用用戶的信息衍生信息作為隱藏的標識符,如用戶名MD5 hash。攻擊者會嘗試找到這樣的快捷方式,并暴露它們。
三、Cookies和會話管理
Web會話根據不同的服務器端腳本技術有不同的實現方式,但一般當用戶輸入該網站它們就會啟動,并且當用戶關閉瀏覽器或會話超時它們就會終止。會話用于跟蹤用戶的活動,諸如用戶加入商品到購物車中,該網站通過使用會話標識符跟蹤商品進度。
會話使用cookie(由網站每個站點或每個頁面發送的數據,由用戶的瀏覽器存儲)。每次用戶訪問Web站點時就發送了一個cookie,瀏覽器會 發送cookie返回到該網站。(雖然Cookie可以被用來跟蹤用戶的上網行為和被認為是一個主要的隱私威脅,但他們仍然是會話管理的最佳媒介。 )會話使用Cookie來識別用戶,并以積極的會話標識符配對。
攻擊者可以濫用會話和cookie,下面部分將處理各種風險:
· 會話盜竊
· 通過發送數據到其他用戶管理會話
· Web服務器的cookie的攻擊
· 保護會話
1. 會話盜竊
假設一個用戶在登錄到使用會話的網站。該網站作為驗證過標記會話并允許身份驗證的用戶瀏覽安全區域。運用post或get來保存弱會話標識符或其他 相關的識別數據(如電子郵件地址)不是最好的選擇。取而代之的是,網站可以使用cookie命令來保存敏感數據,但攻擊者也可以攻破。服務器端的 cookie是另一種選擇。
讓我們假設網站使用電子郵件地址作為識別數據。之后,用戶必須登錄后,系統才會發送給瀏覽器一個包含用戶的電子郵件地址的cookie。對于每一個 用戶將訪問的頁面,瀏覽器將發送包含用戶E-mail地址的cookie。該網站會檢查Cookie中的數據,并允許用戶訪問通過許可證的網頁。
攻擊者可能修改在cookie中的數據。然而,假設cookie包含someemail@site.com ,我們每次訪問網站的時候就可以自動訪問限制區域。如果攻擊者將他cookie中的E- mail地址(位于他的計算機上)改為someotheremail@site.com ,下一次攻擊者訪問站點時,他就會被默認為是該用戶 ,允許他訪問用戶的數據。
2. 無數據發送到用戶的會話管理
有些用戶禁用cookies(保護自己的隱私),這表明也不允許會話管理(其需要Cookies)。除非該網站使用的是安全性較低方法來管理會話,跟蹤用戶的唯一方法是通過使用IP地址作為識別碼。然而,這種方法有很多問題:
· 有些用戶通過瀏覽網絡地址轉換(NAT),如企業用戶,它們將共享一個或有限數量的IP地址。
· 有些用戶上網通過匿名代理,他們將分享這個代理的IP地址(雖然有些代理通過發送客戶端的地址來允許Web站點使用它的會話管理)。
· 有些用戶使用撥號連接和共享一個IP地址區,這意味著當用戶斷開連接時,下一個連接的用戶將得到該IP地址。(這個問題可以用一個短的IP超時來解決,在時間到期之后,IP地址不會被鏈接到一個會話。)
3. 確保會話跟蹤
確保會話跟蹤的最好方法是使用一個難以猜測的標識符,來確定是否是來自用戶的數據,如加密字符串或GUID ,并將該標識符鏈接到用戶的IP地址。以防多個用戶共享一個IP地址,會話標識符可用于區分它們。
此外,短的超時時間可以在限制的時間用完以后,刪除活動會話。這表明,如果用戶不正常關閉瀏覽器(如在一臺計算機或瀏覽器崩潰的情況下),該會話由服務器關閉。
4. Web服務器的Cookies攻擊
攻擊者通過專用軟件打開很多連接,使用cookies管理來耗盡Web服務器的資源。由于當一個瀏覽器關閉時,該軟件不會發送“關閉”事件,該會話不會被刪除直到超時。在此期間,該會話的信息被保存或者在存儲器中或硬盤驅動器,浪費資源。
解決這個問題的方法是配置防火墻,以便它不容許更大于每秒特定數目的連接,這將阻止攻擊者啟動無限數量的連接。
四、注意其他一般攻擊
有些攻擊是不屬于任何特定類別的一部分,但他們仍然對Web應用程序構成顯著風險。其中易損壞的腳本,嘗試強制性登錄,和緩沖區溢出。
1. 易損壞腳本
有人公開使用的腳本(這在本質上是等同于Web應用程序)包含錯誤,允許攻擊者查看或修改文件,甚至接管Web服務器的計算機。找出Web服務器是 否包含這樣的腳本最好的方法是運行一個漏洞掃描器,不管是免費的或商用的。如果找到這樣一個腳本,它會被更新(更新為不容易受攻擊的版本)或被其他腳本替 代。
2. 強制性登錄
攻擊者可以嘗試使用字典進行強制性登錄(一個標準的Web登錄或自定義的ASP)。有許多的打擊這種強制性攻擊的方法:
· 限制每個IP地址的每秒連接數(在防火墻級別或服務器端腳本級別進行定義)
· 強制用戶選擇包含大寫和小寫字母和數字的高安全性密碼
3. 緩沖區溢出
緩沖區溢出可以用來獲得對Web服務器的控制。攻擊者發送大量包含匯編代碼的輸入,如果腳本存在漏洞,字符串會被執行,并且通常運行一個木馬程序,這將允許攻擊者接管計算機。
結論
Web應用程序比客戶端應用程序更難保證安全性,因為它不像Web服務器有四,五個主要供應商的Web服務器,它 有大量的Web應用程序和自定義腳本數量,而且每個都可能包含潛在的漏洞。對于開發人員來說,確保應用程序安全的最佳方法是使用建議的安全措施和可以掃描 代碼的軟件,并提醒用戶潛在的安全問題。管理員需要定期掃描其Web站點中的漏洞。