# Cross-site scripting Lab12 本題是 Reflected DOM-based XSS,漏洞觸發點出現在 JavaScript 處理伺服器回應時,特別是透過 `eval()` 呼叫未經妥善處理的 JSON 資料。 一樣先進入網站。 ![image](https://hackmd.io/_uploads/r1_G-OfBlg.png) 隨便找個東西並看原始碼。 ![image](https://hackmd.io/_uploads/B16Em_GSxl.png) 一打開就可以看到這串: ``` eval('var searchResultsObj = ' + this.responseText); ``` 他把伺服器回傳的 JSON(this.responseText)直接拼接到一段 JS code,然後用 eval 執行。 問題是伺服器回傳的東西是包含使用者輸入(搜尋字串)的 JSON,而這裡沒做任何逃逸或過濾,等於你可以直接用特殊字串破壞這段 JS,注入惡意腳本 所以我們去看搜尋後,他回傳了什麼東西。 ![image](https://hackmd.io/_uploads/ryPnQufSxe.png) ``` {"results":[],"searchTerm":"bg"} ``` 在前端他執行了: ``` eval('var data = {"results":[],"searchTerm":"bg"}'); ``` 所以我們放入特殊字串: ``` \"-alert(1)}// ``` - `\"` 是字串中的一個雙引號。 - `-alert(1)}` 是一段 JS 代碼的一部分。 - `//` 是 JS 裡面的單行註解。 伺服器回傳會變成: ``` {"results":[],"searchTerm":"\"-alert(1)}//"} ``` eval 變成: ``` var searchResultsObj = {"results":[],"searchTerm":"\"-alert(1)}//"}; ``` 這樣 JS 會解析錯誤,反而執行 alert(1)。 ![image](https://hackmd.io/_uploads/HyHhEuzreg.png) ![image](https://hackmd.io/_uploads/BJ33EuGrlg.png) ---