跨網站腳本 (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>
上方範例可以看到兩個問題
1.透過此方式,會讓載入此筆資料的用戶執行注入的JS語法
2.可以取得使用者的敏感資料(Cookies)
透過下圖解釋XSS如何進行攻擊
XSS最基礎的攻擊方式,就是將使用者執行的頁面插入轉譯的 頁面,或是將事件插入專案 On* 中。 開發人員應該使用下列預防步驟,以避免在應用程式中引進 XSS。
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);
透過使用編碼器,可以將不信任的資料,轉換成安全的格式。
上面的範例也可以看到透過XSS存取Cookies,為了不讓XSS有機會讀到敏感資料並傳送回去攻擊者的伺服器,我們可以設定Cookie存取的限制,使Cookies只能允許在Http傳輸使用Startup.ConfigureServices
中加入
services.AddAuthentication().AddCookie(c => c.Cookie.HttpOnly = true);
如此一來便能防範Cookie因XSS的攻擊而洩漏
參考資料
防止 ASP.NET Core 中的跨網站腳本 (XSS)