Web開發常見的幾個漏洞解決方法
另外,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 from TestDB.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", "exec master.dbo.xp_cmdshell", "net localgroup administrators" }; //構造正則表達式 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 By Name 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注入的惡意數據"); } ........................... }以上只是防止Sql攻擊的一個方面,還有就是堅持使用參數化的方式進行賦值,這樣很大程度上減少可能受到SQL注入攻擊。Database db = CreateDatabase(); DbCommand command = db.GetSqlStringCommand(sql); command.Parameters.AddRange(param);3、跨站腳本攻擊漏洞出現和修復跨站腳本攻擊,又稱XSS代碼攻擊,也是一種常見的腳本注入攻擊。例如在下面的界面上,很多輸入框是可以隨意輸入內容的,特別是一些文本編輯框裡面,可以輸入例如<script>alert("這是一個頁面彈出警告");</script>這樣的內容,如果在一些首頁出現很多這樣內容,而又不經過處理,那麼頁面就不斷的彈框,更有甚者,在裡面執行一個無限循環的腳本函數,直到頁面耗盡資源為止,類似這樣的攻擊都是很常見的,所以我們如果是在外網或者很有危險的網路上發布程序,一般都需要對這些問題進行修復。
XSS代碼攻擊還可能會竊取或操縱客戶會話和 Cookie,它們可能用於模仿合法用戶,從而使黑客能夠以該用戶身份查看或變更用戶記錄以及執行事務。[建議措施]清理用戶輸入,並過濾出 JavaScript 代碼。我們建議您過濾下列字元:[1] <>(尖括弧)[2] "(引號)[3] "(單引號)[4] %(百分比符號)[5] ;(分號)[6] ()(括弧)[7] &(& 符號)[8] +(加號)為了避免上述的XSS代碼攻擊,解決辦法是可以使用HttpUitility的HtmlEncode或者最好使用微軟發布的AntiXSSLibrary進行處理,這個更安全。微軟反跨站腳本庫(AntiXSSLibrary)是一種編碼庫,旨在幫助保護開發人員保護他們的基於Web的應用不被XSS攻擊。編碼方法使用場景示例HtmlEncode(String)不受信任的HTML代碼。<a href=」http://www.cnblogs.com」>Click Here [不受信任的輸入]</a>HtmlAttributeEncode(String)不受信任的HTML屬性<hr noshade size=[不受信任的輸入]>JavaScriptEncode(String)不受信任的輸入在JavaScript中使用<script type=」text/javascript」>…[Untrusted input]…</script>UrlEncode(String)不受信任的URL<a href=」http://cnblogs.com/results.aspx?q=[Untrusted input]」>Cnblogs.com</a>VisualBasicScriptEncode(String)不受信任的輸入在VBScript中使用<script type=」text/vbscript」 language=」vbscript」>…[Untrusted input]…</script>XmlEncode(String)不受信任的輸入用於XML輸出<xml_tag>[Untrusted input]</xml_tag>XmlAttributeEncode(String)不 受信任的輸入用作XML屬性<xml_tag attribute=[Untrusted input]>Some Text</xml_tag>protected void Page_Load(object sender, EventArgs e) { this.lblName.Text = Encoder.HtmlEncode("<script>alert("OK");</SCRIPT>"); }例如上面的內容,賦值給一個Lable控制項,不會出現彈框的操作。
但是,我們雖然顯示的時候設置了轉義,輸入如果要限制它們怎麼辦呢,也是使用AntiXSSLibrary裡面的HtmlSanitizationLibrary類庫Sanitizer.GetSafeHtmlFragment即可。protected void btnPost_Click(object sender, EventArgs e) { this.lblName.Text = Sanitizer.GetSafeHtmlFragment(txtName.Text); }這樣對於特殊腳本的內容,會自動剔除過濾,而不會記錄了,從而達到我們想要的目的。
4、IIS短文件/文件夾漏洞出現和修復
通過猜解,可能會得出一些重要的網頁文件地址,如可能在/Pages/Security/下存在UserList.aspx和MenuList.aspx文件。[建議措施]1)禁止url中使用「~」或它的Unicode編碼。2)關閉windows的8.3格式功能。修復可以參考下面的做法,或者找相關運維部門進行處理即可。http://sebug.net/vuldb/ssvid-60252http://webscan.360.cn/vul/view/vulid/1020http://www.bitscn.com/network/security/200607/36285.html5、系統敏感信息泄露出現和修復如果頁面繼承一般的page,而沒有進行Session判斷,那麼可能會被攻擊者獲取到頁面地址,進而獲取到例如用戶名等重要數據的。一般避免這種方式是對於一些需要登錄才能訪問到的頁面,一定要進行Session判斷,可能很容易給漏掉了。如我在Web框架裡面,就是繼承一個BasePage,BasePage 統一對頁面進行一個登錄判斷。public partial class UserList : BasePage { protected void Page_Load(object sender, EventArgs e) { .............../// <summary> /// BasePage 集成自許可權基礎抽象類FPage,其他頁面則集成自BasePage /// </summary> public class BasePage : FPage { /// <summary> /// 默認構造函數 /// </summary> public BasePage() { this.IsFunctionControl = true;//默認頁面啟動許可權認證 } /// <summary> /// 檢查用戶是否登錄 /// </summary> private void CheckLogin() { if (string.IsNullOrEmpty(Permission.Identity)) { string url = string.Format("{0}/Pages/CommonPage/Login.aspx?userRequest={1}", Request.ApplicationPath.TrimEnd("/"), HttpUtility.UrlEncode(Request.Url.ToString())); Response.Redirect(url); } } /// <summary> /// 覆蓋HasFunction方法以使許可權類判斷是否具有某功能點的許可權 /// </summary> /// <param name="functionId"></param> /// <returns></returns> protected override bool HasFunction(string functionId) { CheckLogin(); bool breturn = false; try { breturn = Permission.HasFunction(functionId); } catch (Exception) { Helper.Alerts(this, "BasePage調用許可權系統的HasFunction函數出錯"); } return breturn; } protected override void OnInit(EventArgs e) { Response.Cache.SetNoStore(); //清除緩存 base.OnInit(e); CheckLogin(); }否則可能會受到攻擊,並通過抓包軟體發現頁面數據,獲得一些重要的用戶名或者相關信息。還有一個值得注意的地方,就是一般這種不是很安全的網路,最好要求輸入比較複雜一點的密碼(強制要求),例如不能全部是數字密碼或者不能是純字元,對位數也要求多一點,因為很多人輸入12345678,123456,123這樣的密碼,很容易被猜出來並登錄系統,造成不必要的損失。6、總結性建議針對上面發現的問題,提出下面幾條建議。1)在伺服器與網路的介面處配置防火牆,用於阻斷外界用戶對伺服器的掃描和探測。2)限制網站後台訪問許可權,如:禁止公網IP訪問後台;禁止服務員使用弱口令。3)對用戶輸入的數據進行全面安全檢查或過濾,尤其注意檢查是否包含SQL 或XSS特殊字元。這些檢查或過濾必須在伺服器端完成。4)關閉windows的8.3格式功能。5)限制敏感頁面或目錄的訪問許可權。
你的讚賞是我堅持原創的動力
讚賞共 0 人讚賞推薦閱讀:
※CVE-2016-0040 濫用GDI 內核提權漏洞
※國外為什麼沒有稅收漏洞?
※嚇skr人:一輛自動駕駛汽車漏洞破萬!?
※美國面對中國這武器沉默不語,原來其航母一漏洞成致命弱點
※消防漏洞延誤救援,判物業賠48萬