Try   HackMD

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