XSS 觀念筆記
認識 XSS
XSS 指的是 Cross-site scripting, CSS, 做出區別,在講到網站安全領域的「跨站腳本攻擊」時,都改稱為 XSS。
爬文提到,XSS 是指攻擊者透過「網站上任何可以 Input (輸入資料)」的地方,進行 XSS 攻擊,算是討論到網站安全時,最常見的攻擊手法之一。這類攻擊通常為利用各種輸入,或者說「傳遞參數」的手段,把帶有可被執行的 Javascript 程式碼,或 SQL query 傳給伺服器讓程式被觸發(往不好的方向走),達成攻擊者想要的結果。
這邊提到的 Input
並不單指表單輸入,還有很多其他的傳遞參數方式,可以傳給伺服器,以下列出幾種 XSS 輸入手段:
- Stored XSS
- 透過表單欄位
<input name="user">
輸入值後把表單sumbit
- 透過表單欄位
- Reflected XSS
- 透過 URL GET 參數傳入,例如
http://foo.bar/?user=<script>alert('Boom!!')</script>
- 透過 URL GET 參數傳入,例如
- DOM Based XSS
- 透過 DOM 渲染時載入的語法
<img onerror="<script>alert('Boom!!')</script>">
引入資源後觸發程式
- 透過 DOM 渲染時載入的語法
- 其他
- 另外還有像是透過工具:封包攔截器,把請求送到一半暫停,變更請求表頭塞入自己要的程式碼在送出,也可以算是傳遞參數的一種手段。
如何防範
不要相信任何客端傳遞過來的參數
- 把輸入的參數值,經過編碼跳脫,存入 DB
- 把讀出的參數值,經過編碼跳脫,在顯示於頁面
- 任何輸出於頁面的值,不要塞入到會執行的程式碼片段中,例如 blade 語法
{!! $value !!}
,會被編譯執行。
實務經驗
曾經在 Laravel 控制器把參數值丟給 blade,並在 js 經過邏輯處理,塞在 jQuery .html()
語法中,導致 stored xss
的文字被成功執行。
最後
有任何問題或想法,歡迎留言交流,如果寫的內容有錯誤的地方,希望能不吝指點,感謝。
另外,筆者一併整理了討論到 CSRF 時,可一併吸收研讀的主題
參考連結
文章作者: littlebookboy
永久鏈結: https://littlebookboy.github.io//2021/06/learn-about-xss/
許可協議: 署名-非商業性使用-相同方式共享 4.0 國際(CC BY-NC-SA 4.0)