iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
Modern Web

我與 ASP.NET Core 的 30天系列 第 19

[Day19] 跨網站腳本攻擊(XSS) - 我與 ASP.NET Core 3 的 30天

  • 分享至 

  • xImage
  •  

跨網站腳本 (XSS) 是一種安全性弱點,可讓攻擊者將用戶端腳本放 (通常是 JavaScript) 網頁中。當其他使用者載入受影響的頁面時,攻擊者的腳本將會執行,讓攻擊者竊取 cookie 和session、透過 DOM 操作變更網頁的內容,或將瀏覽器重新導向至另一個頁面。 XSS 弱點通常會在應用程式接受使用者輸入並將其輸出至頁面,而不進行驗證、編碼或將其進行編碼時發生。

下方範例介紹可能被XSS攻擊的方式
首先先建立一個SercurityController.cs並加入下方內容

public class SercurityController : Controller
{

    public IActionResult XssAttack(string searchString)
    {
        HttpContext.Response.Cookies.Append("sercurity", "SecurityValue");
        return View((object)searchString);
    }

}

接著建立一個View

@model string
@{
    ViewData["Title"] = "XSS 攻擊";
}
@Html.Raw(Model)

<h1>@ViewData["Title"]</h1>

<form action="XssAttack" method="get">
    <input name="searchString" type="text" name="輸入框">
    <input type="submit" value="送出">
</form>

接著啟動網站,並在輸入框中輸入<script>alert(document.cookie)</script>
https://ithelp.ithome.com.tw/upload/images/20201004/20129389oO2O2apmnj.png
上方範例可以看到兩個問題
1.透過此方式,會讓載入此筆資料的用戶執行注入的JS語法
2.可以取得使用者的敏感資料(Cookies)

透過下圖解釋XSS如何進行攻擊
https://ithelp.ithome.com.tw/upload/images/20201004/20129389ZVgFYvV3FI.png

如何防範XSS

XSS最基礎的攻擊方式,就是將使用者執行的頁面插入轉譯的 頁面,或是將事件插入專案 On* 中。 開發人員應該使用下列預防步驟,以避免在應用程式中引進 XSS。

  • 除非您遵循下列步驟的其餘步驟,否則請勿將不受信任的資料放入您的 HTML 輸入中。 不受信任的資料是指攻擊者、HTML 表單輸入、查詢字串、HTTP Header,甚至是來自資料庫的資料(即使是源自資料庫的資料)可能會受到攻擊,即使它們無法入侵您的應用程式也是一樣。
  • 在 HTML 元素內放置不受信任的資料之前,請確定它是 HTML 編碼的。 HTML 編碼會採用字元(例如) < ,並將它們變更為安全的格式,例如 <
  • 將不受信任的資料放入 HTML 屬性之前,請確定其已進行 HTML 編碼。 HTML 屬性編碼是 HTML 編碼的超集合,並會編碼額外的字元,例如 "和 '。
  • 將不受信任的資料放入 JavaScript 之前,請先將資料放在您于執行時間取得其內容的 HTML 元素中。 如果無法這麼做,請確定資料是以 JavaScript 編碼。 JavaScript 編碼會針對 JavaScript 採用危險的字元,並以其十六進位取代,例如 < 編碼為 \u003C 。
  • 將不受信任的資料放入 URL 查詢字串之前,請確定它是以 URL 編碼。

程式碼中的編碼器

ASP.NET Core當中提供了HTML、JavaScript 和 URL的編碼器,可以透過DI或是引用命名空間System.Text.Encodings.Web,下面範例透過DI使用可設定的編碼器

HtmlEncoder _htmlEncoder;
JavaScriptEncoder _javaScriptEncoder;
UrlEncoder _urlEncoder;

public SercurityController(HtmlEncoder htmlEncoder,
                      JavaScriptEncoder javascriptEncoder,
                      UrlEncoder urlEncoder)
{
    _htmlEncoder = htmlEncoder;
    _javaScriptEncoder = javascriptEncoder;
    _urlEncoder = urlEncoder;
}

接著透過編碼器將內容進行編碼

var html = _htmlEncoder.Encode(searchString);
var js = _javaScriptEncoder.Encode(searchString);
var url = _urlEncoder.Encode(searchString);

透過使用編碼器,可以將不信任的資料,轉換成安全的格式。

限制Cookie存取

上面的範例也可以看到透過XSS存取Cookies,為了不讓XSS有機會讀到敏感資料並傳送回去攻擊者的伺服器,我們可以設定Cookie存取的限制,使Cookies只能允許在Http傳輸使用
Startup.ConfigureServices中加入

services.AddAuthentication().AddCookie(c => c.Cookie.HttpOnly = true);

如此一來便能防範Cookie因XSS的攻擊而洩漏

參考資料
防止 ASP.NET Core 中的跨網站腳本 (XSS)


上一篇
[Day18] Views - 我與 ASP.NET Core 3 的 30天
下一篇
[Day20] 跨網站偽造要求 (XSRF/CSRF) 攻擊 - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言