qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          Web開(kāi)發(fā)常見(jiàn)的幾個(gè)漏洞解決方法

           平時(shí)工作,多數(shù)是開(kāi)發(fā)Web項(xiàng)目,由于一般是開(kāi)發(fā)內(nèi)部使用的業(yè)務(wù)系統(tǒng),所以對(duì)于安全性一般不是看的很重,基本上由于是內(nèi)網(wǎng)系統(tǒng),一般也很少會(huì)受到攻擊,但有時(shí)候一些系統(tǒng)平臺(tái),需要外網(wǎng)也要使用,這種情況下,各方面的安全性就要求比較高了,所以往往會(huì)交付給一些專(zhuān)門(mén)做安全測(cè)試的第三方機(jī)構(gòu)進(jìn)行測(cè)試,然后根據(jù)反饋的漏洞進(jìn)行修復(fù),如果你平常對(duì)于一些安全漏洞不夠了解,那么反饋的結(jié)果往往是很殘酷的,迫使你必須在很多細(xì)節(jié)上進(jìn)行修復(fù)完善。本文主要根據(jù)本人項(xiàng)目的一些第三方安全測(cè)試結(jié)果,以及本人針對(duì)這些漏洞問(wèn)題的修復(fù)方案,介紹在這方面的一些經(jīng)驗(yàn),希望對(duì)大家有幫助。
            基本上,參加的安全測(cè)試(滲透測(cè)試)的網(wǎng)站,可能或多或少存在下面幾個(gè)漏洞:SQL注入漏洞、跨站腳本攻擊漏洞、登陸后臺(tái)管理頁(yè)面、IIS短文件/文件夾漏洞、系統(tǒng)敏感信息泄露。
            1、測(cè)試的步驟及內(nèi)容
            這些安全性測(cè)試,據(jù)了解一般是先收集數(shù)據(jù),然后進(jìn)行相關(guān)的滲透測(cè)試工作,獲取到網(wǎng)站或者系統(tǒng)的一些敏感數(shù)據(jù),從而可能達(dá)到控制或者破壞系統(tǒng)的目的。
            第一步是信息收集,收集如IP地址、DNS記錄、軟件版本信息、IP段等信息。可以采用方法有:
            1)基本網(wǎng)絡(luò)信息獲取;
            2)Ping目標(biāo)網(wǎng)絡(luò)得到IP地址和TTL等信息;
            3)Tcptraceroute和Traceroute 的結(jié)果;
            4)Whois結(jié)果;
            5)Netcraft獲取目標(biāo)可能存在的域名、Web及服務(wù)器信息;
            6)Curl獲取目標(biāo)Web基本信息;
            7)Nmap對(duì)網(wǎng)站進(jìn)行端口掃描并判斷操作系統(tǒng)類(lèi)型;
            8)Google、Yahoo、Baidu等搜索引擎獲取目標(biāo)信息;
            9)FWtester 、Hping3 等工具進(jìn)行防火墻規(guī)則探測(cè);
            10)其他。
            第二步是進(jìn)行滲透測(cè)試,根據(jù)前面獲取到的數(shù)據(jù),進(jìn)一步獲取網(wǎng)站敏感數(shù)據(jù)。此階段如果成功的話,可能獲得普通權(quán)限。采用方法會(huì)有有下面幾種:
            1)常規(guī)漏洞掃描和采用商用軟件進(jìn)行檢查;
            2)結(jié)合使用ISS與Nessus等商用或免費(fèi)的掃描工具進(jìn)行漏洞掃描;
            3)采用SolarWinds對(duì)網(wǎng)絡(luò)設(shè)備等進(jìn)行搜索發(fā)現(xiàn);
            4)采用Nikto、Webinspect等軟件對(duì)Web常見(jiàn)漏洞進(jìn)行掃描;
            5)采用如AppDetectiv之類(lèi)的商用軟件對(duì)數(shù)據(jù)庫(kù)進(jìn)行掃描分析;
            6)對(duì)Web和數(shù)據(jù)庫(kù)應(yīng)用進(jìn)行分析;
            7)采用WebProxy、SPIKEProxy、Webscarab、ParosProxy、Absinthe等工具進(jìn)行分析;
            8)用Ethereal抓包協(xié)助分析;
            9)用Webscan、Fuzzer進(jìn)行SQL注入和XSS漏洞初步分析;
            10)手工檢測(cè)SQL注入和XSS漏洞;
            11)采用類(lèi)似OScanner的工具對(duì)數(shù)據(jù)庫(kù)進(jìn)行分析;
            12)基于通用設(shè)備、數(shù)據(jù)庫(kù)、操作系統(tǒng)和應(yīng)用的攻擊;采用各種公開(kāi)及私有的緩沖區(qū)溢出程序代碼,也采用諸如MetasploitFramework 之類(lèi)的利用程序集合。
            13)基于應(yīng)用的攻擊。基于Web、數(shù)據(jù)庫(kù)或特定的B/S或C/S結(jié)構(gòu)的網(wǎng)絡(luò)應(yīng)用程序存在的弱點(diǎn)進(jìn)行攻擊。
            14)口令猜解技術(shù)。進(jìn)行口令猜解可以采用 X-Scan、Brutus、Hydra、溯雪等工具。
            第三步就是嘗試由普通權(quán)限提升為管理員權(quán)限,獲得對(duì)系統(tǒng)的完全控制權(quán)。在時(shí)間許可的情況下,必要時(shí)從第一階段重新進(jìn)行。采用方法
            1)口令嗅探與鍵盤(pán)記錄。嗅探、鍵盤(pán)記錄、木馬等軟件,功能簡(jiǎn)單,但要求不被防病毒軟件發(fā)覺(jué),因此通常需要自行開(kāi)發(fā)或修改。
            2)口令破解。有許多著名的口令破解軟件,如 L0phtCrack、John the Ripper、Cain 等。
            以上一些是他們測(cè)試的步驟,不過(guò)我們不一定要關(guān)注這些過(guò)程性的東西,我們可能對(duì)他們反饋的結(jié)果更關(guān)注,因?yàn)榭赡軙?huì)爆發(fā)很多安全漏洞等著我們?nèi)バ迯?fù)的。
            2、SQL注入漏洞的出現(xiàn)和修復(fù)
            1)SQL注入定義:
            SQL注入攻擊是黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段之一。隨著B(niǎo)/S模式應(yīng)用開(kāi)發(fā)的發(fā)展,使用這種模式編寫(xiě)應(yīng)用程序的程序員也越來(lái)越多。但是由于程序員的水平及經(jīng)驗(yàn)也參差不齊,相當(dāng)大一部分程序員在編寫(xiě)代碼的時(shí)候,沒(méi)有對(duì)用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患。用戶可以提交一段數(shù)據(jù)庫(kù)查詢代碼,根據(jù)程序返回的結(jié)果,獲得某些他想得知的數(shù)據(jù),這就是所謂的SQL Injection,即SQL注入。
            SQL注入有時(shí)候,在地址參數(shù)輸入,或者控件輸入都有可能進(jìn)行。如在鏈接后加入’號(hào),頁(yè)面報(bào)錯(cuò),并暴露出網(wǎng)站的物理路徑在很多時(shí)候,很常見(jiàn),當(dāng)然如果關(guān)閉了Web.Config的CustomErrors的時(shí)候,可能就不會(huì)看到。
            另外,Sql注入是很常見(jiàn)的一個(gè)攻擊,因此,如果對(duì)頁(yè)面參數(shù)的轉(zhuǎn)換或者沒(méi)有經(jīng)過(guò)處理,直接把數(shù)據(jù)丟給Sql語(yǔ)句去執(zhí)行,那么可能就會(huì)暴露敏感的信息給對(duì)方了。如下面兩個(gè)頁(yè)面可能就會(huì)被添加注入攻擊:
            ①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status>0)>0 得到第一個(gè)用戶建立表的名稱(chēng),并與整數(shù)進(jìn)行比較,顯然abc.asp工作異常,但在異常中卻可以發(fā)現(xiàn)表的名稱(chēng)。假設(shè)發(fā)現(xiàn)的表名是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 可以得到第二個(gè)用戶建立的表的名稱(chēng),同理就可得到所有用建立的表的名稱(chēng)。

            為了屏蔽危險(xiǎn)Sql語(yǔ)句的執(zhí)行,可能需要對(duì)進(jìn)行嚴(yán)格的轉(zhuǎn)換,例如如果是整形的,就嚴(yán)格把它轉(zhuǎn)換為整數(shù),然后在操作,這樣可以避免一些潛在的危險(xiǎn),另外對(duì)構(gòu)造的sql語(yǔ)句必須進(jìn)行Sql注入語(yǔ)句的過(guò)濾,如我的框架(Winform開(kāi)發(fā)框架、Web開(kāi)發(fā)框架等)里面就內(nèi)置了對(duì)這些有害的語(yǔ)句和符號(hào)進(jìn)行清除工作,由于是在基類(lèi)進(jìn)行了過(guò)濾,因此基本上子類(lèi)都不用關(guān)心也可以避免了這些常規(guī)的攻擊了。
          /// <summary>
          /// 驗(yàn)證是否存在注入代碼(條件語(yǔ)句)
          /// </summary>
          /// <param name="inputData"></param>
          public bool HasInjectionData(string inputData)
          {
          if (string.IsNullOrEmpty(inputData))
          return false;
          //里面定義惡意字符集合
          //驗(yàn)證inputData是否包含惡意集合
          if (Regex.IsMatch(inputData.ToLower(), GetRegexString()))
          {
          return true;
          }
          else
          {
          return false;
          }
          }
          /// <summary>
          /// 獲取正則表達(dá)式
          /// </summary>
          /// <returns></returns>
          private static string GetRegexString()
          {
          //構(gòu)造SQL的注入關(guān)鍵字符
          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"
          };
          //構(gòu)造正則表達(dá)式
          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;
          }
            上面的語(yǔ)句用于判別常規(guī)的Sql攻擊字符,我在數(shù)據(jù)庫(kù)操作的基類(lèi)里面,只需要判別即可,如下面的一個(gè)根據(jù)條件語(yǔ)句查找數(shù)據(jù)庫(kù)記錄的函數(shù)。
          /// <summary>
          /// 根據(jù)條件查詢數(shù)據(jù)庫(kù),并返回對(duì)象集合
          /// </summary>
          /// <param name="condition">查詢的條件</param>
          /// <param name="orderBy">自定義排序語(yǔ)句,如Order By Name Desc;如不指定,則使用默認(rèn)排序</param>
          /// <param name="paramList">參數(shù)列表</param>
          /// <returns>指定對(duì)象的集合</returns>
          public virtual List<T> Find(string condition, string orderBy, IDbDataParameter[] paramList)
          {
          if (HasInjectionData(condition))
          {
          LogTextHelper.Error(string.Format("檢測(cè)出SQL注入的惡意數(shù)據(jù), {0}", condition));
          throw new Exception("檢測(cè)出SQL注入的惡意數(shù)據(jù)");
          }
          ...........................
          }
            以上只是防止Sql攻擊的一個(gè)方面,還有就是堅(jiān)持使用參數(shù)化的方式進(jìn)行賦值,這樣很大程度上減少可能受到SQL注入攻擊。
          3、跨站腳本攻擊漏洞出現(xiàn)和修復(fù)
            跨站腳本攻擊,又稱(chēng)XSS代碼攻擊,也是一種常見(jiàn)的腳本注入攻擊。例如在下面的界面上,很多輸入框是可以隨意輸入內(nèi)容的,特別是一些文本編輯框里面,可以輸入例如<script>alert('這是一個(gè)頁(yè)面彈出警告');</script>這樣的內(nèi)容,如果在一些首頁(yè)出現(xiàn)很多這樣內(nèi)容,而又不經(jīng)過(guò)處理,那么頁(yè)面就不斷的彈框,更有甚者,在里面執(zhí)行一個(gè)無(wú)限循環(huán)的腳本函數(shù),直到頁(yè)面耗盡資源為止,類(lèi)似這樣的攻擊都是很常見(jiàn)的,所以我們?nèi)绻窃谕饩W(wǎng)或者很有危險(xiǎn)的網(wǎng)絡(luò)上發(fā)布程序,一般都需要對(duì)這些問(wèn)題進(jìn)行修復(fù)。
            XSS代碼攻擊還可能會(huì)竊取或操縱客戶會(huì)話和 Cookie,它們可能用于模仿合法用戶,從而使黑客能夠以該用戶身份查看或變更用戶記錄以及執(zhí)行事務(wù)。[建議措施]清理用戶輸入,并過(guò)濾出 JavaScript 代碼。我們建議您過(guò)濾下列字符:
            [1] <>(尖括號(hào))
            [2] "(引號(hào))
            [3] '(單引號(hào))
            [4] %(百分比符號(hào))
            [5] ;(分號(hào))
            [6] ()(括號(hào))
            [7] &(& 符號(hào))
            [8] +(加號(hào))
            為了避免上述的XSS代碼攻擊,解決辦法是可以使用HttpUitility的HtmlEncode或者最好使用微軟發(fā)布的AntiXSSLibrary進(jìn)行處理,這個(gè)更安全。
            微軟反跨站腳本庫(kù)(AntiXSSLibrary)是一種編碼庫(kù),旨在幫助保護(hù)開(kāi)發(fā)人員保護(hù)他們的基于Web的應(yīng)用不被XSS攻擊。
            例如上面的內(nèi)容,賦值給一個(gè)Lable控件,不會(huì)出現(xiàn)彈框的操作。
            但是,我們雖然顯示的時(shí)候設(shè)置了轉(zhuǎn)義,輸入如果要限制它們?cè)趺崔k呢,也是使用AntiXSSLibrary里面的HtmlSanitizationLibrary類(lèi)庫(kù)Sanitizer.GetSafeHtmlFragment即可。
            protected void btnPost_Click(object sender, EventArgs e)
            {
            this.lblName.Text = Sanitizer.GetSafeHtmlFragment(txtName.Text);
            }
            這樣對(duì)于特殊腳本的內(nèi)容,會(huì)自動(dòng)剔除過(guò)濾,而不會(huì)記錄了,從而達(dá)到我們想要的目的。
            Database db = CreateDatabase();
            DbCommand command = db.GetSqlStringCommand(sql);
            command.Parameters.AddRange(param);
           4、IIS短文件/文件夾漏洞出現(xiàn)和修復(fù)
            通過(guò)猜解,可能會(huì)得出一些重要的網(wǎng)頁(yè)文件地址,如可能在/Pages/Security/下存在UserList.aspx和MenuList.aspx文件。
            [建議措施]
            1)禁止url中使用“~”或它的Unicode編碼。
            2)關(guān)閉windows的8.3格式功能。
            修復(fù)可以參考下面的做法,或者找相關(guān)運(yùn)維部門(mén)進(jìn)行處理即可。
            http://sebug.net/vuldb/ssvid-60252
            http://webscan.360.cn/vul/view/vulid/1020
            http://www.bitscn.com/network/security/200607/36285.html
            5、系統(tǒng)敏感信息泄露出現(xiàn)和修復(fù)
            如果頁(yè)面繼承一般的page,而沒(méi)有進(jìn)行Session判斷,那么可能會(huì)被攻擊者獲取到頁(yè)面地址,進(jìn)而獲取到例如用戶名等重要數(shù)據(jù)的。
            一般避免這種方式是對(duì)于一些需要登錄才能訪問(wèn)到的頁(yè)面,一定要進(jìn)行Session判斷,可能很容易給漏掉了。如我在Web框架里面,就是繼承一個(gè)BasePage,BasePage 統(tǒng)一對(duì)頁(yè)面進(jìn)行一個(gè)登錄判斷。
          public partial class UserList : BasePage
          {
          protected void Page_Load(object sender, EventArgs e)
          {
          ...............
          /// <summary>
          /// BasePage 集成自權(quán)限基礎(chǔ)抽象類(lèi)FPage,其他頁(yè)面則集成自BasePage
          /// </summary>
          public class BasePage : FPage
          {
          /// <summary>
          /// 默認(rèn)構(gòu)造函數(shù)
          /// </summary>
          public BasePage()
          {
          this.IsFunctionControl = true;//默認(rèn)頁(yè)面啟動(dòng)權(quán)限認(rèn)證
          }
          /// <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方法以使權(quán)限類(lèi)判斷是否具有某功能點(diǎn)的權(quán)限
          /// </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調(diào)用權(quán)限系統(tǒng)的HasFunction函數(shù)出錯(cuò)");
          }
          return breturn;
          }
          protected override void OnInit(EventArgs e)
          {
          Response.Cache.SetNoStore(); //清除緩存
          base.OnInit(e);
          CheckLogin();
          }
            否則可能會(huì)受到攻擊,并通過(guò)抓包軟件發(fā)現(xiàn)頁(yè)面數(shù)據(jù),獲得一些重要的用戶名或者相關(guān)信息。
            還有一個(gè)值得注意的地方,就是一般這種不是很安全的網(wǎng)絡(luò),最好要求輸入比較復(fù)雜一點(diǎn)的密碼(強(qiáng)制要求),例如不能全部是數(shù)字密碼或者不能是純字符,對(duì)位數(shù)也要求多一點(diǎn),因?yàn)楹芏嗳溯斎?2345678,123456,123這樣的密碼,很容易被猜出來(lái)并登錄系統(tǒng),造成不必要的損失。
            6、總結(jié)性建議
            針對(duì)上面發(fā)現(xiàn)的問(wèn)題,提出下面幾條建議。
            1)在服務(wù)器與網(wǎng)絡(luò)的接口處配置防火墻,用于阻斷外界用戶對(duì)服務(wù)器的掃描和探測(cè)。
            2)限制網(wǎng)站后臺(tái)訪問(wèn)權(quán)限,如:禁止公網(wǎng)IP訪問(wèn)后臺(tái);禁止服務(wù)員使用弱口令。
            3)對(duì)用戶輸入的數(shù)據(jù)進(jìn)行全面安全檢查或過(guò)濾,尤其注意檢查是否包含SQL 或XSS特殊字符。這些檢查或過(guò)濾必須在服務(wù)器端完成。
            4)關(guān)閉windows的8.3格式功能。
            5)限制敏感頁(yè)面或目錄的訪問(wèn)權(quán)限。

          posted on 2014-08-29 09:45 順其自然EVO 閱讀(657) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2014年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 锦屏县| 平安县| 周宁县| 巴彦淖尔市| 启东市| 新干县| 图木舒克市| 宝清县| 柯坪县| 康保县| 青阳县| 石台县| 凤阳县| 乌拉特后旗| 麻江县| 广饶县| 赫章县| 铜鼓县| 原平市| 冷水江市| 北京市| 久治县| 岐山县| 墨脱县| 松溪县| 隆回县| 新和县| 胶州市| 沙雅县| 进贤县| 台中市| 蒙阴县| 巴中市| 金寨县| 屯昌县| 湄潭县| 长寿区| 白河县| 赣榆县| 南皮县| 霍林郭勒市|