與反射型 XSS不同,Stored XSS 的惡意程式碼會被後端伺服器直接寫入資料庫或其他持久化儲存介面。當其他正常使用者或管理員造訪包含該資料的頁面時,伺服器會將存有惡意程式碼的內容渲染回前端,導致受害者的瀏覽器自動執行該段腳本。
發布惡意留言輸入:
Name:test
Message:HTMLalert('Stored XSS!')
點擊:Sign Guestbook
觀察漏洞現象
即時觸發:資料送出後,畫面立刻跳出Stored XSS!警告彈窗。
持久化驗證:切換至其他選單頁面(如 Home),再重新點回 XSS (Stored) 頁面。
結果:無須再進行任何輸入,只要頁面載入留言紀錄,瀏覽器就會自動再次觸發並執行該腳本。
$message = trim($_POST['mtxMessage']);
$name = trim($_POST['txtName']);
echo "<div id="guestbook_comments">Name: {$name}Message: {$message}";
由於 $message 中的 標籤被原封不動地存入資料庫,前端渲染時瀏覽器會將其作為 HTML/JavaScript 解析,而非純文字。
危害
1.帳號劫持:攻擊者可寫入document.cookie竊取腳本,自動將造訪者的Session ID傳送到攻擊者伺服器。
2.蠕蟲式擴散:在社群網站中,惡意腳本可控制受害帳號自動發布帶有相同Payload的動態,造成大規模擴散
防禦策略
1.輸入與輸出轉義:顯示留言資料時,必須進行HTML Entity轉義。
2.輸入長度限制與格式過濾:限制輸入欄位長度,並對輸入內容進行白名單驗證。
3.啟用Content Security Policy:限制腳本執行來源,禁止內聯腳本執行。