主頁 > .NET開發 > Fortify安全漏洞一般處理方法

Fortify安全漏洞一般處理方法

2020-09-12 18:25:47 .NET開發

        前段時間公司又一輪安全審查,要求對各專案進行安全掃描,排查漏洞并修復,手上有幾個歷史專案,要求在限定的時間內全部修復并提交安全報告,也不清楚之前是如何做的漏洞修復,這次使用工具掃描出來平均每個專案都還有大概100來個漏洞,這些漏洞包括SQL陳述句注入,C#后端代碼,XML檔案,以及前端HTML,JS代碼幾個方面,由于一些專案比較老舊,限定的時間又短,做大的改動如果測驗不到位,很難保證不出什么問題,所以做了一些應及處理,不過這些都不失為一種手段,下面就來對這次安全漏洞的處理做個總結,

        公司的漏洞掃描分為兩個階段,第一個階段是用Fortify這個工具來掃描,檢查出漏洞,修復并出報告,第二個階段是用APPSCAN對線上代碼掃描,我們先來說說第一個階段Fortify工具掃描出來的漏洞如何處理,至于第二階段,后期做了再來補上,

1.SQL注入

         這一類漏洞主要是針對一些SQL陳述句做動態拼接時,傳入一個特殊的非法字符,如 SELECT id,name FROM User WHERE deparment=1000 and  {ConditionalExpression}  其中  {ConditionalExpression} 作為引數本想在查詢頁面做一些動態條件的拼接,這樣就會帶來SQL注入的風險,如果有人通過手段將 {ConditionalExpression} 引數的值 改成這樣呢 1=1  OR 2 >1  又或者 1=1  ; drop table deparment 呢這就是一個重大的安全事故了,

載SQL注入一般可以從這幾方面預防:

     1.系統中連接資料庫的帳號分配合適的權限,一般業務系統中資料庫操作帳號,不要分配對數庫結構產生改變的權限如 CREATE TABLE ,DROP XXXX 等

     2.對復雜的查詢使用存盤程序,預先定義好引數,在存盤程序中拼接SQL陳述句

     3.盡量使用例如 SqlParmater 引數化傳值使之成為規范

     4.對SQL陳述句或引數的值做特殊關鍵詞過濾

     5.使用如MyBATIS,Hibernate ,等支持 SQL MAPPER 的 ORM框架 

     6.盡量避免SQL陳述句動態拼接 或用動態LINQ 替代

     公司的專案大部分都用的MyBatis ORM框架做Mapper 映射,這次漏洞掃描 SQL注入方面還好,基本沒有在代碼中拼接SQL的,但有一點有個別幾處代碼 用的是ADO.NET 讀寫資料庫,其中在實體化Connection 物件的地方掃描出connectString 未做加密處理,后面改用專案中現有的資料庫操作類別庫來操作就沒再報漏洞了,

2.Path Manipulation 路徑篡改

        這次在安全漏洞篩查和處理程序中出現最多的就是 Path Manipulation 路徑篡改,手上幾個專案中其中就有兩個專案用到靜態頁面生成,涉及到大量的檔案操作,如果不做處理會報很多漏洞,首先來說說我對Path Manipulation 漏洞的認識:通過代碼對系統上檔案的操作如果不設定白名單,黑名單的過濾檢查,是一種安全隱患,比如某個公共方法中用到了,System.IO.File.Delete(path)  .NET 提供的檔案洗掉這個方法,path是通過引數傳遞的,如果不做檢查,在一些呼叫的地方,被人改成了系統某個關鍵檔案,可能直接系統崩潰,這就是一個天大的事情了,

對此類漏洞的修復措施一般做法如下:

      1.設定白名單或黑名單

通常做法是設定白名單,危險不可列舉,我們可以認為哪些是安全的,把它們列入允許操作的清單

     2.設定檔案夾安全權限

只對允許操作的檔案夾設定讀寫權限,切不可將整個站點關件夾權限設定可寫

處理Path Manipulation 路徑篡改 漏洞的.Net 示例代碼:

 private static  Dictionary<string,string> CreateFortifyDictionary()
        {
            Dictionary<string, string> fortifyDictionary = new Dictionary<string, string>();

            for(char c1 = 'a'; c1 <= 'z'; c1++)
            {
                fortifyDictionary.Add(c1.ToString(), c1.ToString());
            }

            for (char c2 = 'A'; c2 <= 'Z'; c2++)
            {
                fortifyDictionary.Add(c2.ToString(), c2.ToString());
            }

            for (int c3 = 0; c3 < 10; c3++)
            {
                fortifyDictionary.Add(c3.ToString(), c3.ToString());
            }

            fortifyDictionary.Add(".", ".");
            fortifyDictionary.Add(":", ":");
            fortifyDictionary.Add("/", "/");            
            fortifyDictionary.Add(Separator, Separator);

            return fortifyDictionary;
        }

        public static string SecurityPathFilter(string path)
        {
            path = path.ToLower();
            path = path.Replace("c:"+ Separator + "windows", "");
            path = path.Replace("c:" + Separator + "program files", "");
            path = path.Replace("c:" + Separator + "", "");

            char[] characters = path.ToCharArray();
            StringBuilder resultStringBuilder = new StringBuilder();
            var dictionary = CreateFortifyDictionary();
            
            foreach (Char character in characters)
            {
                string value = https://www.cnblogs.com/wxdongtt2007/p/string.Empty;
                if (dictionary.TryGetValue(character.ToString(), out value))
                {
                    resultStringBuilder.Append(value);
                }
            }
            return resultStringBuilder.ToString();
        }

3.Cross-site Scripting:Persistent 跨站腳本攻擊

        參考 XSS 的定義:傳送到 Web 瀏覽器的惡意內容通常采用 JavaScript 代碼片段的形式,但也可能會包含一些 HTML、Flash 或者其他任意一種可以被瀏覽器執行的代碼,基于 XSS 的攻擊手段花樣百出,幾乎是無窮無盡的,但通常它們都會包含傳輸給攻擊者的私人資料(如 Cookie 或者其他會話資訊),在攻擊者的控制下,指引受害者進入惡意的網路內容;或者利用易受攻擊的站點,對用戶的機器進行其他惡意操作,大致意思是說 由于頁面在接收引數的程序中,沒有進行引數的校驗,可能存在 引數中存在可執行代碼的漏洞,

處理辦法一般是對引數進行轉義加碼 .NET中 參考System.Web.HttpUtility.DLL 程式集,呼叫下面方法:

string str= System.Web.HttpUtility.HtmlEncode(html)

用到的地方需要 反轉義解碼:

string html= System.Web.HttpUtility.HtmlDecode(str);

4.System Information Leak 系統資訊泄露

        顧名思義就是系統的內部資訊在泄漏了,給系統帶來安全隱患,什么意思呢?下面是摘抄的一段話:

當系統資料或除錯資訊通過套接字或網路連接使程式流向遠程機器時,就會發生外部資訊泄露,外部資訊泄露會暴露有關作業系統、完整路徑名、現有用戶名或組態檔位置的特定資料,從而使攻擊者有機可乘,它比內部資訊(攻擊者更難訪問)泄露更嚴重

就是我們系統的除錯資訊和例外捕獲資訊不能暴露出來,比如這段代碼Fortify 直接會檢測出漏洞,

 try
 {
     //
 }
 catch(Exception ex)
 {                
     System.Console.WriteLine(ex.Message);
 }    

我們或可改成這樣來解決

try
{
     //
}
catch(Exception ex)
{
     //System.Console.WriteLine(ex.Message);
     logger.Logger("系統例外:"+ex.Message,ex);
}

錯誤資訊不應直接拋給終端,交由日志去記錄,

引申一下在系統資訊泄露這方面一般采用措施:

    1.IIS上發布站點時關閉Debug 遠程除錯模式

    2.定義錯誤頁面規范錯誤提示資訊

    3.自定義客戶端例外資訊類,消化內部例外資訊,記錄日志,過濾處理后拋給客戶端允許可到的例外資訊

參考如下示例:

  <compilation debug="false" />   
    <customErrors defaultRedirect="GenericError.htm"
       mode="RemoteOnly" xdt:Transform="Replace">
      <error statusCode="500" redirect="InternalError.htm"/>
      <error statusCode="403" redirect="NoAccess.htm" />
      <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>

其中mode 說明如下:

     1. On 表示在本地和遠程用戶都會看到自定義錯誤資訊,
     2. Off 禁用自定義錯誤資訊,本地和遠程用戶都會看到詳細的錯誤資訊,
     3. RemoteOnly 表示本地用戶將看到詳細錯誤資訊,而遠程用戶將會看到自定義錯誤資訊

string message = "";
try
{
     //
}
catch(WTSError ee)
{
     //
     message = ee.OutMessage;
     logger.Logger("系統例外:" + ee.Message, ee);
}
catch(Exception ex)
{
     message = "系統例外,錯誤型別未知";
     //System.Console.WriteLine(ex.Message);
     logger.Logger("系統例外:"+ex.Message,ex);
}

5. Non-Serializable Object Stored in Session 寫入Session 的物件不可被序列化

        這次安全描程序中也報了很多這類漏洞,不清楚寫入Session 會話中的物件為什么都要可被序列化,“在session中保存的物件最好是序列化,不然很容易導致類轉換的時候發生例外”這是我找到最簡短的回答,根據我的理解大概是,Session物件在存盤和讀取的時候會自動序列化和反序列化,對于非類似于 Int,String等非一般資料型別復雜的資料結構物件存盤和讀取屬性和狀態時資料轉換容易出錯,

對于這類問題的處理可以參考如下:

例如下面這段會報漏洞的代碼:

Session["UserToken"] = "sessionObjectValue";

可以自定義一個Session存盤物件,標為可序例化,并實作ISerializable 介面 

 [Serializable]
    public class SessionObject : ISerializable
    {
        [OptionalField]
        private string data;

        public string Data
        {
            get { return data; }
            set { data =https://www.cnblogs.com/wxdongtt2007/p/ value; }
        }

        public SessionObject(string data)
        {
            this.data =https://www.cnblogs.com/wxdongtt2007/p/ data;
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Data", data);
            Type basetype = this.GetType().BaseType;
            MemberInfo[] mi = FormatterServices.GetSerializableMembers(basetype, context);
            for (int i = 0; i < mi.Length; i++)
            {
                //由于AddValue不能添加重名值,為了避免子類變數名與基類變數名相同,將基類序列化的變數名加上基類類名
                info.AddValue(basetype.FullName + "+" + mi[i].Name, ((FieldInfo)mi[i]).GetValue(this));
            }

        }

    }

然后在Session寫入和讀取時寫成這樣

1 //Session["UserToken"] = new SessionObject("sessionObjectValue");
2  Session["UserToken"] = new SessionObject("sessionObjectValue");
3 
4  //string sessionObjectValue = https://www.cnblogs.com/wxdongtt2007/p/Session["UserToken"].ToString();
5  string sessionObjectValue = https://www.cnblogs.com/wxdongtt2007/p/((SessionObject)Session["UserToken"]).Data;

6.File Separator  檔案分割符

       不可避免描述中也出現了這些漏洞,一般在Window環境下,不會出現這類漏洞帶來的問題,如果你的系統可以要布署在Linux或Unix 環境下就有可能出現Bug了,這類問題是指在不同作業系統環境下檔案路徑的分割符號不一樣,如果這樣一個路徑:“C:\tmp\test.txt” Windows 環境是:“C:\tmp\test.txt ” Linux 環境是:"/tmp/test.txt" 為了兼顧不同作業系統環境建議使用 System.IO.Path.DirectorySeparatorChar 物件對于上面的路徑這樣組合:

"C:" + System.IO.Path.DirectorySeparatorChar + "tmp" + System.IO.Path.DirectorySeparatorChar + "test.txt"

類似的還有換行符:windows 下是 \r\n  Linux 等其它系統下是 \n 在.NET 中使用 System.Environment.NewLine 物件,

7.Insecure Randomness 安全亂數

       參考網路上的解釋:

       不安全的亂數:電腦是一種具有確定性的機器,因此不可能產生真正的隨機性,偽亂數生成器 (PRNG) 近似于隨機演算法,始于一個能計算后續數值的種子,
PRNG 包括兩種型別:統計學的 PRNG 和密碼學的 PRNG,統計學的 PRNG 可提供有用的統計資料,但其輸出結果很容易預測,因此資料流容易復制,若安全性取決于生成數值的不可預測性,則此型別不適用,密碼學的 PRNG 通過可產生較難預測的輸出結果來應對這一問題,為了使加密數值更為安全,必須使攻擊者根本無法、或極不可能將它與真實的亂數加以區分,通常情況下,如果并未宣告 PRNG 演算法帶有加密保護,那么它有可能就是一個統計學的 PRNG,不應在對安全性要求較高的環境中使用,其中隨著它的使用可能會導致嚴重的漏洞(如易于猜測的密碼、可預測的加密密鑰、會話劫持攻擊和 DNS 欺騙),

       就是我們一般使用的隨機函式并不是真正的隨機產生,具有一定的可推測性,可能帶來一些安全性問題,說實話此類問題不好處理涉及到密碼學,如果感興趣話可找找這方面的資料也可以先看看這篇文章 https://www.cnblogs.com/asxinyu/p/4301554.html,個人認為一般系統可以用GUID 的方案,

       以上就是這次Fortify 安全掃描中遇到的幾種漏洞型別,通過上述的方法基本都已解決,記得其中還遇到一個獲取電腦域帳號呼叫C++ 類別庫方法非安全代碼執行漏洞,還好找到另一種不用呼叫C++類別庫的方法去替換,如果避免不了要呼叫C++類別庫里的方法,如果報此類漏洞不知能有什么好的辦法來處理,希望有這方面經驗的園友不吝告之,

本文參考和參考的地址如下:

1. https://www.cnblogs.com/eyesmoon/p/7421477.html  Fortify掃描漏洞解決方案 

2. https://blog.csdn.net/abcxy12336/article/details/52335490  針對Fortify工具掃描出幾大漏洞的解決辦法總結--1

3. https://www.cnblogs.com/asxinyu/p/4301554.html  開源Math.NET基礎數學類別庫使用(14)C#生成安全的亂數

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/16050.html

標籤:ASP.NET

上一篇:部署 asp.net 網站到 Azure

下一篇:基于.NetCore3.1系列 —— 認證方案之初步認識JWT

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more