1 - 0 - 9. Mitigation : Same Origin Policy ( SOP ) + Cross Origin Resource Sharing ( CORS ) + JSON with Padding ( JSONP )
# ๋์ผ ์ถ์ฒ ์ ์ฑ ( = Same Origin Policy ( SOP ) )
: ํ ํ์ด์ง๊ฐ ์๋ ํ ์ถ์ฒ์์ ์จ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ด์ง ๋ชปํ๊ฒ ํ๋ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ๋ฉ์ปค๋์ฆ
+ mitigation์ด๋?
: '์ํ, ๊ฒฝ๊ฐ' ์ด๋ผ๋ ์๋ฏธ๋ฅผ ์ง๋
- ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ์ค๋ฆฌ์ง(origin) ๊ตฌ๋ถ๋ฒ
origin์ ๊ตฌ์ฑ ์์ | ||
ํ๋กํ ์ฝ(protocol, scheme) | ํธ์คํธ(host) | ํฌํธ(port) |
+ ์ ๊ตฌ์ฑ ์์๊ฐ ๋ชจ๋ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ๋์ผํ ์ค๋ฆฌ์ง์ด๋ผ๊ณ ์นญํ๋ค.
ex 1) https://same-origin.com/๊ณผ ๋์ผํ ์ค๋ฆฌ์ง์ธ https://same-origin.com/frame.html
--> path ๋ง ๋ค๋ฅด๊ธฐ์ ๋์ผํ ์ค๋ฆฌ์ง( Same Origin )
ex 2) https://same-origin.com/๊ณผ ๋์ผํ ์ค๋ฆฌ์ง์ด ์๋ http://same-origin.com/frame.html
--> Scheme ์ด ๋ฌ๋ผ Cross Origin
ex 3) https://same-origin.com/๊ณผ ๋์ผํ ์ค๋ฆฌ์ง์ด ์๋ https://cross.same-origin.com/frame.html
--> Host ๊ฐ ๋ฌ๋ผ์ Cross Origin
ex 4) https://same-origin.com/๊ณผ ๋์ผํ ์ค๋ฆฌ์ง์ด ์๋ https://same-origin.com:1234/
--> Port๊ฐ ๋ฌ๋ผ์ Cross Origin
- SOP ์ค์ต
1. ์ค์ต ๋ชจ๋ ์ฝ๋ ๋ถ์
<!-- iframe ๊ฐ์ฒด ์์ฑ -->
<iframe src="" id="my-frame"></iframe>
<!-- Javascript ์์ -->
<script>
/* 2๋ฒ์งธ ์ค์ iframe ๊ฐ์ฒด๋ฅผ myFrame ๋ณ์์ ๊ฐ์ ธ์ต๋๋ค. */
let myFrame = document.getElementById('my-frame')
/* iframe ๊ฐ์ฒด์ ์ฃผ์๊ฐ ๋ก๋๋๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. */
myFrame.onload = () => {
/* try ... catch ๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง ์
๋๋ค. */
try {
/* ๋ก๋๊ฐ ์๋ฃ๋๋ฉด, secret-element ๊ฐ์ฒด์ ๋ด์ฉ์ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค. */
let secretValue = myFrame.contentWindow.document.getElementById('secret-element').innerText;
console.log({ secretValue });
} catch(error) {
/* ์ค๋ฅ ๋ฐ์์ ์ฝ์์ ์ค๋ฅ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. */
console.log({ error });
}
}
/* iframe๊ฐ์ฒด์ Same Origin, Cross Origin ์ฃผ์๋ฅผ ๋ก๋ํ๋ ํจ์ ์
๋๋ค. */
const loadSameOrigin = () => { myFrame.src = 'https://same-origin.com/frame.html'; }
const loadCrossOrigin = () => { myFrame.src = 'https://cross-origin.com/frame.html'; }
</script>
<!--
๋ฒํผ 2๊ฐ ์์ฑ (Same Origin ๋ฒํผ, Cross Origin ๋ฒํผ)
-->
<button onclick=loadSameOrigin()>Same Origin</button><br>
<button onclick=loadCrossOrigin()>Cross Origin</button>
<!--
frame.html์ ์ฝ๋๊ฐ ์๋์ ๊ฐ์ต๋๋ค.
secret-element๋ผ๋ id๋ฅผ ๊ฐ์ง div ๊ฐ์ฒด ์์ treasure๋ผ๊ณ ํ๋ ๋น๋ฐ ๊ฐ์ ๋ฃ์ด๋์์ต๋๋ค.
-->
<div id="secret-element">treasure</div>
+ << Line 2 >>
: iframe ์ ์ฌ์ฉํ์ฌ ์นํ์ด์ง ์์ ๋ค๋ฅธ ์นํ์ด์ง๋ฅผ ์ฝ์ ํ๋ HTML ํ๊ทธ๋ฅผ ๊ตฌํ
: src ์์๋ก ์ฝ์ ๋๋ ์น ํ์ด์ง ์ฃผ์ ์ค์
+ << Line 10 >>
: ์ด๋ฒคํธ ํธ๋ค๋ฌ onload๋ฅผ ํตํด ๊ฐ์ฒด ๋ก๋ ์ฑ๊ณต ์์ ๋์ํ๋๋ก ํจ
+ << Line 10 ~ 23 >>
: iframe ๊ฐ์ฒด์ ํ์ด์ง ๋ก๋ ์ ๋์ํ๋ ์ฝ๋
+ << Line 14 ~ 15 >>
: ํ์ด์ง ๋ก๋ ์๋ฃ ์ secret-element ๊ฐ์ฒด์ ๊ฐ์ธ tresure์ ์ฝ์ด์ ์ฝ์์ ์ถ๋ ฅํ๋ ์ฝ๋
2. ์ค์ต ํญ์ ํตํด ์ฝ๋ ์ ์ ๋์ ์ฌ๋ถ ์ค์ต
# ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ ( = Cross Origin Resource Sharing ( CORS ) )
: SOP์ ์ ํ์ ๋ฐ์ง ์๊ณ Cross Origin์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก, HTTP ํค๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ Cross Origin ๊ฐ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ
- CORS ๋์ ์์
1. ๋ฐ์ ์ ์ธก์์ CORS ํค๋ ์ค์ ํ ์์ฒญ
+ CORS preflight
: ์์ ์ธก์ ์น ๋ฆฌ์์ค ์์ฒญ ๊ฐ๋ฅ ์ฌ๋ถ ์ง์ํ๋ ๊ณผ์
2. ์์ ์ธก์์ ํค๋๋ฅผ ๊ตฌ๋ถํ๋ ์์ ์ํ
3. ๊ตฌ๋ถ ํ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์๊ฒ ์ค์
Access-Control- Allow-Origin |
Access-Control- Allow-Methods |
Access-Control- Allow-Credentials |
Access-Control- Allow-Headers |
ํค๋ ๊ฐ์ ํด๋นํ๋ Origin์์ ๋ค์ด์ค๋ ์์ฒญ๋ง ์ฒ๋ฆฌํ๋ ํค๋ |
ํค๋ ๊ฐ์ ํด๋นํ๋ ๋ฉ์๋์ ์์ฒญ๋ง ์ฒ๋ฆฌํ๋ ํค๋ | ์ฟ ํค์ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ํค๋ |
ํค๋ ๊ฐ์ ํด๋นํ๋ ํค๋์ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ํ์ํ๋ ํค๋ |
4. ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ์ธก์ ์๋ต๊ณผ ๋ฐ์ ์ธก์ ์์ฒญ์ ์์ ์ฌ๋ถ ํ์ธ
5. ์์ํจ์ด ํ์ธ๋ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ์์ POST ์์ฒญ์ ๋ณด๋ด ์์ ์ธก์ ์น ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ HTTP ์์ฒญ ์ ์ก
# JSON with Padding ( JSONP )
: CORS์ ๋์ฒด๋ฒ ์ค ํ๋๋ก, <script> ํ๊ทธ๋ก Cross origin์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ Callback ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ ํน์ง์ด ์๋ค.
ex)
+ << Line 13 >>
: Cross origin์ ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ ์ฝ๋
: ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ ๋ callback ํ๋ผ๋ฏธํฐ๋ฅผ ์ด์ฉํ์ฌ myCallback ๋ ํจ๊ป ์ ๋ฌ
'โ๏ธ Web Hacking > Dreamhack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] XSS-1 ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.09.21 |
---|---|
[Dreamhack] ClientSide : Cross Site Scripting (XSS) + Stored XSS + Reflected XSS (0) | 2022.09.21 |
[Dreamhack] Web - Misconf - 1 ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.09.18 |
[Dreamhack] Cookie ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.09.17 |
[Dreamhack] Session - Basic ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.09.17 |