DOM XSS : LAB [7]

DATE : 2024/1/10

โ—Reflected DOM XSS

์—ฌ๋Š ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ LAB์— ๋“ค์–ด์™€ ๋ณด๋ฉด ํŽ˜์ด์ง€ ์ค‘์•™์— ๊ฒ€์ƒ‰ ๋ฐ”๊ฐ€ ๋†“์—ฌ ์žˆ๋‹ค.

๊ฒ€์ƒ‰ํ•  ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๊ณ  ENTER๋ฅผ ๋ˆ„๋ฅด๋ฉด ์œ„์™€ ๊ฐ™์ด

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

์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด packet์„ ์—ด์–ด๋ดค๋”๋‹ˆ

search('search-results')๋ผ๋Š” ๊ฐ„๋‹จ๋ช…๋ฃŒํ•œ ์ฝ”๋“œ๊ฐ€ ์ ํ˜€์ ธ ์žˆ์—ˆ๋‹ค.

search-results์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋˜ ๋‹ค๋ฅธ packet์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์„ search parameter๋กœ ์ „๋‹ฌํ•˜๋ฉด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ json object ํ˜•ํƒœ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋„ ์ž…๋ ฅํ•ด๋ณด๋‹ˆ results ๋‚ด์šฉ์ด ์ƒ๊ธด ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š”

results๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋‚˜์˜จ ๊ฒŒ์‹œ๋ฌผ ์ •๋ณด์ด๊ณ ,

searchTerm์€ search parameter๋กœ ์ „๋‹ฌ๋œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ’์ž„์„ ๋ˆˆ์น˜์ฑŒ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋Œ€์ฒด ๋ฌด์—‡์„ ํ•˜๋Š๋ƒ!?

ํ•จ์ˆ˜ search()๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ ์œ„์™€ ๊ฐ™์ด eval์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค..!

searchResultsObj๋ฅผ ์ƒ์„ฑ & ํ• ๋‹นํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ฑฐ ๊นŒ์ง€ ์‚ดํŽด๋ณด๋‹ˆ

searchResultsObj๋Š” ์œ„์—์„œ ๋ดค๋˜ search-results ๊ฒฐ๊ณผ์ธ json object์ด๊ณ 

๊ทธ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” results & searchTerm์„ ๊ฐ๊ฐ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด ๊ฒฐ๊ณผ ๋ฌธ๊ตฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์ด ์–ด๋Š ์œ„์น˜์— ๋“ค์–ด๊ฐ€๋Š” ์ง€ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ตœ์ข…์ ์œผ๋กœ searchTerm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์€

h1.innerHTML = searchResults.length + "search results for '" + searchTerm + "'";

h1 innerHTML ๊ฐ’์„ ๋„ฃ๋Š” ์œ„์น˜๋กœ innerHTML์— alert()๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.

searchTerm์€ json object๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—

INPUT > \"-alert(1)}//

> { results: [], searchTerm:"\\"-alert(1)}//"}
> { results: [], searchTerm:"\\"-alert(1)}

์•ž ๋’ค์— ์ž‘์„ฑ๋œ ๋‚ด์šฉ์„ ๊ณ ๋ คํ•˜์—ฌ INPUT๊ณผ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฒŒ ๋˜๋ฉด innerHTML๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์œ„์น˜์—์„œ๋Š”

h1.innerHTML = searchResults.length + "search results for '\\'-alert(1);

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฌธ๊ตฌ๋ฅผ ๋งŒ๋“  ํ›„ alert(1)๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์—

ํŒ์—… ์ฐฝ์ด ๋œฌ ๋‹ค์Œ์—

๊ฒฐ๊ณผ ํ™”๋ฉด์ด ๋ณด์ด๋Š” ์ˆœ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ ์‚ฝ์ž…ํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž˜ ์ดํ•ด๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ฃผ์ž๋ฉด

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var h1 = document.createElement("h1");
        var searchTerm = "hanhxx"-alert(1);
        h1.innerHTML = "search results for"+searchTerm;
        document.body.appendChild(h1);
    </script>
</body>
</html>

- ๋ฌธ์ž๋Š” ์•ž์— ์ž‘์„ฑ๋œ ๋‚ด์šฉ๊ณผ ๋’ค์— ์ž‘์„ฑ๋œ ๋‚ด์šฉ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ์‚ฐ์ž๋กœ

๊ฒฐ๊ณผ์ ์œผ๋กœ innerHTML์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๊ณ 

"search results for hanhxx"-alert(1)

์ด ํŽ˜์ด์ง€์— ์ ‘์†ํ•ด๋ณด๋ฉด

ํŒ์—… ์ฐฝ์ด ๋จผ์ € ๋œฌ ๋‹ค์Œ

<h1> tag๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

-alert(1) ์•ž์— ์–ด๋–ค ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋“  searchTerm์€ NaN์œผ๋กœ ์ถœ๋ ฅ์ด ๋˜๋Š”๋ฐ

์•„๋งˆ๋„ ๊ธฐ๋Šฅ ์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์ง€๋งŒ -alert(1)๋ฅผ ๋ถ™์˜€๊ธฐ ๋•Œ๋ฌธ์ธ ๋“ฏํ•˜๋‹ค.

์–ด์ฐŒ ๋๋“  ์ด์ „์— ๋‚˜์˜ค์ง€ ์•Š์•˜๋˜ innerHTML์ด๋ผ๋Š” ์†์„ฑ์ด ์ƒˆ๋กœ ๋“ฑ์žฅํ–ˆ๋‹ค..!

document.write์™€ ๋”๋ถˆ์–ด DOM XSS์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ํ™œ์šฉ๋˜๋Š” ์ทจ์•ฝํ•œ ์ฝ”๋“œ์ž„์„ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์ž!

Last updated