今天來到了第八天,既然前面學了那麼久(好啦,其實也沒到真的很久)的前備知識,那麼也適時後來適任一下基本的攻擊手段了,當然我們一樣也是從最基本的開始學起,而我們今天要學的就是XSS攻擊。
XSS的中文全名叫做跨站腳本攻擊,通常這個攻擊在CTF的題目或真實網站的漏洞裡都蠻常見的,英文則叫做Cross-Site Scripting,而為甚麼會說對我們而言XSS攻擊算是基本的呢?因為我們之前學了HTML/JS/Cookie,剛好能夠銜接上,因為XSS就是利用將惡意JS程式碼插進網頁中,而當其他的使用者打開頁面時,這段程式碼就會在他們的瀏覽器中執行。
例如當我們插入這段代碼<script>alert("我要進來囉!")</script>
,其他人打開這個頁面時,就會跳出alert視窗,並寫著「我要進來囉!」,這就是最最最簡單的XSS攻擊。
而XSS又能根據攻擊的觸發位置、持續性、利用方式的不同,分類成反射型/儲存型/DOM型,而分類則有助於開發者可以針對不同的情境進行防禦,攻擊者也能依照型別決定如何誘導受害者,下面我們就來簡單介紹這三種類型吧!
1.反射型
定義: 惡意程式碼夾在「使用者輸入 → 伺服器回應 → 瀏覽器執行」的單次回應裡。程式碼不會存到伺服器,只會即時「反射」回來。
特徵:
攻擊要靠「點擊連結」或「送出表單」觸發。
不會持久存在。
常見於 搜尋功能、錯誤訊息頁面。
用途:
駭客把惡意連結寄給受害者 (釣魚信件)。
點進去就觸發攻擊。
2.儲存型XSS
定義:惡意程式碼會被「永久存放」在伺服器或資料庫裡,之後每次有人瀏覽就會觸發。
特徵:
攻擊有持續性、危害範圍大。
常見於 留言板、論壇、聊天室、個人簡介。
用途:
偷 Cookie → 偽裝成受害者登入。
注入惡意廣告、假登入頁面。
擴散式攻擊 (使每個訪客都被影響)。
3.DOM型XSS
定義: 攻擊發生在 前端 JavaScript 操作 DOM 時,不是伺服器輸出的問題,而是網頁本身的 JS 程式碼寫法不安全。
特徵: 漏洞存在於 前端程式碼,不一定需要伺服器參與。
用途:不需要改伺服器端程式。
今天我們要做的練習是利用Burp Suite攔截後,找出弱點並對其修改
一.準備測試環境
首先先把下面的python程式碼進行複製並儲存成檔案後執行
# XSS_reflected.py
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route("/search")
def search():
q = request.args.get("q", "")
html = f"""
<!doctype html>
<html>
<head><meta charset="utf-8"><title>Search</title></head>
<body>
<h1>Search page</h1>
<p>Search results for: {q}</p>
</body>
</html>
"""
return render_template_string(html)
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000, debug=False, use_reloader=False)
注意!記得先安裝flask
二.打開並設定Burp Suite(今天不是測https無須匯入CA也無須開啟omega zero)
將瀏覽器那邊輸入http://127.0.0.1:5000/search?q=test
此時會攔截到請求,點右鍵選Send to Repeater
記得點擊Forward
到 Repeater 分頁,修改請求把q=test 改成 q=<script>alert("XSS")</script>
,按Send
應該會出現這樣的畫面(記得瀏覽器網址要改Proxy那邊要按forward)
這樣就表示我們成功XSS攻擊這個網站了
而這邊我們使用的原理是當伺服器把使用者輸入(如URL的q參數)直接拼進 HTML回應,而不把特殊字元(<, >, " 等)做HTML encode,攻擊者就能把 <script>
或其他可執行片段「注入」到頁面中,當其他使用者(或同一個瀏覽器)打開該回應時,瀏覽器會執行攻擊者放進來的JavaScript→XSS成功。
今日小結
以上大概就是今天簡單介紹的XSS,之後我們之後將介紹更多的攻擊類型,希望能帶給大家收穫