經得起原始碼資安弱點掃描的程式設計習慣培養(三)_7.Cross Site Scripting(XSS)_Stored XSS_Reflected XSS All Clients

 



近期新加入的功能code剛好也被CheckMarx掃出高風險部分的程式碼漏洞
我也踏到這個Issue啦

















Cross Site Scripting(XSS) 



第一種.Stored XSS
高風險
CheckMarx掃碼報告給的說明[Stored XSS]
============================================================
風險:
攻擊者可以利用合法存取應用程式提交資料到資料庫。
當另一個使用者隨後存取該資料,網頁可能會被改寫且惡意腳本可能會被啟動。
發生原因:
從資料庫中的資料建立網頁。資料直接嵌入至HTML的頁面,利用瀏覽器顯示。
資料可能源自於其他使用者的輸入。
如果資料包含HTML片段或Javascript,使用者無法分辨是否為預期的頁面。
該漏洞主因為未先對嵌入資料庫中的資料進行編碼(Encode)
來預防瀏覽器將其當為HTML的格式而非純文字。

如何避免:
1.驗證所有資料,無論其來源為何。驗證應基於白名單:僅接受預定結構的資訊,而不是拒絕不良的樣式(Patterns)。 
應確認: 
● 資料型態 
● 大小 
● 範圍 
● 格式 
● 期望值 
2. 驗證無法取代編碼. 輸出嵌入之前,不論其來源, 將所有動態資料進行編碼. 編碼方式應該是上下文相關的. 例如:
● HTML內容使用HTML的編碼方式 
● HTML編碼特性是將資料輸出到特性的值
● JavaScript的編碼方式為伺服器產生的Javascript 
3.考慮使用ESAPI的編碼庫,或它的內置功能。對於舊版的ASP.NET,請考慮使用AntiXSS. 
4.在HTTP類型對應的表頭, 明確定義整個頁面的字元編碼. 
5. 設置 httpOnly 標誌於會期資訊,以防止利用XSS來竊取資訊.
============================================================





這裡報告描述是指我對傳進來字串參數直接拋給DAL處裡的類別執行查詢
這裡缺乏對輸入進來的字串參數做一些查檢判斷
也建議在帶入時對參數也做一些html encode處理
這裡用AntiXSS來Encode





第二種.Reflected XSS All Clients
高風險
CheckMarx掃碼報告給的說明[Reflected XSS All Clients]
============================================================
風險:
攻擊者可能利用社交工程攻擊來導致使用者發送網站設計的輸入,重寫網頁並插入惡意腳本。
然後,攻擊者可以偽裝成原來的網站,這將使攻擊者可以竊取使用者的密碼,要求使用者的信用卡資訊,提供偽造訊息,或執行惡意軟體。但從受害者的角度來看,這是原來的網站,受害人會責怪網站所產生的損害。


發生原因:
從使用者輸入的資料建立網頁。資料直接嵌入至HTML的頁面,利用瀏覽器顯示。
如果資料包含HTML片段或Javascript,這樣也顯示使用者無法分辨是否為預期的頁面。
該漏洞主因為未先對嵌入資料庫中的資料進行編碼(Encode)來預防瀏覽器將其當為HTML的格式而非純文字。

如何避免:
1.驗證所有資料,無論其來源為何。驗證應基於白名單:僅接受預定結構的資訊,而不是拒絕不良的樣式(Patterns)。 
應確認: 
● 資料型態 
● 大小 
● 範圍 
● 格式 
● 期望值 
2. 驗證無法取代編碼. 輸出嵌入之前,不論其來源, 將所有動態資料進行編碼. 編碼方式應該是上下文相關的. 例如:
● HTML內容使用HTML的編碼方式 
● HTML編碼特性是將資料輸出到特性的值
● JavaScript的編碼方式為伺服器產生的Javascript 
3.考慮使用ESAPI的編碼庫,或它的內置功能。對於舊版的ASP.NET,請考慮使用AntiXSS. 
4.在HTTP類型對應的表頭, 明確定義整個頁面的字元編碼. 
5. 設置 httpOnly 標誌於會期資訊,以防止利用XSS來竊取資訊.
============================================================


問題真因在於透過Eval綁定的資料未做Encode
這裡進行漏洞修復





第三種.Reflected XSS Specific Clients
中風險
CheckMarx掃碼報告給的說明[Reflected XSS Specific Clients]
============================================================
風險:
攻擊者可以繞過一般用來防止跨網站腳本攻擊的頻道來注入 Javascript 或 HTML程式碼,
經由社交工程讓使用者存取有注入輸入變數的網站,
像是包含設計過 session屬性的網址,導致瀏覽器重新寫入網頁,
攻擊者接著可以假裝成原來的網站,藉此來竊取使用者session、請求使用者憑證、提供錯誤資訊或是執行惡意軟體,從受害者的角度來看這都是原始網站的行為。

發生原因:
應用系統網頁包括來自使用者端的控制資料(包括session)。使用者的輸入嵌在網頁中,導至顯示為網頁的一部份。如輸入包括HTML或JavaScript片斷,可能會顯示非預期的頁面。
此漏洞是嵌入任何使用者端輸入的值,若不針對其進行編碼(Encode),防難以防止瀏覽器執行HTML。

如何避免:
無論來源為何,驗證所有輸入。並以白名單驗證為主,只允許合法的內容,
並檢測以下項目:
  1. 資料類型
  2. 大小
  3. 範圍
  4. 格式
  5. 預期內容
安全程式撰寫方法
所有動態資料先編碼(Encode)再顯示於網頁中。編碼方式應與資料內容有關。
如: 應為context-sensitive.
For example:
o HTML內容使用HTML encoding。
o HTML屬性使用HTML Attribute encoding。
o JavaScript使用JavaScript encoding。
建議採用公開已知的編碼函式庫,如ESAPI。
============================================================








總結:
主要都是在於輸出和傳入參數沒有做好Encode前置處理所導致的風險。

觀察網上和同事之間總整理出來
共有四種寫法可以透過
1.Server.HTMLEncode() ->傳入參數要記得是字串因此要.ToString()
實際上背後仍然是呼叫了HttpUtility.HtmlEncode

2.System.Web.HttpUtility.HtmlEncode() ->若未來要轉升到.net 5(.net core)也通用有支援

3.也可以簡寫成 <%#: %>用一個半型的冒號(:)來做html encode
=>.NET Framework 4之後才支援,
由於舊專案可能是從2.0、3.0版本轉來所以這種新型寫法較不常見
若是有類似採用DataBinder的語法不太能用Server.HtmlEncode的也可以懶人法直接用這招

4.AntiXssEncoder.HtmlEncode()
->需額外加入參考using Microsoft.Security.Application


經測試回饋看起來CheckMarx對於Stored XSS議題
會有點秀斗
只認得寫法1.Server.HtmlEncode 和 寫法3. <%#: %>
他人也曾遇到過checkmarx使用經驗分享









Ref:
ASP.NET Security - Securing Your ASP.NET Applications
https://docs.microsoft.com/en-us/archive/msdn-magazine/2012/january/asp-net-security-securing-your-asp-net-applications

[ASP.NET C#] Security - XSS 類別] 較安全的程式碼撰寫方法 - .NET 控制項篇
http://williambooks2.blogspot.com/2014/11/aspnet-c-security-xss-net.html

[ASP.NET] 防止跨網站指令碼攻擊(XSS)
http://programinmylife.blogspot.com/2015/12/aspnet.html
https://dotblogs.com.tw/jimmyyu/2009/04/21/8118



How To: Prevent Cross-Site Scripting in ASP.NET (.net1.0 , 2.0)
https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649310(v=pandp.10)?redirectedfrom=MSDN


https://blog.csdn.net/willingtolove/article/details/91055685

https://social.msdn.microsoft.com/Forums/zh-TW/33c4a7d4-4617-4129-868d-0974350d2751/-datatable-serverhtmlencode-?forum=236

https://docs.microsoft.com/zh-tw/dotnet/api/system.web.security.antixss.antixssencoder.htmlencode?view=netframework-4.8

[技術] checkmarx弱掃修補
https://blog.cirich.com/2019/08/checkmarx.html

Checkmarx的Reflected XSS All Clients如何修補?
https://ithelp.ithome.com.tw/questions/10189316

軟體弱點掃描
https://www.slideshare.net/rainmakerho/ss-70532459

防止asp.net中的跨站點腳本攻擊C#
http://hk.uwenku.com/question/p-hjrcfcfr-ke.html


How to solve Stored XSS issue reported by Checkmarx
https://csharp.wekeepcoding.com/article/11260626/How+to+solve+Stored+XSS+issue+reported+by+Checkmarx

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header