{%hackmd DfWYF9cYREebVNN1eEOz-w %} Cross-Site Scripting (XSS) ====== ###### tags: `xss` `cross-site` `202205` ## Introduction to Cross-Site Scripting 需要條件 - 網站未對**前端傳來的資料**與**顯示到畫面上的資料**進行過濾 - 駭客透過串改 Http 封包達到攻擊目的 常見弱點 - 應用程式未檢查使用者輸入的資料 - 應用程式沒有對**顯示於畫面上**的資料進行**編碼** 常見的注入 - 大多是 JS 因為網站一定會用到瀏覽器,所以注入 JS 被執行的機率最高 - 應駭客不清楚後台用什麼資料庫、作業系統、程式,所以通常是透過推測後注入 cmd。 ### 常見的 XSS 攻擊 - 非固定式的 XSS 攻擊: 透過 Request.From、Request.QueryString、RequestHeader、Cookies 注入惡意 js 程式碼。 - 固定式的 XSS 攻擊 (Stored XSS): - 透過各種管道將 XSS 字串寫到受害網站的資料庫或檔案 (髒的資料庫) - 以 DOM 為基礎的 XSS 攻擊(DOM-based XSS) - 透過修改受害網站的 DOM,欺騙使用者執行特定動作騙取個資。 ### XSS 的防護措施 - 輸入驗證 - ASP.NET 預設會阻擋可能會導致 XSS 攻擊的字串 - 對輸入欄位進行驗證 Validation Controls | DataAnnations attributes - 儲存到資料庫前進行消毒處理(如果業務功能允許特殊字元的話 AllowHtml) - ASP.NET 如果是 API,透過 **json** 傳遞資料。預設是不會查檢 XSS 攻擊的。 - 輸出編碼(Output Encoding) - 進行編碼任何輸出到頁面上的資料 - Razor 透過 @ProrName 輸出會進行 HTML 編碼, 但還是不構 - Razop 允許原封不動地將內容輸出!! => @Html.Raw() - Asp.Net Razor 所提供的編碼方法 - 在 HTML 中使用 => @Html.Encode() - 在 URL 中使用 => @Url.Encode() - 在 HTML 的 Attribute 中使用 =>@Html.AttributeEncode() - 在 JS 中使用 => @Ajax.JavaScriptStringEncode() - 在 CSS 中使用 => @CSS.Encode() - 允許輸入 HTML 內容,要進資料庫之前先進行消毒 - 將非法的 XSS 字串去掉 - ASP.NET 使用: Microsoft Anti-XSS Library (已停止維護, 但已經足夠強了) - .NET CORE 用: AntiXSS.NetStandard (德國人將微軟那套更新成 .netCore 可使用) - 使用方法只有兩個(可看原始碼): - Sanitizer.GetSafeHtmlFragment - Sanitizer.GetSafeHtml ### 弱掃 => OWASP ZAP