DOM XSS : LAB [1]

DATE : 2024/1/8

โ—DOM XSS in document.write sink using source location.search

์ด๋ฒˆ ๋ฌธ์ œ๋Š” LAB์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋œ๋‹ค.

๊ฒ€์ƒ‰ ๋ฐ”๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ์œ„์™€ ๊ฐ™์ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋‹ค๋Š” ๋ฌธ๊ตฌ์™€

search parameter์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋•Œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ์ง€ Response๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ

<script>๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

function trackSearch(query) {
    document.write('<img src="/resources/images/tracker.gif?searchTerms='+query+'">');
}
var query = (new URLSearchParams(window.location.search)).get('search');
if(query) {
    trackSearch(query);
}

์ด ์ฝ”๋“œ๋Š” URL ์†์— search parameter๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ query์— ๋„ฃ์–ด

document.write()๋ฅผ ์‹คํ–‰ํ•˜๋ผ๋Š” ๋‚ด์šฉ์ด๋‹ค.

<img src="/resources/images/tracker.gif?searchTerms='+query+'">

query๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์œ„์น˜๋ฅผ ๊ณ ๋ คํ•ด๋ณด์•˜์„ ๋•Œ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

(1) <img> tag ๋งˆ๋ฌด๋ฆฌ

(2) <script> tag ์‚ฝ์ž…

(3) ๋’ค์— ๋‚จ๋Š” script ์ฃผ์„ ์ฒ˜๋ฆฌ

3๊ฐ€์ง€ ๋‚ด์šฉ์„ ๋งŒ์กฑ ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

(1)~(3)๋ฒˆ ๋‚ด์šฉ์„ ๋งŒ์กฑ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์œ„์™€ ๊ฐ™์ด search parameter๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด

document.write('<img src="/resources/images/tracker.gif?searchTerms='">';
    <script>alert(1)</script>
//'">');

์œ„์™€ ๊ฐ™์ด document.write() ์•ˆ์— <script> tag๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด์„œ

LAB์˜ ๋ชฉํ‘œ๋Œ€๋กœ ํŒ์—… ์ฐฝ์„ ๋„์šธ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Last updated