๐ŸŒ Backend

XSS์™€ CSRF์˜ ํŠน์ง•

DevPoong 2023. 9. 11. 20:19

XSS(Cross-Site Scripting)

๊ณต๊ฒฉ์ž๊ฐ€ ์›น ์ƒ์—์„œ SQL Injection๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณต๊ฒฉํ•˜๋ ค๋Š” ์‚ฌ์ดํŠธ์— ์•…์˜์ ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค. 
์ฃผ๋กœ, ๋‹ค๋ฅธ ์›น ์‚ฌ์ดํŠธ์™€ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Cross Site Scripting์ด๋ผ๊ณ  ๋ช…์นญํ•œ๋‹ค.

 

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

 

์•…์˜์ ์ธ ์ปจํ…์ธ ๋กœ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. 
1) ์ฟ ํ‚ค๋‚˜ ์„ธ์…˜ ์ •๋ณด ํƒˆ์ทจ
2) ์ ‘์†์ž๋ฅผ ์ž์‹ ์ด ์˜๋„ํ•œ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
3) ์ •์ƒ์ ์ธ ์‚ฌ์ดํŠธ์ธ์ฒ™ ์œ„์กฐํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ์— ์•…์˜์ ์ธ ๊ณต๊ฒฉ

 

๊ณต๊ฒฉ ๋ฃจํŠธ๋กœ๋Š” ๊ฒŒ์‹œํŒ ๋“ฑ์˜ input ๋ฐ•์Šค์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜, ๋‹‰๋„ค์ž„์— ์ฝ”๋“œ๋ฅผ ์‹ฌ์–ด์„œ ๊ณต๊ฒฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

์ด๋ ‡๋“ฏ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ Stored XSS์™€ Reflected XSS๋กœ ๋‚˜๋‰œ๋‹ค.

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

 

XSS ๊ณต๊ฒฉ ์˜ˆ๋ฐฉ ๋ฐฉ๋ฒ•

  • HttpOnly ์†์„ฑ ON
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ document.cookie๋ฅผ ์ด์šฉํ•ด์„œ ์ฟ ํ‚ค์— ์ ‘์†ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ์˜ต์…˜
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ONํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.
  • User Input value ์ œํ•œ
    • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์ด ํ•œ์ •์ ์ธ ๋ฒ”์ฃผ์•ˆ์— ์žˆ๋‹ค๋ฉด, ๋“œ๋กญ๋‹ค์šด ๋ฐฉ์‹์œผ๋กœ ๋ฏธ๋ฆฌ ์ž…๋ ฅ๋  ๋ฐ์ดํ„ฐ๊ฐ’์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Santize value
    • ์•…์„ฑ HTML์„ ํ•„ํ„ฐ๋ง ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ

 

CSRF (Cross-Site Request Fogery, XSRF)

์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„๋ฅผ ํŠน์ • ์›น ์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค.

XSS๋ฅผ ์ด์šฉํ•œ ๊ณต๊ฒฉ์ด ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์›น ์‚ฌ์ดํŠธ๋ฅผ ์‹ ์šฉํ•˜๋Š” ์ ์„ ๋…ธ๋ ธ๋‹ค๋ฉด, CSRF ํŠน์ • ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹ ์šฉํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋…ธ๋ฆฐ ๊ฒƒ์ด๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ CSRF ๊ณต๊ฒฉ ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž…๋˜์–ด ์žˆ๋Š” ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด ๊ณต๊ฒฉ ๋Œ€์ƒ์ด ๋˜๋Š” ์›น ์‚ฌ์ดํŠธ๋Š” ์œ„์กฐ๋œ ๊ณต๊ฒฉ ๋ช…๋ น์ด ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐœ์†ก๋œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜๊ฒŒ ๋˜์–ด ๊ณต๊ฒฉ์„ ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.

 

์€ํ–‰ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ˆ์„ ์ธ์ถœํ•˜๋Š” API๊ฐ€ img ํƒœ๊ทธ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ๋˜๋ฉด ๋งŒ์•ฝ ํ•ด๋‹น ์€ํ–‰ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ์ƒํƒœ๋ผ๋ฉด HTML์ด ๋กœ๋”ฉ๋˜๋Š” ์ˆœ๊ฐ„ ๋ˆ์ด ๋น ์ ธ๋‚˜๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

<img src="https://bank.example.com/withdraw?account=you&amount=1000000&for=me">

 

CSRF์˜ ๊ณต๊ฒฉ์ด ์„ฑ๊ณตํ•˜๋ ค๋ฉด (1) ์œ„์กฐ ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ์„œ๋น„์Šค์— ํฌ์ƒ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ƒํƒœ์—ฌ์•ผ ํ•˜๊ณ , (2) ํฌ์ƒ์ž๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ๋งŒ๋“  ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•ด์•ผ ํ•œ๋‹ค๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ๋‹ค.

 

CSRF ๊ณต๊ฒฉ ์˜ˆ๋ฐฉ

  • Referrer ๊ฒ€์ฆ (Samesite ์ฟ ํ‚ค ์„ค์ •)
    • Back-end ๋‹จ์—์„œ Request์˜ referrer๋ฅผ ํ™•์ธํ•˜์—ฌ domain์ด ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • referrer ๊ฒ€์ฆ์„ ํ†ตํ•ด ๋Œ€๋ถ€๋ถ„์˜ csrf ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ฟ ํ‚ค๋Š” ์œ ํšจ ์‹œ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
    • ์ฟ ํ‚ค์˜ SameSite ์†์„ฑ์„ Strict ๋˜๋Š” Lax ๋กœ ์„ค์ •ํ•œ๋‹ค. (Strict๋กœ ์„ค์ •ํ•˜๋ฉด ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฟ ํ‚ค๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.)
    • ์ด๋Ÿฌํ•œ ๊ฒ€์ฆ์„ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” cross-site ์š”์ฒญ์— ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค.
  • Security Token ์‚ฌ์šฉ (CSRF Token)
    • Referrer ๊ฒ€์ฆ์ด ๋ถˆ๊ฐ€ํ•œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด, Security Token์„ ํ™œ์šฉํ•œ๋‹ค.
    • ์‚ฌ์šฉ์ž ์„ธ์…˜์— ์ž„์˜์˜ ๋‚œ์ˆ˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ๋งˆ๋‹ค ํ•ด๋‹น ๋‚œ์ˆ˜ ๊ฐ’์„ ํฌํ•จ์‹œ์ผœ ์ „์†กํ•œ๋‹ค.
    • ์ดํ›„ Back-end ๋‹จ์—์„œ ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์„ธ์…˜์— ์ €์žฅ๋œ ํ† ํฐ ๊ฐ’๊ณผ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌ๋˜๋Š” ํ† ํฐ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

 

 

์ฐธ๊ณ )

https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#cross-site_scripting_xss