系列文章介紹 Web 常見的資安漏洞,說明漏洞的實作方式以及在 .NET 環境該如何防禦的最佳實務。本次介紹的內容為 Injection 包含 SQL Injection 以及 XSS。
說明
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 進行檢查。
var antixss = new AntiXssEncoder();
antixss.HtmlEncode(String, Boolean);
antixss.JavaScriptStringEncode(String);
antixss.UrlEncode(String);
using Ganss.Xss;
var sanitizer = new HtmlSanitizer();
var sanitized = sanitizer.Sanitize(html, "https://sdwh.dev");
參考資料
https://owasp.org/www-community/attacks/