๐ 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 ๋ฑ์ผ๋ก ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค. (์ฟ ํค๋ ์ํํด์)
Token + Cookie
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์ ํตํด ์ฐํํ ์ ์๋ ๋ถ๋ถ๋ค์ด ์์ด ์ ํํ๊ฒ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค.
Cookie protection
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
- CSRF is dying
- Parameter Padding for Attack a JSON CSRF
- Attack a JSON CSRF with SWF(ActionScript๋ฅผ ์ด์ฉํ JSON CSRF ๊ณต๊ฒฉ์ฝ๋ ๊ตฌํ)
- Bypass referer check logic for CSRF
- PUT/DELETE CSRF(Cross-site Request Forgrey) Attack
๐ References
- https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/CSRF Injection
- https://www.hahwul.com/2020/01/18/samesite-lax/
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes