Web 資安漏洞大可不必 - Injection 攻防之道

2022-11-20

系列文章介紹 Web 常見的資安漏洞,說明漏洞的實作方式以及在 .NET 環境該如何防禦的最佳實務。本次介紹的內容為 Injection 包含 SQL Injection 以及 XSS。

logo

說明

SQL Injection

防禦措施

使用 Prepared Statement
使用 ORM 框架,例如 Entity Framework
減少錯誤訊息回饋量,讓攻擊者淪為 Blind Injection

經典 ASP 的弱點修補指南 | Prepared Statement

Command Injection

常見的注入攻擊目標:

工作排程 Schedule
壓縮及最佳化 Library
遠端備份 Scripts
資料庫 Database
日誌紀錄 Logs
直譯器 Interpreter

防禦措施

執行者採用最小權限授權

XSS

Stored XSS

攻擊者將惡意的 Script (javascript) 儲存至 Web 的 Storage (Database or File),讓其他使用者瀏覽頁面時會自動執行此惡意 Script。

Reflected XSS

攻擊者藉由組合 URL 的方式,當其他使用者執行此 URL,會觸發攻擊者預期的惡意 Script。

DOM XSS

攻擊者利用 URL 中 Anchor (Hash) 的部分,組合可以執行惡意 Script 的連結,待使用者連結後進行觸發。

防禦措施

XSS 防禦方式
Stored XSS CSP、escape HTML
Reflected XSS CSP、escape HTML
DOM XSS CSP、escaepe URI、encodeURI、encodeURIComponent
  • 避免使用者提供的內容被加入到 DOM,在 js 的使用上避免使用 innerHTML 而是使用 innerText。
  • 盡可能的轉譯使用者提供的內容
  • 利用 js createElement 的方式,產生超連結標籤而非直接使用 location.href
  • 留意 CSS Background Property

留意以下會操作 DOM 的 API:

  • DOM Parser
  • SVG
  • document.implementation
  • document.write
  • element.innerHTML

使用 CSP 限制 script-src,如果支援的話可以藉由限制 行內(inline) Script 來減緩 XSS 攻擊。

.NET Solutions

ASP.NET MVC 預設不允許輸入的內容包含 HTML,除非主動藉由 [AllowHtml] 放行,但放行後來自使用者的內容能必須檢查,可以使用 antixss 或 HtmlSanitizer 進行檢查。

AntiXSS

var antixss = new AntiXssEncoder();

antixss.HtmlEncode(String, Boolean);
antixss.JavaScriptStringEncode(String);
antixss.UrlEncode(String);

HtmlSanitizer

using Ganss.Xss;
var sanitizer = new HtmlSanitizer();
var sanitized = sanitizer.Sanitize(html, "https://sdwh.dev");

參考資料

https://owasp.org/www-community/attacks/

https://owasp.org/www-community/vulnerabilities/

https://cheatsheetseries.owasp.org/