CORS - Misconfigurations & Bypass
Last updated
Last updated
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE) GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE)
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) ํ์ค์ ์๋ฒ๊ฐ ์์ฐ์ ์ ๊ทผํ ์ ์๋ ๋์์ ์ ์ํ๊ณ ์ธ๋ถ ์ถ์ฒ์์ ํ์ฉ๋๋ HTTP ์์ฒญ ๋ฐฉ๋ฒ์ ์ ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
๋์ผ ์ถ์ฒ ์ ์ฑ
์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ํธ์คํ
ํ๋ ์๋ฒ๊ฐ ๋์ผํ ํ๋กํ ์ฝ(์: http://
), ๋๋ฉ์ธ ์ด๋ฆ(์: internal-web.com
), ๋ฐ ํฌํธ(์: 80)๋ฅผ ๊ณต์ ํด์ผ ํ๋ค๊ณ ๊ท์ ํฉ๋๋ค. ์ด ์ ์ฑ
ํ์์๋ ๋์ผํ ๋๋ฉ์ธ๊ณผ ํฌํธ์ ์น ํ์ด์ง๋ง ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
http://normal-website.com/example/example.html
์ ๋งฅ๋ฝ์์ ๋์ผ ์ถ์ฒ ์ ์ฑ
์ ์ ์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
๋ฉ๋๋ค:
์ ๊ทผํ URL | ์ ๊ทผ ํ์ฉ ์ฌ๋ถ |
---|---|
| ์: ๋์ผํ ์คํด, ๋๋ฉ์ธ ๋ฐ ํฌํธ |
| ์: ๋์ผํ ์คํด, ๋๋ฉ์ธ ๋ฐ ํฌํธ |
| ์๋์ค: ๋ค๋ฅธ ์คํด ๋ฐ ํฌํธ |
| ์๋์ค: ๋ค๋ฅธ ๋๋ฉ์ธ |
| ์๋์ค: ๋ค๋ฅธ ๋๋ฉ์ธ |
| ์๋์ค: ๋ค๋ฅธ ํฌํธ* |
*์ธํฐ๋ท ์ต์คํ๋ก๋ฌ๋ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ํํ ๋ ํฌํธ ๋ฒํธ๋ฅผ ๋ฌด์ํ๋ฏ๋ก ์ด ์ ๊ทผ์ ํ์ฉํฉ๋๋ค.
Access-Control-Allow-Origin
ํค๋์ด ํค๋๋ ์ฌ๋ฌ ์ถ์ฒ, null
๊ฐ ๋๋ ์์ผ๋์นด๋ ***
**๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค ๋ธ๋ผ์ฐ์ ๋ ์ฌ๋ฌ ์ถ์ฒ๋ฅผ ์ง์ํ์ง ์์ผ๋ฉฐ, ์์ผ๋์นด๋ *
์ ์ฌ์ฉ์ ์ ํ์ ๋ฐ์ต๋๋ค. (์์ผ๋์นด๋๋ ๋จ๋
์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ฉฐ, Access-Control-Allow-Credentials: true
์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉ๋์ง ์์ต๋๋ค.)
์ด ํค๋๋ ์๋ฒ์ ์ํด ์น์ฌ์ดํธ์์ ์์๋ ๊ต์ฐจ ๋๋ฉ์ธ ๋ฆฌ์์ค ์์ฒญ์ ๋ํ ์๋ต์ผ๋ก ๋ฐ๊ธ๋๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ์๋์ผ๋ก Origin
ํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
Access-Control-Allow-Credentials
ํค๋๊ธฐ๋ณธ์ ์ผ๋ก ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์ฟ ํค๋ Authorization ํค๋์ ๊ฐ์ ์๊ฒฉ ์ฆ๋ช
์์ด ์ด๋ฃจ์ด์ง๋๋ค. ๊ทธ๋ฌ๋ ๊ต์ฐจ ๋๋ฉ์ธ ์๋ฒ๋ Access-Control-Allow-Credentials
ํค๋๋ฅผ **true
**๋ก ์ค์ ํ์ฌ ์๊ฒฉ ์ฆ๋ช
์ด ์ ์ก๋ ๋ ์๋ต์ ์ฝ์ ์ ์๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
true
๋ก ์ค์ ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๊ฒฉ ์ฆ๋ช
(์ฟ ํค, ์ธ์ฆ ํค๋ ๋๋ TLS ํด๋ผ์ด์ธํธ ์ธ์ฆ์)์ ์ ์กํฉ๋๋ค.
ํน์ ์กฐ๊ฑด์์ ๊ต์ฐจ ๋๋ฉ์ธ ์์ฒญ์ ์์ํ ๋, ์๋ฅผ ๋ค์ด ๋นํ์ค HTTP ๋ฉ์๋(HEAD, GET, POST ์ด์ธ์ ๋ชจ๋ ๊ฒ)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์๋ก์ด ํค๋๋ฅผ ๋์
ํ๊ฑฐ๋ ํน๋ณํ Content-Type ํค๋ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ฌ์ ์์ฒญ์ด ํ์ํ ์ ์์ต๋๋ค. ์ด ์ด๊ธฐ ์์ฒญ์ OPTIONS
๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ์๋ฒ์ ๋ค๊ฐ์ค๋ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์๋๋ฅผ ์๋ฆฌ๋ฉฐ, ์ฌ์ฉํ๋ ค๋ HTTP ๋ฉ์๋์ ํค๋๋ฅผ ํฌํจํฉ๋๋ค.
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) ํ๋กํ ์ฝ์ ์์ฒญ๋ ๊ต์ฐจ ์ถ์ฒ ์์ ์ ๊ฐ๋ฅ์ฑ์ ํ์ธํ๊ธฐ ์ํด ํ์ฉ๋ ๋ฉ์๋, ํค๋ ๋ฐ ์ถ์ฒ์ ์ ๋ขฐ์ฑ์ ๊ฒ์ฆํ๋ ์ด ์ฌ์ ์์ฒญ ๊ฒ์ฌ๋ฅผ ์๋ฌดํํฉ๋๋ค. ์ฌ์ ์์ฒญ์ด ํ์ํ์ง ์์ ์กฐ๊ฑด์ ๋ํ ์์ธํ ์ดํด๋ Mozilla Developer Network (MDN)์์ ์ ๊ณตํ๋ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฌ์ ์์ฒญ์ด ์๋ค๊ณ ํด์ ์๋ต์ด ์ธ์ฆ ํค๋๋ฅผ ํฌํจํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ์๋๋ผ๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํค๋๊ฐ ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์๋ต์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ค์์ PUT
๋ฉ์๋์ Special-Request-Header
๋ผ๋ ์ฌ์ฉ์ ์ ์ ํค๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ฌ์ ์์ฒญ์ ์์์
๋๋ค:
์๋ฒ๋ ์๋์ ๊ฐ์ด ์๋ฝ๋ ๋ฉ์๋, ํ์ฉ๋ ์ถ์ฒ ๋ฐ ๊ธฐํ CORS ์ ์ฑ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ํค๋๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค:
Access-Control-Allow-Headers
: ์ด ํค๋๋ ์ค์ ์์ฒญ ์ค์ ์ฌ์ฉํ ์ ์๋ ํค๋๋ฅผ ์ง์ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์์ฒญ์์ ํ์ฉ๋ ํค๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์๋ฒ์ ์ํด ์ค์ ๋ฉ๋๋ค.
Access-Control-Expose-Headers
: ์ด ํค๋๋ฅผ ํตํด ์๋ฒ๋ ๊ฐ๋จํ ์๋ต ํค๋ ์ธ์ ์๋ต์ ์ผ๋ถ๋ก ๋
ธ์ถ๋ ์ ์๋ ํค๋์ ๋ํด ํด๋ผ์ด์ธํธ์ ์๋ฆฝ๋๋ค.
Access-Control-Max-Age
: ์ด ํค๋๋ ์ฌ์ ์์ฒญ์ ๊ฒฐ๊ณผ๋ฅผ ์ผ๋ง๋ ์ค๋ซ๋์ ์บ์ํ ์ ์๋์ง๋ฅผ ๋ํ๋
๋๋ค. ์๋ฒ๋ ์ฌ์ ์์ฒญ์ ์ํด ๋ฐํ๋ ์ ๋ณด๊ฐ ์ฌ์ฌ์ฉ๋ ์ ์๋ ์ต๋ ์๊ฐ์ ์ด ๋จ์๋ก ์ค์ ํฉ๋๋ค.
Access-Control-Request-Headers
: ์ฌ์ ์์ฒญ์์ ์ฌ์ฉ๋๋ฉฐ, ์ด ํค๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์ค์ ์์ฒญ์์ ์ฌ์ฉํ๊ณ ์ ํ๋ HTTP ํค๋์ ๋ํด ์๋ฒ์ ์๋ฆฌ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์ ์ํด ์ค์ ๋ฉ๋๋ค.
Access-Control-Request-Method
: ์ด ํค๋๋ ์ฌ์ ์์ฒญ์์๋ ์ฌ์ฉ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ์ค์ ์์ฒญ์์ ์ฌ์ฉํ HTTP ๋ฉ์๋๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์ ์ํด ์ค์ ๋ฉ๋๋ค.
Origin
: ์ด ํค๋๋ ๋ธ๋ผ์ฐ์ ์ ์ํด ์๋์ผ๋ก ์ค์ ๋๋ฉฐ, ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ์ถ์ฒ๋ฅผ ๋ํ๋
๋๋ค. ์๋ฒ๋ CORS ์ ์ฑ
์ ๋ฐ๋ผ ์์ ์์ฒญ์ ํ์ฉํ ์ง ๊ฑฐ๋ถํ ์ง๋ฅผ ํ๊ฐํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก (์ฝํ ์ธ ์ ํ ๋ฐ ์ค์ ๋ ํค๋์ ๋ฐ๋ผ) GET/POST ์์ฒญ์์๋ ์ฌ์ ์์ฒญ์ด ์ ์ก๋์ง ์์ต๋๋ค (์์ฒญ์ด ์ง์ ์ ์ก๋จ), ๊ทธ๋ฌ๋ ์๋ต์ ํค๋/๋ณธ๋ฌธ์ ์ ๊ทผํ๋ ค๋ฉด Access-Control-Allow-Origin ํค๋๊ฐ ํฌํจ๋์ด ์์ด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์, CORS๋ CSRF๋ก๋ถํฐ ๋ณดํธํ์ง ์์ง๋ง ๋์์ด ๋ ์ ์์ต๋๋ค.
Access-Control-Request-Local-Network
: ์ด ํค๋๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ํฌํจ๋์ด ๋ฌธ์๊ฐ ๋ก์ปฌ ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ๋ชฉํ๋ก ํ๊ณ ์์์ ๋ํ๋
๋๋ค. ์ด๋ ์์ฒญ์ด ๋ก์ปฌ ๋คํธ์ํฌ ๋ด์์ ๋ฐ์ํ์์ ์๋ฒ์ ์๋ฆฌ๋ ํ์ ์ญํ ์ ํฉ๋๋ค.
Access-Control-Allow-Local-Network
: ์๋ต์ผ๋ก ์๋ฒ๋ ์ด ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ๋ ๋ฆฌ์์ค๊ฐ ๋ก์ปฌ ๋คํธ์ํฌ ์ธ๋ถ์ ์ํฐํฐ์ ๊ณต์ ๋ ์ ์์์ ์ ๋ฌํฉ๋๋ค. ์ด๋ ์๋ก ๋ค๋ฅธ ๋คํธ์ํฌ ๊ฒฝ๊ณ๋ฅผ ๋์ด ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ํ์ฉํ๋ ์ ํธ ์ญํ ์ ํ๋ฉฐ, ๋ณด์ ํ๋กํ ์ฝ์ ์ ์งํ๋ฉด์ ํต์ ๋ ์ ๊ทผ์ ๋ณด์ฅํฉ๋๋ค.
๋ก์ปฌ ๋คํธ์ํฌ ์์ฒญ์ ํ์ฉํ๋ ์ ํจํ ์๋ต์ ์๋ต์ Access-Controls-Allow-Local_network: true
ํค๋๋ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
๋ฆฌ๋ ์ค 0.0.0.0 IP๋ ํด๋น IP ์ฃผ์๊ฐ "๋ก์ปฌ"๋ก ๊ฐ์ฃผ๋์ง ์๊ธฐ ๋๋ฌธ์ localhost์ ์ ๊ทผํ๊ธฐ ์ํ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ์ฐํํ๋ ๋ฐ ์๋ํฉ๋๋ค.
๋ก์ปฌ ์๋ํฌ์ธํธ์ ๊ณต์ฉ IP ์ฃผ์(์: ๋ผ์ฐํฐ์ ๊ณต์ฉ IP)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ ๋คํธ์ํฌ ์๊ตฌ ์ฌํญ์ ์ฐํํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ฌ๋ฌ ๊ฒฝ์ฐ์, ๊ณต์ฉ IP์ ์ ๊ทผํ๋๋ผ๋, ๋ก์ปฌ ๋คํธ์ํฌ์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์๋ ์ ๊ทผ์ด ํ์ฉ๋ฉ๋๋ค.
๋ค์ ๊ตฌ์ฑ์ด ๋งค์ฐ ํ์ฉ์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค:
This is not allowed by browsers and therefore credentials won't be sent with the request allowed by this.
Access-Control-Allow-Credentials
๋ฅผ **true
**๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ถ๋ถ์ ์ค์ ๊ณต๊ฒฉ์ ๋ํ ์ ์ ์กฐ๊ฑด์ผ๋ก ๊ด์ฐฐ๋์์ต๋๋ค. ์ด ์ค์ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๊ฒฉ ์ฆ๋ช
์ ๋ณด๋ด๊ณ ์๋ต์ ์ฝ์ ์ ์๋๋ก ํ์ฉํ์ฌ ๊ณต๊ฒฉ์ ํจ๊ณผ๋ฅผ ๋์
๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์ฟ ํค๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด์ง๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญ์ ๋ฐํํ๋ ๊ฒ์ ์ด์ ์ด ์ค์ด๋ญ๋๋ค.
ํฌ์์์ ๋คํธ์ํฌ ์์น๊ฐ ์ธ์ฆ์ ํ ํํ๋ก ์์ฉํ๋ ์์ธ๊ฐ ์กด์ฌํฉ๋๋ค. ์ด๋ ํฌ์์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ํ๋ก์๋ก ์ฌ์ฉํ์ฌ IP ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฐํํ์ฌ ์ธํธ๋ผ๋ท ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ DNS ๋ฆฌ๋ฐ์ธ๋ฉ๊ณผ ์ ์ฌํ ์ํฅ์ ๋ฏธ์น์ง๋ง, ๋ ๊ฐ๋จํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
Origin
in Access-Control-Allow-Origin
Origin
ํค๋์ ๊ฐ์ด Access-Control-Allow-Origin
์ ๋ฐ์๋๋ ์ค์ ์๋๋ฆฌ์ค๋ ์ด๋ฌํ ํค๋๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ ๋ํ ์ ํ์ผ๋ก ์ธํด ์ด๋ก ์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ URL์ ๋ํด CORS๋ฅผ ํ์ฑํํ๋ ค๋ ๊ฐ๋ฐ์๋ Origin
ํค๋์ ๊ฐ์ ๋ณต์ฌํ์ฌ Access-Control-Allow-Origin
ํค๋๋ฅผ ๋์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ณต๊ฒฉ์๊ฐ ํฉ๋ฒ์ ์ผ๋ก ๋ณด์ด๋๋ก ์ค๊ณ๋ ์ด๋ฆ์ ๋๋ฉ์ธ์ ์ฌ์ฉํ ๋ ํนํ ์ทจ์ฝ์ ์ ๋์
ํ ์ ์์ต๋๋ค.
null
Origin ์
์ฉํ๊ธฐnull
origin์ ๋ฆฌ๋๋ ์
์ด๋ ๋ก์ปฌ HTML ํ์ผ๊ณผ ๊ฐ์ ์ํฉ์ ์ํด ์ง์ ๋๋ฉฐ, ๋
ํนํ ์์น๋ฅผ ์ฐจ์งํฉ๋๋ค. ์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ก์ปฌ ๊ฐ๋ฐ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์ด origin์ ํ์ดํธ๋ฆฌ์คํธ์ ์ถ๊ฐํ์ฌ, ์๋๋ฐ์ค iframe์ ํตํด ์ด๋ค ์น์ฌ์ดํธ๋ null
origin์ ๋ชจ๋ฐฉํ ์ ์๊ฒ ํ์ฌ CORS ์ ํ์ ์ฐํํ ์ ์์ต๋๋ค.
๋๋ฉ์ธ ํ์ดํธ๋ฆฌ์คํธ์ ์ง๋ฉดํ์ ๋, ๊ณต๊ฒฉ์์ ๋๋ฉ์ธ์ ํ์ดํธ๋ฆฌ์คํธ์ ์๋ ๋๋ฉ์ธ์ ์ถ๊ฐํ๊ฑฐ๋ ์๋ธ๋๋ฉ์ธ ํ์ทจ ์ทจ์ฝ์ ์ ์ด์ฉํ๋ ๋ฑ์ ์ฐํ ๊ธฐํ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ํ, ๋๋ฉ์ธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํด ์ฌ์ฉ๋๋ ์ ๊ท ํํ์์ ๋๋ฉ์ธ ๋ช ๋ช ๊ท์น์ ๋ฏธ์ธํ ์ฐจ์ด๋ฅผ ๊ฐ๊ณผํ ์ ์์ด ์ถ๊ฐ์ ์ธ ์ฐํ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ๊ท ํํ์ ํจํด์ ์ผ๋ฐ์ ์ผ๋ก ์์ซ์, ์ (.), ํ์ดํ (-) ๋ฌธ์์ ์ง์คํ๋ฉฐ, ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ ๊ฐ๊ณผํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ์ ์ ๊ท ํํ์ ํจํด์ ์ํด ๋ค๋ฅด๊ฒ ํด์๋๋ ๋ฌธ์๋ฅผ ํฌํจํ๋๋ก ์ ์๋ ๋๋ฉ์ธ ์ด๋ฆ์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ์ฐํํ ์ ์์ต๋๋ค. Safari, Chrome ๋ฐ Firefox์ ์๋ธ๋๋ฉ์ธ์์ ๋ฐ์ค ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ด๋ฌํ ๋ถ์ผ์น๊ฐ ๋๋ฉ์ธ ์ ํจ์ฑ ๊ฒ์ฌ ๋ ผ๋ฆฌ๋ฅผ ์ฐํํ๋ ๋ฐ ์ด๋ป๊ฒ ์ด์ฉ๋ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ด ์ฐํ ๊ฒ์ฌ์ ์ถ๊ฐ ์ ๋ณด ๋ฐ ์ค์ : https://www.corben.io/advanced-cors-techniques/ ๋ฐ https://medium.com/bugbountywriteup/think-outside-the-scope-advanced-cors-exploitation-techniques-dad019c68397
๊ฐ๋ฐ์๋ค์ CORS ์ ์ฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๊ธฐ ์ํด ์์ฒญํ ์ ์๋ ๋๋ฉ์ธ์ ํ์ดํธ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ ๋ฐฉ์ด ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ฌํ ์๋ฐฉ ์กฐ์น์๋ ๋ถ๊ตฌํ๊ณ ์์คํ ์ ๋ณด์์ ์๋ฒฝํ์ง ์์ต๋๋ค. ํ์ดํธ๋ฆฌ์คํธ์ ์๋ ๋๋ฉ์ธ ๋ด์ ๋จ ํ๋์ ์ทจ์ฝํ ์๋ธ๋๋ฉ์ธ์ด ์กด์ฌํ๋ ๊ฒ๋ง์ผ๋ก๋ XSS (๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ )์ ๊ฐ์ ๋ค๋ฅธ ์ทจ์ฝ์ ์ ํตํด CORS ์ ์ฉ์ ๊ธธ์ ์ด ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, requester.com
์ด๋ผ๋ ๋๋ฉ์ธ์ด ๋ค๋ฅธ ๋๋ฉ์ธ provider.com
์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ์ดํธ๋ฆฌ์คํธ์ ์ถ๊ฐ๋ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ญ์์ค. ์๋ฒ ์ธก ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
์ด ์ค์ ์์๋ requester.com
์ ๋ชจ๋ ์๋ธ๋๋ฉ์ธ์ด ์ ๊ทผ์ด ํ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ sub.requester.com
๊ณผ ๊ฐ์ ์๋ธ๋๋ฉ์ธ์ด XSS ์ทจ์ฝ์ ์ผ๋ก ์์๋๋ฉด, ๊ณต๊ฒฉ์๋ ์ด ์ฝ์ ์ ์ด์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, sub.requester.com
์ ์ ๊ทผํ ์ ์๋ ๊ณต๊ฒฉ์๋ XSS ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ CORS ์ ์ฑ
์ ์ฐํํ๊ณ provider.com
์ ๋ฆฌ์์ค์ ์
์์ ์ผ๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
PortSwigger์ URL ๊ฒ์ฆ ์ฐํ ์นํธ ์ํธ๋ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ๊ฐ ๋๋ฉ์ธ ์ด๋ฆ ๋ด์์ ์ด์ํ ๋ฌธ์๋ฅผ ์ง์ํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
Chrome๊ณผ Firefox๋ Origin
ํค๋๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด ๊ตฌํ๋ ์ ๊ท ํํ์์ ์ฐํํ ์ ์๋ ๋ฐ์ค _
๋ฅผ ์ง์ํฉ๋๋ค:
Safari๋ ๋๋ฉ์ธ ์ด๋ฆ์ ํน์ ๋ฌธ์๋ฅผ ํ์ฉํ๋ ๋ฐ ๋์ฑ ๊ด๋ํฉ๋๋ค:
HTTP ํค๋ ์ฃผ์
์ ํตํด ์๋ฒ ์ธก ์บ์ ์ค์ผ์ ์
์ฉํจ์ผ๋ก์จ ์ ์ฅ๋ ๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ
(XSS) ์ทจ์ฝ์ ์ด ์ ๋๋ ์ ์์ต๋๋ค. ์ด ์๋๋ฆฌ์ค๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ถ๋ฒ ๋ฌธ์๋ฅผ ์ํด Origin
ํค๋๋ฅผ ์ ๋ฆฌํ์ง ๋ชปํ ๋ ๋ฐ์ํ๋ฉฐ, ํนํ Internet Explorer ๋ฐ Edge ์ฌ์ฉ์์๊ฒ ์ทจ์ฝ์ ์ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ๋ธ๋ผ์ฐ์ ๋ (0x0d)๋ฅผ ํฉ๋ฒ์ ์ธ HTTP ํค๋ ์ข
๋ฃ์๋ก ์ฒ๋ฆฌํ์ฌ HTTP ํค๋ ์ฃผ์
์ทจ์ฝ์ ์ ์ด๋ํฉ๋๋ค.
Origin
ํค๋๊ฐ ์กฐ์๋ ๋ค์ ์์ฒญ์ ๊ณ ๋ คํ์ญ์์ค:
Internet Explorer์ Edge๋ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ด ํด์ํฉ๋๋ค:
์ด ์ทจ์ฝ์ ์ ์ง์ ์ ์ผ๋ก ์ ์ฉํ๊ธฐ ์ํด ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ชป๋ ํค๋๋ฅผ ์ ์กํ๋ ๊ฒ์ ์คํ ๊ฐ๋ฅํ์ง ์์ง๋ง, Burp Suite์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ์๋ ์์ฒญ์ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์๋ฒ ์ธก ์บ์๊ฐ ์๋ต์ ์ ์ฅํ๊ณ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ฐ์ฐํ ์ ๊ณต๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ์กฐ์๋ ํ์ด๋ก๋๋ ํ์ด์ง์ ๋ฌธ์ ์งํฉ์ UTF-7๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ฉฐ, ์ด๋ ํน์ ๋งฅ๋ฝ์์ ์คํฌ๋ฆฝํธ๋ก ์คํ๋ ์ ์๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉํ ์ ์๊ธฐ ๋๋ฌธ์ XSS ์ทจ์ฝ์ ๊ณผ ์ข ์ข ์ฐ๊ด๋ฉ๋๋ค.
์ ์ฅ๋ XSS ์ทจ์ฝ์ ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ PortSwigger๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ฐธ๊ณ : HTTP ํค๋ ์ฃผ์ ์ทจ์ฝ์ ์ ์ ์ฉ, ํนํ ์๋ฒ ์ธก ์บ์ ์ค์ผ์ ํตํด, ๋ชจ๋ ์ฌ์ฉ์ ์ ๊ณต ์ ๋ ฅ, HTTP ํค๋๋ฅผ ํฌํจํ์ฌ, ๊ฒ์ฆํ๊ณ ์ ํํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง๋ฅผ ๊ฐ์กฐํฉ๋๋ค. ํญ์ ์ด๋ฌํ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๋ ฅ ๊ฒ์ฆ์ ํฌํจํ๋ ๊ฐ๋ ฅํ ๋ณด์ ๋ชจ๋ธ์ ์ฌ์ฉํ์ญ์์ค.
์ด ์๋๋ฆฌ์ค์์๋ ์ ์ ํ ์ธ์ฝ๋ฉ ์์ด ์ฌ์ฉ์ ์ ์ HTTP ํค๋์ ๋ด์ฉ์ ๋ฐ์ํ๋ ์น ํ์ด์ง ์ธ์คํด์ค๊ฐ ๊ด์ฐฐ๋ฉ๋๋ค. ํนํ, ์น ํ์ด์ง๋ X-User-id
ํค๋์ ํฌํจ๋ ๋ด์ฉ์ ๋ฐ์ํ๋ฉฐ, ์ฌ๊ธฐ์๋ ์
์ฑ JavaScript๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ์ด๋ ํค๋์ JavaScript ์ฝ๋๋ฅผ ๋ก๋ํ ๋ ์คํํ๋๋ก ์ค๊ณ๋ SVG ์ด๋ฏธ์ง ํ๊ทธ๊ฐ ํฌํจ๋ ์๋ก ์
์ฆ๋ฉ๋๋ค.
๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) ์ ์ฑ
์ ์ฌ์ฉ์ ์ ์ ํค๋ ์ ์ก์ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ CORS ์ ํ์ผ๋ก ์ธํด ์๋ต์ด ๋ธ๋ผ์ฐ์ ์ ์ํด ์ง์ ๋ ๋๋ง๋์ง ์์ผ๋ฉด, ์ด๋ฌํ ์ฃผ์
์ ์ ์ฉ์ฑ์ ์ ํ์ ์ผ๋ก ๋ณด์ผ ์ ์์ต๋๋ค. ์ค์ํ ์ ์ ๋ธ๋ผ์ฐ์ ์ ์บ์ ๋์์ ๊ณ ๋ คํ ๋ ๋ฐ์ํฉ๋๋ค. Vary: Origin
ํค๋๊ฐ ์ง์ ๋์ง ์์ผ๋ฉด, ์
์ฑ ์๋ต์ด ๋ธ๋ผ์ฐ์ ์ ์ํด ์บ์๋ ์ ์์ต๋๋ค. ์ดํ, ์ด ์บ์๋ ์๋ต์ URL๋ก ํ์ํ ๋ ์ง์ ๋ ๋๋ง๋ ์ ์์ผ๋ฉฐ, ์ด๊ธฐ ์์ฒญ ์ ์ง์ ๋ ๋๋ง์ ํ์์ฑ์ ์ฐํํฉ๋๋ค. ์ด ๋ฉ์ปค๋์ฆ์ ํด๋ผ์ด์ธํธ ์ธก ์บ์ฑ์ ํ์ฉํ์ฌ ๊ณต๊ฒฉ์ ์ ๋ขฐ์ฑ์ ๋์
๋๋ค.
์ด ๊ณต๊ฒฉ์ ์ค๋ช
ํ๊ธฐ ์ํด, ์น ํ์ด์ง ํ๊ฒฝ์์ ์คํ๋๋๋ก ์ค๊ณ๋ JavaScript ์์ ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ๊ฐ๋จํ ์์
์ ์ํํฉ๋๋ค: ์
์ฑ JavaScript๊ฐ ํฌํจ๋ ์ฌ์ฉ์ ์ ์ ํค๋๋ก ์ง์ ๋ URL์ ์์ฒญ์ ๋ณด๋
๋๋ค. ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด, ๋์ URL๋ก ํ์์ ์๋ํ๋ฉฐ, ์๋ต์ด Vary: Origin
ํค๋๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ์ง ์๊ณ ์บ์๋ ๊ฒฝ์ฐ ์ฃผ์
๋ ์คํฌ๋ฆฝํธ์ ์คํ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
์ด ๊ณต๊ฒฉ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ JavaScript์ ์์ฝ๋ ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
XSSI, ๋๋ Cross-Site Script Inclusion์ผ๋ก ์๋ ค์ง ์ด ์ทจ์ฝ์ ์ Same Origin Policy (SOP)๊ฐ script ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ํฌํจํ ๋ ์ ์ฉ๋์ง ์๋ ์ฌ์ค์ ์ด์ฉํ๋ ์ทจ์ฝ์ ์ ๋๋ค. ์ด๋ ์คํฌ๋ฆฝํธ๊ฐ ์๋ก ๋ค๋ฅธ ๋๋ฉ์ธ์์ ํฌํจ๋ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์ทจ์ฝ์ ์ ๊ณต๊ฒฉ์๊ฐ script ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํฌํจ๋ ๋ชจ๋ ์ฝํ ์ธ ์ ์ ๊ทผํ๊ณ ์ฝ์ ์ ์๊ฒ ํฉ๋๋ค.
์ด ์ทจ์ฝ์ ์ ๋์ JavaScript ๋๋ JSONP (Padding์ด ์๋ JSON)์ ๊ด๋ จํ์ฌ ํนํ ์ค์ํด์ง๋ฉฐ, ํนํ ์ฟ ํค์ ๊ฐ์ ํ๊ฒฝ ๊ถํ ์ ๋ณด๊ฐ ์ธ์ฆ์ ์ฌ์ฉ๋ ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๋ค๋ฅธ ํธ์คํธ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋ ์ฟ ํค๊ฐ ํฌํจ๋์ด ๊ณต๊ฒฉ์๊ฐ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด ์ทจ์ฝ์ ์ ๋ ์ ์ดํดํ๊ณ ์ํํ๊ธฐ ์ํด https://github.com/kapytein/jsonp์์ ์ ๊ณตํ๋ BurpSuite ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฌ์ ์ธ XSSI ์ทจ์ฝ์ ์ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์ XSSI์ ๋ค์ํ ์ ํ๊ณผ ์ด๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ์ฝ์ด๋ณด์ธ์.
์์ฒญ์ callback
๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํด ๋ณด์ธ์. ์๋ง๋ ํ์ด์ง๊ฐ ๋ฐ์ดํฐ๋ฅผ JSONP๋ก ์ ์กํ๋๋ก ์ค๋น๋์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ ํ์ด์ง๋ Content-Type: application/javascript
๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์กํ์ฌ CORS ์ ์ฑ
์ ์ฐํํ ๊ฒ์
๋๋ค.
Access-Control-Allow-Origin
์ ํ์ ์ฐํํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฒญ์ ๋์ ํ๋๋ก ์์ฒญํ๊ณ ์๋ต์ ๋ค์ ๋ณด๋ด๋๋ก ํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด ์๋๋ฆฌ์ค์์๋ ์ต์ข
ํผํด์์ ์๊ฒฉ ์ฆ๋ช
์ด ๋ค๋ฅธ ๋๋ฉ์ธ์ ์์ฒญ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ ์ก๋์ง ์์ต๋๋ค.
CORS-escape: ์ด ๋๊ตฌ๋ ์์ฒญ๊ณผ ํจ๊ป ํค๋๋ฅผ ์ ๋ฌํ๋ ํ๋ก์๋ฅผ ์ ๊ณตํ๋ฉฐ, ์์ฒญ๋ ๋๋ฉ์ธ๊ณผ ์ผ์นํ๋๋ก Origin ํค๋๋ฅผ ์คํธํํฉ๋๋ค. ์ด๋ CORS ์ ์ฑ ์ ํจ๊ณผ์ ์ผ๋ก ์ฐํํฉ๋๋ค. XMLHttpRequest์ ํจ๊ป ์ฌ์ฉํ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
simple-cors-escape: ์ด ๋๊ตฌ๋ ์์ฒญ์ ํ๋ก์ํ๋ ๋์ฒด ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์์ฒญ์ ๊ทธ๋๋ก ์ ๋ฌํ๋ ๋์ , ์๋ฒ๊ฐ ์ง์ ๋ ๋งค๊ฐ๋ณ์๋ก ์์ฒด ์์ฒญ์ ์ํํฉ๋๋ค.
e.origin === window.origin
๊ณผ ๊ฐ์ CORS ๊ฒ์ฌ๋ฅผ ์ฐํํ๋ ค๋ฉด iframe์ ์์ฑํ๊ณ ๊ทธ๋ก๋ถํฐ ์ ์ฐฝ์ ์ฌ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ ๋ง์ ์ ๋ณด๋ ๋ค์ ํ์ด์ง์์ ํ์ธํ์ธ์:
TTL์ ํตํ DNS ๋ฆฌ๋ฐ์ธ๋ฉ์ DNS ๋ ์ฝ๋๋ฅผ ์กฐ์ํ์ฌ ํน์ ๋ณด์ ์กฐ์น๋ฅผ ์ฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๋๋ค. ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๊ณต๊ฒฉ์๋ ์น ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ํผํด์๊ฐ ์ด๋ฅผ ์ ๊ทผํ๊ฒ ํฉ๋๋ค.
๊ณต๊ฒฉ์๋ ์์ ์ ๋๋ฉ์ธ์ DNS (IP)๋ฅผ ๋ณ๊ฒฝํ์ฌ ํผํด์์ ์น ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํฉ๋๋ค.
ํผํด์์ ๋ธ๋ผ์ฐ์ ๋ DNS ์๋ต์ ์บ์ํ๋ฉฐ, ์ด๋ DNS ๋ ์ฝ๋๊ฐ ์ ํจํ๋ค๊ณ ๊ฐ์ฃผ๋๋ ๊ธฐ๊ฐ์ ๋ํ๋ด๋ TTL (Time to Live) ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค.
TTL์ด ๋ง๋ฃ๋๋ฉด ํผํด์์ ๋ธ๋ผ์ฐ์ ๋ ์๋ก์ด DNS ์์ฒญ์ ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ํผํด์์ ํ์ด์ง์์ JavaScript ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ํฉ๋๋ค.
ํผํด์์ IP์ ๋ํ ์ ์ด๋ฅผ ์ ์งํจ์ผ๋ก์จ ๊ณต๊ฒฉ์๋ ํผํด์ ์๋ฒ์ ์ฟ ํค๋ฅผ ์ ์กํ์ง ์๊ณ ๋ ํผํด์๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์์งํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์๋ ์ด ๊ธฐ์ ์ ์ฆ๊ฐ์ ์ธ ๋จ์ฉ์ ๋ฐฉ์งํ ์ ์๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ด ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ๋ฎ์ TTL ๊ฐ์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
DNS ๋ฆฌ๋ฐ์ธ๋ฉ์ ํผํด์๊ฐ ์ํํ๋ ๋ช ์์ ์ธ IP ๊ฒ์ฌ๋ฅผ ์ฐํํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ค๋ ์๊ฐ ๋์ ๋์ผํ ํ์ด์ง์ ๋จธ๋ฌด๋ฅด๋ ์๋๋ฆฌ์ค์์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์บ์๊ฐ ๋ง๋ฃ๋ฉ๋๋ค.
DNS ๋ฆฌ๋ฐ์ธ๋ฉ์ ๋จ์ฉํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค๋ฉด https://lock.cmpxchg8b.com/rebinder.html์ ๊ฐ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ์ DNS ๋ฆฌ๋ฐ์ธ๋ฉ ์๋ฒ๋ฅผ ์ด์ํ๋ ค๋ฉด DNSrebinder ๋๊ตฌ(https://github.com/mogwailabs/DNSrebinder)๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋ก์ปฌ ํฌํธ 53/udp๋ฅผ ๋ ธ์ถํ๊ณ , ์ด๋ฅผ ๊ฐ๋ฆฌํค๋ A ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ (์: ns.example.com), ์ด์ ์ ์์ฑ๋ A ์๋ธ๋๋ฉ์ธ์ ๊ฐ๋ฆฌํค๋ NS ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค (์: ns.example.com). ns.example.com ์๋ธ๋๋ฉ์ธ์ ๋ชจ๋ ์๋ธ๋๋ฉ์ธ์ ๊ทํ์ ํธ์คํธ์ ์ํด ํด๊ฒฐ๋ฉ๋๋ค.
๋ ๋ง์ ์ดํด์ ์คํ์ ์ํด http://rebind.it/singularity.html์์ ๊ณต๊ฐ์ ์ผ๋ก ์ด์๋๋ ์๋ฒ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
DNS ์บ์ ํ๋ฌ๋ฉ์ ํตํ DNS ๋ฆฌ๋ฐ์ธ๋ฉ์ ๋ธ๋ผ์ฐ์ ์ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฐํํ๊ณ ๋ ๋ฒ์งธ DNS ์์ฒญ์ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ ๋ค๋ฅธ ๊ธฐ์ ์ ๋๋ค. ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์ฒ์์ ํผํด์๊ฐ DNS ์์ฒญ์ ํ๋ฉด ๊ณต๊ฒฉ์์ IP ์ฃผ์๋ก ์๋ต๋ฉ๋๋ค.
์บ์ฑ ๋ฐฉ์ด๋ฅผ ์ฐํํ๊ธฐ ์ํด ๊ณต๊ฒฉ์๋ ์๋น์ค ์์ปค๋ฅผ ํ์ฉํฉ๋๋ค. ์๋น์ค ์์ปค๋ DNS ์บ์๋ฅผ ํ๋ฌ๋ฉํ์ฌ ์บ์๋ ๊ณต๊ฒฉ์ ์๋ฒ ์ด๋ฆ์ ํจ๊ณผ์ ์ผ๋ก ์ญ์ ํฉ๋๋ค.
ํผํด์์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋ฒ์งธ DNS ์์ฒญ์ ํ ๋, ์ด์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ก์ปฌํธ์คํธ๋ฅผ ๊ฐ๋ฆฌํค๋ IP ์ฃผ์ 127.0.0.1๋ก ์๋ต๋ฉ๋๋ค.
์๋น์ค ์์ปค๋ก DNS ์บ์๋ฅผ ํ๋ฌ๋ฉํจ์ผ๋ก์จ ๊ณต๊ฒฉ์๋ DNS ํด์๋ ํ๋ก์ธ์ค๋ฅผ ์กฐ์ํ๊ณ ํผํด์์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋ฒ์งธ ์์ฒญ์ ํ๋๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ฒ์๋ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ IP ์ฃผ์๋ก ํด๊ฒฐ๋ฉ๋๋ค.
์บ์ฑ ๋ฐฉ์ด๋ฅผ ์ฐํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ DNS ์ ๊ณต์ ์ฒด์์ ๋์ผํ ์๋ธ๋๋ฉ์ธ์ ๋ํด ์ฌ๋ฌ IP ์ฃผ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๊ณต๊ฒฉ์๋ DNS ์ ๊ณต์ ์ฒด์์ ๋์ผํ ์๋ธ๋๋ฉ์ธ์ ๋ํด ๋ ๊ฐ์ A ๋ ์ฝ๋ (๋๋ ๋ ๊ฐ์ IP๊ฐ ์๋ ๋จ์ผ A ๋ ์ฝ๋)๋ฅผ ์ค์ ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฌํ ๋ ์ฝ๋๋ฅผ ํ์ธํ ๋ ๋ ๊ฐ์ IP ์ฃผ์๋ฅผ ๋ฐ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ๊ณต๊ฒฉ์์ IP ์ฃผ์๋ฅผ ๋จผ์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด, ๊ณต๊ฒฉ์๋ ๋์ผํ ๋๋ฉ์ธ์ ๋ํ HTTP ์์ฒญ์ ์ํํ๋ ํ์ด๋ก๋๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ณต๊ฒฉ์๊ฐ ํผํด์์ IP ์ฃผ์๋ฅผ ์ป์ผ๋ฉด ํผํด์์ ๋ธ๋ผ์ฐ์ ์ ๋ํ ์๋ต์ ์ค๋จํฉ๋๋ค.
ํผํด์์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ฉ์ธ์ด ์๋ตํ์ง ์์์ ์ธ์ํ๊ณ ๋ ๋ฒ์งธ๋ก ์ ๊ณต๋ IP ์ฃผ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ ๋ฒ์งธ IP ์ฃผ์์ ์ ๊ทผํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ๋ Same Origin Policy (SOP)๋ฅผ ์ฐํํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์ด๋ฅผ ๋จ์ฉํ๊ณ ์ ๋ณด๋ฅผ ์์งํ๊ณ ์ ์ถํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด ๊ธฐ์ ์ ๋๋ฉ์ธ์ ๋ํด ์ฌ๋ฌ IP ์ฃผ์๊ฐ ์ ๊ณต๋ ๋ ๋ธ๋ผ์ฐ์ ์ ๋์์ ํ์ฉํฉ๋๋ค. ์๋ต์ ์ ๋ต์ ์ผ๋ก ์ ์ดํ๊ณ ๋ธ๋ผ์ฐ์ ์ IP ์ฃผ์ ์ ํ์ ์กฐ์ํจ์ผ๋ก์จ ๊ณต๊ฒฉ์๋ SOP๋ฅผ ์ ์ฉํ๊ณ ํผํด์๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ก์ปฌํธ์คํธ์ ์ ๊ทผํ๋ ค๋ฉด Windows์์๋ 127.0.0.1์ ๋ฆฌ๋ฐ์ธ๋ฉํ๊ณ Linux์์๋ 0.0.0.0์ ์๋ํด์ผ ํฉ๋๋ค. godaddy๋ cloudflare์ ๊ฐ์ ์ ๊ณต์ ์ฒด๋ 0.0.0.0 IP๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ์ง๋ง, AWS route53์ "0.0.0.0" ์ค ํ๋์ธ 2๊ฐ์ IP๋ก A ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ์์ต๋๋ค.
์์ธํ ์ ๋ณด๋ https://unit42.paloaltonetworks.com/dns-rebinding/์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ด๋ถ IP๊ฐ ํ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ, 0.0.0.0์ ๊ธ์งํ๋ ๊ฒ์ ์์์ ์ ์์ต๋๋ค (Linux ๋ฐ Mac์์ ์๋)
๋ด๋ถ IP๊ฐ ํ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ, localhost์ ๋ํ CNAME์ผ๋ก ์๋ตํฉ๋๋ค (Linux ๋ฐ Mac์์ ์๋)
๋ด๋ถ IP๊ฐ DNS ์๋ต์ผ๋ก ํ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ, www.corporate.internal๊ณผ ๊ฐ์ ๋ด๋ถ ์๋น์ค์ ๋ํ CNAME์ผ๋ก ์๋ตํ ์ ์์ต๋๋ค.
์ด์ ์ฐํ ๊ธฐ์ ๋ฐ ๋ค์ ๋๊ตฌ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํ ๋ ๋ง์ ์ ๋ณด๋ Gerald Doussot - State of DNS Rebinding Attacks & Singularity of Origin - DEF CON 27 Conference์์ ํ์ธํ ์ ์์ต๋๋ค.
Singularity of Origin
์ DNS ๋ฆฌ๋ฐ์ธ๋ฉ ๊ณต๊ฒฉ์ ์ํํ๋ ๋๊ตฌ์
๋๋ค. ์ด๋ ๊ณต๊ฒฉ ์๋ฒ DNS ์ด๋ฆ์ IP ์ฃผ์๋ฅผ ๋์ ๋จธ์ ์ IP ์ฃผ์๋ก ๋ฆฌ๋ฐ์ธ๋ฉํ๊ณ , ๋์ ๋จธ์ ์ ์ทจ์ฝํ ์ํํธ์จ์ด๋ฅผ ์
์ฉํ๊ธฐ ์ํ ๊ณต๊ฒฉ ํ์ด๋ก๋๋ฅผ ์ ๊ณตํ๋ ๋ฐ ํ์ํ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํฉ๋๋ค.
๋ด๋ถ ์๋น์ค์์ TLS ์ฌ์ฉ
๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํ ์ธ์ฆ ์์ฒญ
Host ํค๋ ๊ฒ์ฆ
https://wicg.github.io/private-network-access/: ๊ณต์ฉ ์๋ฒ๊ฐ ๋ด๋ถ ์๋ฒ์ ์ ๊ทผํ ๋ ํญ์ ์ฌ์ ์์ฒญ์ ๋ณด๋ด๋๋ก ์ ์
CORS ์ ์ฑ ์ ์๋ชป๋ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ Fuzz
AWS ํดํน์ ๋ฐฐ์ฐ๊ณ ์ฐ์ตํ์ธ์:HackTricks Training AWS Red Team Expert (ARTE) GCP ํดํน์ ๋ฐฐ์ฐ๊ณ ์ฐ์ตํ์ธ์: HackTricks Training GCP Red Team Expert (GRTE)