# Cross-site scripting Lab11 本題是 DOM-based XSS 搭配 AngularJS 表達式注入,而且尖括號(<, >)與雙引號(")都被 HTML encode 了,所以我們必須走 Angular 表達式注入的路線。 一樣先進入網站。 ![image](https://hackmd.io/_uploads/SyMD1_fBxx.png) 隨便找個東西並看原始碼。 ![image](https://hackmd.io/_uploads/BkoEgOMreg.png) AngularJS 會掃描有 `ng-app` 屬性的 HTML 元素,並解析裡面的 表達式,例如 `{{1+2}}`。 輸入的內容被反映在有 `ng-app` 的區域內,但 `<>` 與 `"` 都會被 encode,代表你無法直接注入 `<script>` 或 `onerror="..."`,這時候可以用 AngularJS 的表達式注入技巧來繞過。 所以利用 AngularJS 表達式注入觸發 alert: ``` {{$on.constructor('alert(1)')()}} ``` - `{{$on}}` 是 AngularJS 預設在 scope 裡的事件函數。 - `$on.constructor` 回傳的是 Function。 - `Function('alert(1)')()` 就等於執行 `alert(1)`。 在輸入框輸入並搜尋後: ![image](https://hackmd.io/_uploads/BJZsedGBge.png) ![image](https://hackmd.io/_uploads/SyoieOzSxx.png) ---