# Cross-site scripting Lab20 本題是 Stored XSS in onclick event handler,嘗試觸發 alert。 一樣先進入網站。 ![image](https://hackmd.io/_uploads/SJyb4bXrge.png) 送出表單並查看原始碼。 ![image](https://hackmd.io/_uploads/S1wzEZXrxe.png) ![image](https://hackmd.io/_uploads/Bkp1rbmreg.png) 這裡隨意輸入各種符號可知: - 在 Website 欄位填的內容會被放進 HTML 裡的 onclick="..."。 - `<` `>` `"` 都會變成 `&lt;` `&gt;` `&quot;` - `'` 和 `\` 會變成 `\'`,也就是前面加跳脫 由於沒辦法打破 `onclick="..."` 的雙引號,也沒辦法用 `<script>`,但可以利用 JavaScript URL: ``` http://foo?&apos;-alert(1)-&apos; ``` 攻擊原理解析: Website 欄位內容最終會被當作 `href` 的值,例如: ``` <a href="http://foo?&apos;-alert(1)-&apos;" onclick="..."> ``` 因為整個內容是放進 `onclick="..."` 裡面,而你的 payload 被插進來後長這樣: ``` <a onclick="somecode('http://foo?&apos;-alert(1)-&apos;')"> ``` 但實際上單引號被跳脫變成 `\'`,所以這裡我們主動放入一些符號來平衡與關閉字串結構: `&apos;` → HTML 的單引號。 `'-alert(1)-'` → 假設 onclick 內部是這樣處理字串會導致執行 alert。 整段 JavaScript 最終變成: ``` someFunction('http://foo?'-alert(1)-'') ``` 而這樣會變成語法錯誤並導致解析器執行 alert(1)。 ![image](https://hackmd.io/_uploads/HJsx8WQSge.png) ![image](https://hackmd.io/_uploads/H1qZLZmrge.png) ---