๐ Introduction
Web Cache Deception์ ์ค์ ์ ๋ณด๋ฅผ ๋ฆฌํดํ๋ API์์ ํด๋น ์ ๋ณด๋ฅผ ์บ์ํ๋๋ก ์ค์ ๋์ด ์๊ฑฐ๋, ์ฒ๋ฆฌ ๋ฐฉ์ ๋ฏธํกํจ์ ์ด์ฉํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์์๋ก ์ฌ์ฉ์์ ์ค์ ์ ๋ณด๋ฅผ ์บ์ํ๊ณ SOP๋ฅผ ๋ฌด์ํ์ฌ ์ ๋ณด๋ฅผ ํ์ทจํ ์ ์๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ง์ฝ ์๋์ ๊ฐ์ด ์ค์ํ ์ ๋ณด๊ฐ Response๋ก ์ ๊ณต๋์ง๋ง SOP๋ก ์ธํด ๋ณดํธ๋๊ณ ์๋ ์ํ์ธ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๊ฐ ํด๋น Response๋ฅผ ํธ๋ค๋งํ์ฌ ํด๋น ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์์ต๋๋ค. ๋ฌผ๋ก CORS ์ค์ ์ด ์๋ชป๋ ๊ฒฝ์ฐ ์ ๋ณด๋ฅผ ํธ๋ค๋งํ์ฌ ๊ฐ์ ธ๊ฐ ์ ์๊ณ , ์ด๋ ๋ณดํต JSON Hijacking์ผ๋ก ํํํฉ๋๋ค. ๋๋๋ก ์ด๋ค API๋ค์ Response์ ์ค์์ ๋ณด๋ฅผ ๋ด๊ณ ์์ง๋ง, Cache ๊ด๋ จ ํค๋๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ์บ์ํ๋๋ก ์ ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
|
|
์ด๋ฌํ ๊ฒฝ์ฐ ์ด๋ฏธ ํด๋น URL์ ๋ฐ์ดํฐ๊ฐ ๋ธ๋ผ์ฐ์ ์ ์บ์๋์ด ์๊ธฐ ๋๋ฌธ์ XMLHttpRequest, $ajax ๋ฑ์ผ๋ก ํธ์ถ ์ withCredential์ false๋ก ์ค์ (์ด๋ CORS: * ์ผ ๋ SOP๋ฅผ ๋ฌด์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. [์ฐธ๊ณ /๊ด๋ จ๋ด์ฉ])ํ์ฌ ์ฟ ํค๊ฐ ๋ถ์ง ์์ ์์ฒญ์ด ์ ์ก๋๋๋ผ๋ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ณต๊ฒฉ์๊ฐ ์ค์์ ๋ณด๋ฅผ ์ฝ์ ์ ์๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ค API๋ค์ ์ ํํ ๊ฒฝ๋ก๋ก๋ง ํธ์ถํ ์ ์๋๊ฒ ์๋ wildcard๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ๊ฒฝ๋ก๋ ๋ค๋ฅธ ํ์ฅ์๋ก ํธ์ถํด๋ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
REQ/RES 1
|
|
REQ/RES 2
|
|
์ด๋ ๊ฒ ํ์ ๊ฒฝ๋ก๋ ํ์ฅ์ ๋ฑ์ ์ํฅ๋ฐ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํดํ๋ค๋ฉด ๊ฐ์ ๋ก ์บ์๋ฅผ ์ ๋ํ๋ ํค๋๊ฐ ์๋ค๊ณ ํด๋ ์๋์ ๊ฐ์ด css/js/jpg ๋ฑ ๋ธ๋ผ์ฐ์ ๊ฐ ์บ์ํ๋ ค๊ณ ํ๋ ํ์ฅ์๋ฅผ ์ด์ฉํด์ response ์ ๋ณด๋ฅผ ์บ์ํ ์ ์์ต๋๋ค.
|
|
์ด๋ฏธ URL์ ์ค์์ ๋ณด๊ฐ ํฌํจ๋ ์ํ๋ก ์บ์๋ฌ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฒฉ์๊ฐ ๋ค์ ํด๋น ํ์ผ์ ์ธ์ฆ ์๋ ์ํ๋ก ์ฌ ์์ฒญํ์ฌ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ฌ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก SOP๋ฅผ ์ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ฉ๋๋ค.
|
|
๐ก Offensive techniques
Detect
Cache Deception์ ์๋ณํ๋ ค๋ฉด ๋น์ฐํ ์ค์์ ๋ณด๊ฐ ์๋ API์์ ์บ์๊ฐ ๊ฐ๋ฅํ์ง ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ Response ํค๋ ๋ด Cache-Control์ ํตํด ๊ฐ์ ๋ก ์บ์๋ฅผ ์ ๋ํ๋์ง ์ฒดํฌํ๊ณ , ๋ณ๋ค๋ฅธ ์บ์ ์ค์ ์ด ์๋ ๊ฒฝ์ฐ ์ด๋ฏธ์ง, JS ๋ฑ ๋ฆฌ์์ค ๊ด๋ จ ํ์ฅ์๋ฅผ ์ด์ฉํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์์ ๋ณด ํ์ด์ง๋ฅผ ์บ์ํ ์ ์๋์ง ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
Resource๋ฅผ ์ด์ฉํ ์บ์ ์ ๋ ์์
|
|
Exploitation
์ค์์ ๋ณด๋ฅผ ์บ์ํ ์ ์๋ค๋ฉด ์ด์ ํด๋น ์ ๋ณด๋ฅผ img ํ๊ทธ ๋ฑ์ผ๋ก ์บ์ํ ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด ๋ฉ๋๋ค. ์ด๋ฏธ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ CORS: * ๋ฑ Response ํธ๋ค๋ง์ ์ ํ์ด ์๋๋ผ๋ withCredentials
๋ฅผ false๋ก ์ฃผ์ด ์ด๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
|
|
Bypass protection
With Cache Poisoning
๋ง์ฝ ์๋น์ค์ Web Cache Poisoning ์ทจ์ฝ์ ์ด ์กด์ฌํ๋ค๋ฉด, ์ด๋ฅผ ํตํด Cache Deception์ ์ ๋ํ ์ ์์ต๋๋ค. ๋ง์ฝ X-Unkeyd-Input ๋ผ๋ ํค๋๊ฐ Poisoning์ unkeyd input์ผ๋ก ์ฐ์ผ ์ ์๋ค๋ฉด, ์๋์ ๊ฐ์ด ํด๋น ํค๋๋ฅผ ํฌํจํ ์์ฒญ์ ๋ฐ์์์ผ ์บ์๋๋๋ก ์ ๋ํ ์ ์์ต๋๋ค. ์ด ๋ ์ผ๋ฐ ํ์ด์ง๋ก ์บ์ํ๋ฉด ์ ์ญ ์บ์๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํน์ ์๋ณ ์ ๋ณด(์๋ ์์์์ userid)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ถ์ฌ์ฃผ์ด Cache busting ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ๊ฐ๊ฐ์ธ ์ธ์ ๋ง๋ค ์ค์์ ๋ณด๋ฅผ ์บ์ํ ์ ์์ต๋๋ค.
Req
|
|
Script
|
|
๐ก Defensive techniques
๋์๋ฐฉ์์ ๊ฐ๋จํฉ๋๋ค. ์ค์์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ API์ ๋ํด์ ์บ์๋ ์ฌ์ง๋ฅผ ๋จ๊ฒจ๋์ง ์๋๊ฒ ์ข์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก cache-control ํค๋๋ฅผ ํตํด no-store ๋ฑ ์บ์ํ์ง ์๋๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
|
|
๋ํ ์ค์์ ๋ณด API๋ค์ handler ๋ฑ์์ ์ ํํ URL๋ก๋ง ์ฌ์ฉํ ์ ์๋๋ก wildcard ์ฒ๋ฆฌ๋ ์ ๊ฑฐํฉ๋๋ค.
e.g golang-echo - before
|
|
e.g golang-echo - after
|
|
๐น Tools
- web cache deception scanner in burpsuite
- https://github.com/PortSwigger/param-miner in burpsuite
- fuzzer in ZAP