CSRF (Cross-Site Request Forgery)

CSRF (Cross-Site Request Forgery)

in

๐Ÿ” Introduction

CSRF๋Š” Cross-Site Request Forgery ์˜ ์•ฝ์ž๋กœ ์ฟ ํ‚ค์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ด์šฉํ•œ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ฟ ํ‚ค ๋˜๋Š” ๋‹ค๋ฅธ ์ธ์ฆ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ชจ๋ฅด๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ์„œ๋น„์Šค ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Cookie์™€ ๋„๋ฉ”์ธ

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

Cookie์˜ ๋ณด์•ˆ์ •์ฑ…/์†์„ฑ

์ฟ ํ‚ค์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ณด์•ˆ ์ •์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„์— ์œ„ํ‚ค๋กœ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ด๊ณ , ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

  • SameSite: ์ฟ ํ‚ค๋ฅผ์˜ SameSite ์ •์ฑ…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์„ค์ •์— ๋”ฐ๋ผ ๋„๋ฉ”์ธ ๋‹น ์ฟ ํ‚ค ์„ค์ •์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • Domain: ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋„๋ฉ”์ธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•ด์ง‘๋‹ˆ๋‹ค.
  • Path: ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  Path๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Path๊ฐ€ / ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ง€์ •๋œ ํŽ˜์ด์ง€์—์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • Expires: ์ฟ ํ‚ค์˜ ์œ ํšจ๊ธฐ๊ฐ„์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ์ฟ ํ‚ค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (์„ธ์…˜์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ข…๋ฃŒ ์‹œ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค)
  • Secure: true๋กœ ์„ค์ •๋˜๋Š” ๊ฒฝ์šฐ TLS(https) ํ™˜๊ฒฝ์—์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • HttpOnly: true๋กœ ์„ค์ •๋˜๋Š” ๊ฒฝ์šฐ Javascript์—์„œ document.cookie๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Authorization Header

Authorization ํ—ค๋”๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค๋ฅธ ํ—ค๋”์™€ ๋‹ค๋ฅด๊ฒŒ Cookie๋ž‘ ๋น„์Šทํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Header์˜ ๊ฒฝ์šฐ Javascript ๋‹จ์—์„œ ์ถ”๊ฐ€๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, Authorization ํ—ค๋”์˜ ๊ฒฝ์šฐ HTML Form์„ ํ†ตํ•œ ์ „์†ก์—์„œ๋Š” ์ฟ ํ‚ค์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ์ž๋™ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— CSRF์˜ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ—ก Offensive techniques

CSRF์˜ ๊ณต๊ฒฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ํฌ๋กœ์Šค ๋„๋ฉ”์ธ ํ™˜๊ฒฝ, ์ฆ‰ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ตฌ์„ฑํ•œ ์›น ํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์ •๋ณด๋ฅผ ํฌํ•จํ•ด ์ „์†กํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ GET CSRF์˜ ๊ฒฝ์šฐ img ํƒœ๊ทธ, POST ๋“ฑ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•œ CSRF๋Š” form ํƒœ๊ทธ๊ฐ€ ๋งŽ์ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

Login CSRF

Login CSRF๋Š” ๋กœ๊ทธ์ธ ํผ์—์„œ์˜ CSRF๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฐœ๋ฐœ์ž, ์ผ๋ถ€ ๋ณด์•ˆ ์—”์ง€๋‹ˆ์–ด๋Š” ๋กœ๊ทธ์ธ CSRF๋ฅผ ๋น„์ธ์ฆ ์ƒํƒœ์—์„œ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ทจ์•ฝํ•˜์ง€ ์•Š๋‹ค๋ผ๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒฝํ–ฅ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ํŠน์ • ์ƒํ™ฉ์—์„œ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ๋ถ„๋ช…ํžˆ ์กด์žฌํ•ด์„œ ๊ผญ ๊ฒ€์ฆํ•ด์•ผํ•˜๊ธฐ๋Š” ๋ถ€๋ถ„์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋งค์ปค๋‹ˆ์ฆ˜์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž์˜ ์ธ์ฆ์ •๋ณด๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋กœ๊ทธ์ธ ์‹œํ‚ค๋Š” CSRF ์ž…๋‹ˆ๋‹ค.

POST /login HTTP/1.1
Referer: attacker.site.csrf.poc

id=attacker&password=attacker_password

๊ณต๊ฒฉ์ž์˜ ๊ณ„์ •์ •๋ณด์— ์ž…๋ ฅํ•˜๋„๋ก

๋กœ๊ทธ์ธ CSRF๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž๊ธฐ๋„ ๋ชจ๋ฅด๊ฒŒ ๊ณต๊ฒฉ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ๋˜๋Š”๋ฐ, ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์ค‘์š”์ •๋ณด๋ฅผ ๊ณต๊ฒฉ์ž ๊ณ„์ •์— ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์„œ๋น„์Šค๋Š” ๊ณ„์ •์ •๋ณด ๋ณ€๊ฒฝ ํŽ˜์ด์ง€์— ์ง„์ž…ํ•˜๋ฉด ๊ธฐ์กด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„  ์ด ํŽ˜์ด์ง€๊ฐ€ ๊ณต๊ฒฉ์ž์˜ ๊ณ„์ •์ธ์ง€, ์ž์‹ ์˜ ๊ณ„์ •์ธ์ง€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๊ณต๊ฒฉ์ž ๊ณ„์ •์— ์‚ฌ์šฉ์ž์˜ ์ค‘์š”์ •๋ณด(ํŒจ์Šค์›Œ๋“œ, ๊ณ„์ขŒ์ •๋ณด ๋“ฑ)์„ ๋‚จ๊ธฐ๊ฒŒ ๋˜๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ CSRF ์œ ํ˜•์€ ๋ถˆํŠน์ • ๋‹ค์ˆ˜๋ฅผ ๋ชฉํ‘œ๋กœํ•˜๋Š” CSRF ๋ณด๋‹ค ์ •๋ฐ€ํ•˜๊ฒŒ ๋Œ€์ƒ์„ ๊ฒจ๋ƒฅํ•œ CSRF ๊ณต๊ฒฉ์ผ ๋–„ ํ›จ์”ฌ ์†์ด๊ธฐ ์‰ฌ์šฐ๋ฉฐ ํšจ๊ณผ๋„ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

3rd party ์„œ๋น„์Šค๊ฐ€ ์—ฐ๋™๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—

๋‘๋ฒˆ์งธ ์œ ํ˜•์€ ๋กœ๊ทธ์ธํ•œ ์„œ๋น„์Šค์—์„œ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์™€ ์—ฐ๋™๋œ ๊ฒฝ์šฐ์— ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต Self XSS์™€ ๊ฒฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ์š”, Login CSRF๋ฅผ ํ†ตํ•ด Self XSS๊ฐ€ ์กด์žฌํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ XSS ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž ๋””๋ฐ”์ด์Šค์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ์ด ๋•Œ ํ•ด๋‹น ํŽ˜์ด์ง€๋Š” ๊ณต๊ฒฉ์ž์˜ ์„ธ์…˜์ด๊ฒ ์ง€๋งŒ, 3rd party ๋“ฑ์œผ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์ผ ๊ฒฝ์šฐ๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๋Š” ์ด ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ SOP ๋“ฑ์„ ์šฐํšŒํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Bypass protection

Bypass referer validation

https://www.hahwul.com/2019/10/11/bypass-referer-check-logic-for-csrf/

Basic

1) Open https://attacker.com/csrf.html
2) Referer header is ..

Referer: https://attacker.com/csrf.html

With question mark(?) payload

1) Open https://attacker.com/csrf.html?trusted.domain.com
2) Referer header is ..

Referer: https://attacker.com/csrf.html?trusted.domain.com

With semicolon(;) payload

1) Open https://attacker.com/csrf.html;trusted.domain.com
2) Referer header is ..

Referer: https://attacker.com/csrf.html;trusted.domain.com

With subdomain payload

1) Open https://trusted.domain.com.attacker.com/csrf.html
2) Referer headers is ..

Referer: https://trusted.domain.com.attacker.com/csrf.html

JSON CSRF with SWF

https://www.hahwul.com/2018/08/12/attack-json-csrf-with-swfactionscript/

<img src="http[s]://[yourhost-and-path]/test.swf?jsonData=[yourJSON]&php_url=http[s]://[yourhost-and-path]/test.php&endpoint=http[s]://[targethost-and-endpoint]">

JSON CSRF with Parameter padding

https://www.hahwul.com/2017/05/24/web-hacking-parameter-padding-for/

<form action="csrfpage" method="POST" enctype="text/plain">
<input name='{"title":123,"content":"hello","board_code":1,"hwul":"' value='bypass"}'>
<input type="submit" value="Attack!">
</form>

PUT/DELETE CSRF

https://www.hahwul.com/2016/06/30/web-hacking-putdelete-csrfcross-site/

Only rails

<form method="post" ...>
  <input type="hidden" name="_method" value="put" />
  ...

Method/SameSite Bypass

๋•Œ๋•Œ๋กœ _method ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐฑ์—”๋“œ์—์„œ HTTP Method๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์•„๋ž˜ Method ๊ด€๋ จ ํ—ค๋”๋“ค์„ ํ†ตํ•ด ์‹ค์ œ ์š”์ฒญํ•˜๋Š” HTTP Method์™€ ๋ฐฑ์—”๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” HTTP Method๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์ด์šฉํ•ด CSRF ๋Œ€์‘์„ ๋ฌด๋ ฅํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • X-HTTP-Method
  • X-HTTP-Method-Override
  • X-Method-Override

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ SameSite=Lax๋กœ ๋ช…์‹œ๋œ ์ฟ ํ‚ค๋Š” GET ๊ธฐ๋ฐ˜์˜ ์ผ๋ฐ˜ ์›น ์š”์ฒญ์„ ์ œ์™ธํ•˜๊ณค Cross-Origin์—์„œ ์ฟ ํ‚ค๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ Method Bypass๋ฅผ ์ด์šฉํ•ด์„œ POST ๊ธฐ๋ฐ˜์˜ CSRF๋ฅผ GET ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•˜๊ณ , ๋ฐฑ์—”๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” Method๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ด๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Authorization Header CSRF

์ผ๋ฐ˜์ ์œผ๋กœ HTTP Header๋ฅผ ํ†ตํ•œ ์ธ์ฆ์€ Javascript ๋‹จ์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉฐ CSRF๋ฅผ ์„ฑ๊ณตํ•˜๊ธฐ ์–ด๋ ค์šด ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์˜ˆ์™ธ์ ์œผ๋กœ Authorization ํ—ค๋”์˜ ๊ฒฝ์šฐ HTML Form์œผ๋กœ ์š”์ฒญ ํ›„ ๋ฐ›์•„์˜ค๋Š” ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋™์œผ๋กœ Authorization ํ—ค๋”๋ฅผ ๋ถ™์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ†ตํ•ด ์ธ์ฆํ—ค๋”๊ฐ€ ํฌํ•จ๋œ CSRF๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ›ก Defensive techniques

๋ฐฉ์–ด ๋งค์ปค๋‹ˆ์ฆ˜๋„ ๊ณต๊ฒฉ ๋งค์ปค๋‹ˆ์ฆ˜๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์š”์ฒญ์ด ํฌ๋กœ์Šค๋„๋ฉ”์ธ, ๋˜๋Š” ๋‚ด๊ฐ€ ์‹ ๋ขฐํ•˜๋Š” ๋„๋ฉ”์ธ์—์„œ ์˜จ ์š”์ฒญ์ธ์ง€๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ ๋กœ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์€ CSRF Token, Referer ํ—ค๋” ๊ฒ€์ฆ, Origin ํ—ค๋” ๊ฒ€์ฆ์ด ์žˆ์œผ๋ฉฐ ์ตœ๊ทผ์— ๋ธŒ๋ผ์šฐ์ €์˜ ์ฟ ํ‚ค ์ •์ฑ…์˜ ๋ณ€ํ™”๋กœ ์ธํ•ด์„œ ์ž˜ ์„ค์ •๋œ ์ฟ ํ‚ค ์„ค์ •์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSRF Token

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

๋‹ค๋งŒ ์ด ๊ณผ์ •์—์„  ์ •ํ™•ํ•˜๊ฒŒ Token์„ ๊ฒ€์ฆํ•ด์•ผํ•˜๋ฉฐ, Token์— ๋Œ€ํ•œ ๋ณด์•ˆ์„ฑ๋„ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ ค๋˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‰ฝ๊ฒŒ ํฌ๋ž™ํ•  ์ˆ˜ ์—†๋Š” ๊ธด ๊ธธ์ด์˜ ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์˜ ๊ฐ’์€ ์ถ”์ธกํ•˜๊ฑฐ๋‚˜ ์—ญ๋ถ„์„์ด ์–ด๋ ค์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์€ ๊ฐ€๊ธ‰์  ๋งค๋ฒˆ ๊ธฐ๋Šฅ ํŽ˜์ด์ง€ ์š”์ฒญ ์‹œ ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์‚ฌ์šฉ๋œ ํ† ํฐ์€ ํ๊ธฐ์ฒ˜๋ฆฌ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์€ ๊ฐ ์œ ์ € ์„ธ์…˜๋‹น ์œ ๋‹ˆํฌ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • CSRF ํ† ํฐ์€ HTTP Header ๋˜๋Š” URI, Body ๋“ฑ์œผ๋กœ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ฟ ํ‚ค๋Š” ์œ„ํ—˜ํ•ด์š”)

CSRF Token์˜ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ CSRF Token์„ header ๋˜๋Š” body ๊ฐ’์„ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ด์™ธ์— HttpOnly Cookie๋กœ๋„ ์ „๋‹ฌํ•˜์—ฌ ์ด์ค‘์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ์•ก์…˜์„ ํ†ตํ•ด CSRF Token์ด ์œ ์ถ”๋˜๊ฑฐ๋‚˜ ํƒˆ์ทจ๋˜์–ด๋„ ๋ณด์•ˆ์„ฑ์ด ์š”๊ตฌ๋œ Cookie๋ฅผ ํ†ตํ•ด ๋™์‹œ์— ์ „๋‹ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— 2์ฐจ์ ์ธ ํ”ผํ•ด๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

POST /user/change_token HTTP/1.1
Cookie: csrf_token=s98asdf798sadf6as76df587asd6f5; httponly; secure;

csrf_token=s98asdf798sadf6as76df587asd6f5

Referer check

Referer ํ—ค๋”๋Š” ์š”์ฒญ์ด ๋ฐœ์ƒํ•œ origin์˜ ์ฃผ์†Œ๊ฐ€ ํฌํ•จ๋œ Request ํ—ค๋”์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ์„œ๋ฒ„๋Š” ์ด ์š”์ฒญ์˜ ์‹œ์ž‘์ ์ด ์–ด๋””์ธ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Referer ํ—ค๋” ๊ฒ€์ฆ ์‹œ subdomain, ํ•˜์œ„ ๊ฒฝ๋กœ ๋“ฑ์„ ํ†ตํ•ด ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ์–ด ์ •ํ™•ํ•˜๊ฒŒ Referer ํ—ค๋”์— ๋Œ€ํ•ด ๊ฒ€์ฆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Referer: allow_url (O)
Referer: allow_url.attacker_url (x)
Referer: attacker_url/allow_url (x)
Referer: attacker_url?allow_url (x)
Referer: attacker_url;allow_url (x)
Referer: attacker_url (x)

์ตœ๊ทผ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฒฝ์šฐ Cross origin์—์„œ path๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Referer ํ—ค๋” ์ฒดํฌ ์‹œ ๋™์ผ ๋„๋ฉ”์ธ CSRF์˜ ๊ฒฝ์šฐ Path๊นŒ์ง€, ํฌ๋กœ์Šค ๋„๋ฉ”์ธ์ธ ๊ฒฝ์šฐ Host๊นŒ์ง€ ๊ฒ€์ฆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Origin check

Origin ํ—ค๋” ๋˜ํ•œ Referer ํ—ค๋”์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์š”์ฒญ์ด ๋ฐœ์ƒํ•œ origin์„ ์˜๋ฏธํ•˜๋Š” ํ—ค๋”์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ Referer URI Path๊นŒ์ง€ ํฌํ•จํ•œ๋‹ค๋ฉด Origin์€ ๋„๋ฉ”์ธ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ ๋˜ํ•œ ๊ฒ€์ฆ ์‹œ subdomain์„ ํ†ตํ•ด ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„๋“ค์ด ์žˆ์–ด ์ •ํ™•ํ•˜๊ฒŒ ๊ฒ€์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

SameSite

SameSite๋ฅผ Lax ๋˜๋Š” Strict๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด Cross-origin ํ™˜๊ฒฝ์—์„œ ์ฟ ํ‚ค ์ „์†ก์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ CSRF๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Set-Cookie: auth=blahblah; SameSite=Lax;

SameSite์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ โ€˜SameSite=Lax๊ฐ€ Default๋กœ? SameSite Cookie์— ๋Œ€ํ•ด ์ •ํ™•ํ•˜๊ฒŒ ์•Œ์•„๋ณด๊ธฐโ€™ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”! hahwul

Host prefix

CSRF Token์„ ์ฟ ํ‚ค๋กœ๋งŒ ์„ค์ •ํ•  ๋•Œ ์ฟ ํ‚ค ์ด๋ฆ„์— ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋ถ™์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. CSRF Token์„ ์ฟ ํ‚ค๋กœ๋งŒ ์„ค์ •ํ•˜๋ฉด ๋‹น์—ฐํžˆ ์ทจ์•ฝํ•˜์ง€๋งŒ Host prefix(__Host-)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌํ˜• IE๋ฅผ ์ œ์™ธํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„  ์ด๋ฅผ ๋„๋ฉ”์ธ์„ ์‹๋ณ„ํ•˜๋Š” ์žฅ์น˜๋กœ ์“ฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Set-Cookie: __Secure-ID=123; Secure; Domain=example.com
Set-Cookie: __Host-ID=123; Secure; Path=/

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

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes

Captcha

Captcha(Completely Automated Public Turing test to tell Computers and Humans Apart)๋Š” ๋ณดํ†ต ๋ด‡์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์žฅ์น˜์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ์ด ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ์˜ ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ๊ธ€์”จ๋ฅผ ์œ ์ถ”ํ•˜๊ฑฐ๋‚˜ ์ปดํ“จํ„ฐ๊ฐ€ ํŒ๋‹จํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ์‚ฌ๋žŒ์ž„์„ ์ฆ๋ช…ํ•˜๋Š” ๊ธฐ์ˆ ์ธ๋ฐ, ์ด๋ฅผ ํ†ตํ•ด์„œ๋„ CSRF์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ•น Tools

  • https://www.hahwul.com/phoenix/csrf/
  • https://github.com/0xInfection/XSRFProbe

๐Ÿ“š Articles

๐Ÿ“Œ References