常見Web開發漏洞解決方法

由於一般的web開發項目主要是內部使用的業務系統,所以對於安全性一般不是看的很重,基本上由於是內網系統。但有時候一些系統平臺,需要外網也要使用,這種情況下,各方面的安全性就要求比較高了,所以往往會交付給一些專門做安全測試的第三方機構進行測試,然後根據反饋的漏洞進行修復,如果你平常對於一些安全漏洞不夠了解,那麼反饋的結果往往是很殘酷的,迫使你必須在很多細節上進行修復完善。本文針對這些漏洞問題的修復方案,介紹在這方面的一些經驗。

 

基本上,參加的安全測試(滲透測試)的網站,可能或多或少存在下面幾個漏洞:SQL注入漏洞、跨站腳本攻擊漏洞、登陸後臺管理頁面、IIS短文件/文件夾漏洞、系統敏感信息泄露。

 

1、測試的步驟及內容

 

這些安全性測試,據瞭解一般是先收集數據,然後進行相關的滲透測試工作,獲取到網站或者系統的一些敏感數據,從而可能達到控制或者破壞系統的目的。

 

第一步是信息收集,收集如IP地址、DNS記錄、軟件版本信息、IP段等信息。可以採用方法有:

 

1)基本網絡信息獲取;

 

2)Ping目標網絡得到IP地址和TTL等信息;

 

3)Tcptraceroute和Traceroute 的結果;

 

4)Whois結果;

 

5)Netcraft獲取目標可能存在的域名、Web及服務器信息;

 

6)Curl獲取目標Web基本信息;

 

7)Nmap對網站進行端口掃描並判斷操作系統類型;

 

8)Google、Yahoo、Baidu等搜索引擎獲取目標信息;

 

9)FWtester 、Hping3 等工具進行防火牆規則探測;

 

10)其他。

 

第二步是進行滲透測試,根據前面獲取到的數據,進一步獲取網站敏感數據。此階段如果成功的話,可能獲得普通權限。採用方法會有有下面幾種

 

1)常規漏洞掃描和採用商用軟件進行檢查;

 

2)結合使用ISS與Nessus等商用或免費的掃描工具進行漏洞掃描;

 

3)採用SolarWinds對網絡設備等進行搜索發現;

 

4)採用Nikto、Webinspect等軟件對Web常見漏洞進行掃描;

 

5)採用如AppDetectiv之類的商用軟件對數據庫進行掃描分析;

 

6)對Web和數據庫應用進行分析;

 

7)採用WebProxy、SPIKEProxy、Webscarab、ParosProxy、Absinthe等工具進行分析;

 

8)用Ethereal抓包協助分析;

 

9)用Webscan、Fuzzer進行SQL注入和XSS漏洞初步分析;

 

10)手工檢測SQL注入和XSS漏洞;

 

11)採用類似OScanner的工具對數據庫進行分析;

 

12)基於通用設備、數據庫、操作系統和應用的攻擊;採用各種公開及私有的緩衝區溢出程序代碼,也採用諸如MetasploitFramework 之類的利用程序集合。

 

13)基於應用的攻擊。基於Web、數據庫或特定的B/S或C/S結構的網絡應用程序存在的弱點進行攻擊。

 

14)口令猜解技術。進行口令猜解可以採用X-Scan、Brutus、Hydra、溯雪等工具。

 

第三步就是嘗試由普通權限提升爲管理員權限,獲得對系統的完全控制權。在時間許可的情況下,必要時從第一階段重新進行。採用方法

 

1)口令嗅探與鍵盤記錄。嗅探、鍵盤記錄、木馬等軟件,功能簡單,但要求不被防病毒軟件發覺,因此通常需要自行開發或修改。

 

2)口令破解。有許多著名的口令破解軟件,如L0phtCrack、John the Ripper、Cain 等

 

以上一些是他們測試的步驟,不過我們不一定要關注這些過程性的東西,我們可能對他們反饋的結果更關注,因爲可能會爆發很多安全漏洞等着我們去修復的。

 

2、SQL注入漏洞的出現和修復

 

1)SQL注入定義:

 

SQL注入攻擊是黑客對數據庫進行攻擊的常用手段之一。隨着B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由於程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。

 

SQL注入有時候,在地址參數輸入,或者控件輸入都有可能進行。如在鏈接後加入’號,頁面報錯,並暴露出網站的物理路徑在很多時候,很常見,當然如果關閉了Web.Config的CustomErrors的時候,可能就不會看到。

 

另外,Sql注入是很常見的一個攻擊,因此,如果對頁面參數的轉換或者沒有經過處理,直接把數據丟給Sql語句去執行,那麼可能就會暴露敏感的信息給對方了。如下面兩個頁面可能就會被添加註入攻擊。

 

①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD... type='U' and status>0)>0 得到第一個用戶建立表的名稱,並與整數進行比較,顯然abc.asp工作異常,但在異常中卻可以發現表的名稱。假設發現的表名是xyz,則

 

②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name fromTestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 可以得到第二個用戶建立的表的名稱,同理就可得到所有用建立的表的名稱。

 

爲了屏蔽危險Sql語句的執行,可能需要對進行嚴格的轉換,例如如果是整形的,就嚴格把它轉換爲整數,然後在操作,這樣可以避免一些潛在的危險,另外對構造的sql語句必須進行Sql注入語句的過濾,如我的框架(Winform開發框架、Web開發框架等)裏面就內置了對這些有害的語句和符號進行清除工作,由於是在基類進行了過濾,因此基本上子類都不用關心也可以避免了這些常規的攻擊了。

 

/// <summary> 

       /// 驗證是否存在注入代碼(條件語句) 

       /// </summary> 

       /// <param name="inputData"></param> 

       public bool HasInjectionData(string inputData) 

       { 

           if (string.IsNullOrEmpty(inputData)) 

                return false; 

 

           //裏面定義惡意字符集合 

           //驗證inputData是否包含惡意集合 

           if (Regex.IsMatch(inputData.ToLower(), GetRegexString())) 

           { 

                return true; 

           } 

           else

           { 

                return false; 

           } 

       } 

 

       /// <summary> 

       /// 獲取正則表達式 

       /// </summary> 

       /// <returns></returns> 

       private static string GetRegexString() 

       { 

           //構造SQL的注入關鍵字符 

           string[] strBadChar = 

           { 

                //"select\\s", 

                //"from\\s", 

                "insert\\s", 

                "delete\\s", 

                "update\\s", 

                "drop\\s", 

                "truncate\\s", 

                "exec\\s", 

                "count\\(", 

                "declare\\s", 

                "asc\\(", 

                "mid\\(", 

                "char\\(", 

                "net user", 

                "xp_cmdshell", 

                "/add\\s", 

                "execmaster.dbo.xp_cmdshell", 

                "net localgroupadministrators"

           }; 

 

           //構造正則表達式 

           string str_Regex = ".*("; 

           for (int i = 0; i < strBadChar.Length - 1; i++) 

           { 

                str_Regex += strBadChar[i] +"|"; 

           } 

           str_Regex +=strBadChar[strBadChar.Length - 1] + ").*"; 

 

           return str_Regex; 

       }

上面的語句用於判別常規的Sql攻擊字符,我在數據庫操作的基類裏面,只需要判別即可,如下面的一個根據條件語句查找數據庫記錄的函數。

 

 

/// <summary> 

       /// 根據條件查詢數據庫,並返回對象集合 

       /// </summary> 

       /// <param name="condition">查詢的條件</param> 

       /// <param name="orderBy">自定義排序語句,如Order ByName Desc;如不指定,則使用默認排序</param> 

       /// <param name="paramList">參數列表</param> 

       /// <returns>指定對象的集合</returns> 

       public virtual List<T> Find(string condition, string orderBy,IDbDataParameter[] paramList) 

       { 

           if (HasInjectionData(condition)) 

           { 

               LogTextHelper.Error(string.Format("檢測出SQL注入的惡意數據,{0}", condition)); 

                throw new Exception("檢測出SQL注入的惡意數據"); 

           } 

 

           ........................... 

       }

 

本文爲Anyforweb技術分享博客,需要了解網站建設及更多web應用相關信息,請訪問anyforweb.com。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章