DOM XSS : LAB [5]

DATE : 2024/1/10

โ—DOM XSS in document.write sink using source location.search inside a select element

์ด๋ฒˆ LAB์€ ์ƒํ’ˆ ์žฌ๊ณ ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ธฐ๋Šฅ์— XSS ์ทจ์•ฝ์ ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

LAB์— ์ ‘์†ํ•ด ๋งˆ์Œ์— ๋“œ๋Š” ์ƒํ’ˆ์„ ํ•˜๋‚˜ ๊ณจ๋ผ์ค€๋‹ค!

์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ์ง€, ์ƒํ’ˆ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์žฌ๊ณ  ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๋Ÿฌ ์˜ต์…˜ ์ค‘ ํ•œ ๊ฐ€์ง€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” Form์ธ ๊ฑธ ๋ณด๋ฉด

<select> & <option> tag๋กœ ๊ตฌํ˜„๋˜์—ˆ์Œ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์˜ต์…˜ ์ค‘ ํ•œ ๊ฐ€์ง€๋ฅผ ์„ ํƒํ•ด Check stock ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ƒํ’ˆ์ด ์–ผ๋งˆ๋‚˜ ๋‚จ์•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

LAB ์„ค๋ช…์—์„œ ์ด๋ฏธ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— XSS ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค๊ณ  ์•Œ๋ ค์คฌ๊ธฐ ๋•Œ๋ฌธ์—

์ด ๋ถ€๋ถ„์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ์ง€ ํ™•์ธํ•ด๋ด์•ผ ํ•œ๋‹ค.

์ƒ์„ธ ํŽ˜์ด์ง€์˜ Response๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ ๋‚ด์šฉ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ storeId๋ฅผ store ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹นํ•˜๊ณ  ๐Ÿ’ก

๋ณ€์ˆ˜ store์— ํ•ด๋‹นํ•˜๋Š” <option> tag๋Š” ์„ ํƒ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” selected ์†์„ฑ์„ ๋ถ€์—ฌํ•œ๋‹ค.

๋‚˜๋จธ์ง€ ์˜ต์…˜์œผ๋กœ๋Š” ๊ทธ๋ƒฅ <option> tag๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

์ด๋•Œ store ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด

new URLSearchParames(window.location.search)).get('storeId');

URL์— ๋“ค์–ด์žˆ๋Š” storeId parameter ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ทผ๋ฐ LAB์—์„œ๋Š” ์‚ฌ์‹ค ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ storeId๊ฐ€ URL์— ํฌํ•จ๋˜์–ด์žˆ์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ

๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด POST method๋กœ productId & storeId๊ฐ€ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ! ์ฝ”๋“œ ์ƒ์—์„œ Get method๋กœ ์ „๋‹ฌ๋˜๋Š” parameter๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

URL ๋ฐ”์— storeId๋ฅผ ์ถ”๊ฐ€ํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

storeId parameter๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์ด ์ฝ”๋“œ ์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜๋Š” ์—ฌ๊ธฐ!

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

๋ฐ”๋กœ ์Šคํฌ๋ฆฝํŠธ๋งŒ ๋„ฃ์–ด๋„ ๋˜๊ฒ ์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์˜ˆ์˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ์œ„ํ•ด

์ž‘์„ฑ๋˜์–ด์žˆ๋Š” <option> tag๋Š” ๋งˆ๋ฌด๋ฆฌํ•ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค.

Paris</option>;<script>alert(1);</script>;');// 

<option> tag๋Š” ๋งˆ๋ฌด๋ฆฌ ํ•ด์ฃผ๊ณ  ์Šคํฌ๋ฆฝํŠธ ์‚ฝ์ž… ํ›„ ๋‚˜๋จธ์ง€ ๋‚ด์šฉ์€ ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

URL์— storeId parameter๋ฅผ ์ถ”๊ฐ€ํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด

์œ„์™€ ๊ฐ™์ด ์„ฑ๊ณต์ ์œผ๋กœ ํŒ์—… ์ฐฝ์ด ๋œฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๐Ÿ‘

Last updated