Cookie hijacking 是個很常見的 XSS 攻擊手法,大多是利用網站既有的 XSS 漏洞並透過 JavaScript 取得 documnet.cookie 資料,而 documnet.cookie 就包含所有你在該網頁所有可用的 Cookie 資料,但若你的網站程式在設定 Cookie 的時候有特別加上 HttpOnly 屬性,就可以進一步避免該頁的 Cookie 被 JavaScript 存取,也可保護使用者的 Cookie 不會偷走。
以下是 ASP.NET 的程式範例:
// Create an HttpOnly cookie.
HttpCookie myHttpOnlyCookie = new HttpCookie("LastVisit", DateTime.Now.ToString());
// Setting the HttpOnly value to true, makes
// this cookie accessible only to ASP.NET.
myHttpOnlyCookie.HttpOnly = true;
myHttpOnlyCookie.Name = "MyHttpOnlyCookie";
Response.AppendCookie(myHttpOnlyCookie);
由於 HttpOnly 是 W3C 的標準配備,所以不止 ASP.NET 可以運用這個技巧,其他程式語言要利用 HttpOnly 時只要在 Set-Cookie 的 Header 最後面加上 ; HttpOnly 即可套用完成,如下圖示:
所以你的網站在使用 Cookie 時如果確定該 Cookie 不會或不需要被 Browser 端的 JavaScript 使用,建議都加上 HttpOnly 屬性,以免當真的有一天你的網站不小心出現了 XSS 弱點時不會傷及無辜用戶。
雖然套用 HttpOnly 屬性可以有效防堵 Cookie 被劫走(Hijacking),但這並不代表使用 HttpOnly 就是安全的!因為如果你的網站還是有 XSS 風險,還是很有機會讓駭客利用 XHR 代客操作,所以就算駭客不取得 Cookie 也可以達成攻擊的手段。
另外,由於 Cookie 一樣會透過 HTTP 在網路上傳輸,被半路攔截的機會還是有的,建議使用 SSL 保護網路封包的傳輸,避免資料遭攔截。
我的 解釋 Cookie 的特性 文章有解釋 Cookie 的特性,不甚了解的人建議可閱讀一番,Cookie 基本上有兩種類型:Persistent Cookie 與 Session Cookie,而 HttpOnly 可套用在任何 Cookie 類型上,唯一的差別僅在於可不可以由 JavaScript, Silverlight 或 Flash 等前端程式存取而已!
相關連結