# 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 ```    ---
×
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