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


  1. 說明
  2. SQL Injection
    1. 防禦措施
  3. Command Injection
    1. 防禦措施
  4. XSS
    1. Stored XSS
    2. Reflected XSS
    3. DOM XSS
    4. 防禦措施
    5. .NET Solutions
  5. 參考資料

系列文章介紹 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/