# Cross-site scripting Lab30
本題是 Reflected XSS + CSP injection + Chrome 限定解法,靠的是你可以控制 CSP 裡的某個 `query` 參數(token),然後把原本很嚴格的 CSP 蓋掉或繞過,達成注入 `<script>alert(1)</script>` 的目的。
一樣先進入網站。

如果我們用一般的方式去搜尋一定是沒結果,會被擋掉。

不過在 http history 中有個 token,所以我試試看這個值可不可控:


當我直接在 URL 後面輸入 `token=test123` 時,這個值確實會跟著憶起改變,所以:
- 可以注入自己的 CSP 指令到 token 參數中。
- 在 Chrome 中,CSP header 如果出現「多個有效 directive」,某些情況下會合併生效。
- 可以強行加入 `script-src-elem 'unsafe-inline'`,繞過 `script-src 'self'` 限制
製作 URL:
加入搜尋參數(XSS payload):
```
?search=<script>alert(1)</script>
```
加入 token 參數來干擾 CSP:
```
&token=;script-src-elem%20'unsafe-inline'
```
- `;` 是結束 token 參數前面正常值。
- `script-src-elem 'unsafe-inline'` 是我們注入的新 CSP 指令。
因為 Chrome 會解析成類似這樣:
```
Content-Security-Policy: default-src 'self'; script-src 'self'; report-uri /report?token=;script-src-elem 'unsafe-inline'
```
然後 `<script>` 被認為是 `script element` → `script-src-elem` 負責,結果 `script-src-elem 'unsafe-inline'` 有效,XSS 成功。
全部結合:
```
?search=%3Cscript%3Ealert(1)%3C/script%3E&token=;script-src-elem%20%27unsafe-inline%27
```



---