修正 ASP.NET MVC 常見 Checkmarx 原碼檢測漏洞 (Fix ASP.NET MVC Common Vulnerability Scan By Checkmarx)
2020-09-30
本篇實驗用最基本的 ASP.NET MVC 專案進行 Checkmarx OWASP:2017 原碼檢測,並驗證如何修正檢驗出的漏洞,並將整個過程加以筆記。
高風險項目 | Critical Risk
🔴 Reflected_XSS_All_Clients
說明
惡意內容 (Html Tags 或者 JS Scripts) 被加入到 URL 或者 Html Form 之中,URL 或者注入惡意內容的結果被瀏覽,導致使用者受害。
Example
Code Before:
public ActionResult Action(string str)
{
return Content($"<h1>{str}</h1>");
}
Code After:
public ActionResult Action(string str)
{
var encodeStr = HttpUtility.UrlEncode(str);
return Content($"<h1>{encodeStr}</h1>");
}
Example 2
Code Before:
public ActionResult Action(string Id)
{
ViewBag.Id = Id;
return View();
}
Code After:
public ActionResult Action(string Id)
{
var encodeId = HttpUtility.UrlEncode(Id);
ViewBag.Id = encodeId;
return View();
}
Example 3
使用 Html.Raw 會被判定問題,只得另尋它法改寫渲染方式。
<p>
@Html.Raw(Model.UserInput)
</p>
🔴 Stored_XSS
說明
資料庫被寫入惡意的 Html Tags 或者 JS Scripts,被應用程式直接渲染呈現給 Client 端,Client 端直接將內容呈現導致使用者受害。
Example
Code Before:
public ActionResult Action(int? Id)
{
ViewBag.SelectList = new SelectList(db.Table, "Col1", "Col2");
return View();
}
Code After:
public ActionResult Action(int? Id)
{
List<SelectListItem> tableEncode = db.Table
.Where(condition)
.AsEnumerable()
.Select(i => new SelectListItem { Text = HttpUtility.HtmlEncode(i.Col1), Value = HttpUtility.HtmlEncode(i.Col2)})
.ToList();
ViewBag.SelectList = TableEncode;
return View();
}
中風險項目 | Medium Risk
🟡 HttpOnlyCookies_In_Config
說明
Cookies 可能會被藉由 XSS 操作並竊取使用者 Cookies 中隱私的資料傳送到特定 URL,藉由 HttpOnly 能夠降低 XSS 的傷害。僅允許 HttpHeader中傳遞 Cookies,避免讓 Client 端的 JS 直接操作 Cookies,web.config 加入下列內容即可:
web.config
<configuration>
<system.web>
<httpCookies httpOnlyCookies="true"/>
</system.web>
</configuration>
🟡 Parameter_Tampering
說明
惡意使用者可以藉由操作 URL, Html From, Html Input Field 的值,來達到異常權限的存取、編輯與刪除資料等行為。強化對於傳入參數的檢查,能夠有效避免。
Code Before:
public JsonResult GetInfo(int? Id)
{
return Json(new SelectList(db.Table.Where(i => i.Object.Id == Id), "Column1", "Column2"));
}
Code After:
這個處理方式需要再檢討,ASP.NET MVC 本身已經針對傳入的資料型別與內容做檢查,是否仍需要重工的轉型為字串、編碼後再轉型 😑
public JsonResult GetInfo(int? Id)
{
var filterId = int.Parse(HttpUtility.UrlEncode(Id.ToString()));
return Json(new SelectList(db.Table.Where(i => i.Object.Id == Id), "Column1", "Column2"));
}
🟡 Missing_HSTS_Header
HSTS Header 負責將 http 強制轉為 https,如果已經實作 https 機制,則將 web.config 加入下列內容即可。
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
</customHeaders>
</httpProtocol>
</system.webServer>
🟡 Unsafe_Object_Binding
說明
問題分為兩類:
(一)方法中的物件沒有限定允許的屬性範圍,可能造成屬性被惡意修改,造成惡意的結果。
例如:
[HttpPost]
public ActionResult Index(LoginUser user)
{
...
}
藉由 Bind Include 來限定可傳入物件的參數,藉此避免使用者惡意修改物件屬性的問題。
[HttpPost]
public ActionResult Index([Bind(Include = "UserName, UserPassword")] LoginUser user)
{
...
}
6 Ways To Avoid Mass Assignment in ASP.NET MVC
(二)參數為可以迭代猜測的 Interger、Guid 或者是 String。
尋找處理的辦法中 🤔
參考資料
可以從列表中找到 CWE Link,獲得更多的弱點相關資訊以及可能的處理方式。