今天挑戰的是 Dom型的XSS,一樣是從 Low level 開始
我們會先看到這個頁面


打開 source code


我們發現他這裡沒有任何 php 的 code
那我們打開 F12 看看


這裡發現我們的選項欄預設的文字會是 default 參數的文字
像是如果 default 的參數改 123 會變成這樣




那我們把 default 的參數改成 payload 呢


XSS 成功!!!




看看 source code


他這裡把我們的 <script> 標籤過濾掉,並將 default 設為 English,而且 stripos 函數是不分大小寫的,所以這裡我們只能透過用其他標籤繞過的方式來做


可是如果我們直接打<img src="" onerror="alert(1)">,他在前端寫的 javascript 會直接把我們的 payload 塞進 <option> 的標籤當中,但在<option> 標籤中是不能包含 <img> 標籤的,而且外面還有一層<select>標籤,所以我們要關掉<option> 跟<select>標籤


XSS 成功!!!



一樣看 source code


他這裡透過白名單的方式去檢查 default 參數的值,那這樣我們該怎麼繞過呢


為什麼可以用 # 來繞過 ?# 通常在 URL 中可以代表片段位置標誌,而不算在 GET 傳送資料的一部分,因此後端 PHP 不會接收到 # 之後的訊息,但前端部分仍然會進行解析而導致XSS漏洞
同理

因為後面的資料不算在 default 的參數內,所以不會被 PHP 處理
XSS 成功!!!




由前面的挑戰可知,通常 DOM 型的 XSS 漏洞都是因為前端沒有做好過濾而導致的,而在 Impossible 這個 level 將之前前端連結字串有一段 URL 解碼的部分直接去掉,這樣我們輸入的任何值都會經過URL編碼,進而可以避免XSS漏洞



