認識 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>
  • DOM Based XSS
    • 透過 DOM 渲染時載入的語法 <img onerror="<script>alert('Boom!!')</script>"> 引入資源後觸發程式
  • 其他
    • 另外還有像是透過工具:封包攔截器,把請求送到一半暫停,變更請求表頭塞入自己要的程式碼在送出,也可以算是傳遞參數的一種手段。

如何防範

不要相信任何客端傳遞過來的參數


  • 把輸入的參數值,經過編碼跳脫,存入 DB
  • 把讀出的參數值,經過編碼跳脫,在顯示於頁面
  • 任何輸出於頁面的值,不要塞入到會執行的程式碼片段中,例如 blade 語法 {!! $value !!},會被編譯執行。

實務經驗

曾經在 Laravel 控制器把參數值丟給 blade,並在 js 經過邏輯處理,塞在 jQuery .html() 語法中,導致 stored xss 的文字被成功執行。

最後

有任何問題或想法,歡迎留言交流,如果寫的內容有錯誤的地方,希望能不吝指點,感謝。

另外,筆者一併整理了討論到 CSRF 時,可一併吸收研讀的主題

參考連結



文章作者: littlebookboy
永久鏈結: https://blog.genesu.me/2021/06/learn-about-xss/
許可協議: 署名-非商業性使用-相同方式共享 4.0 國際(CC BY-NC-SA 4.0)