๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web

[Dreamhack] Web Hacking STAGE 3

STAGE 3. Background: Cookie & Session

 

์ฟ ํ‚ค ๐Ÿช

 

HTTP ํ”„๋กœํ† ์ฝœ ํŠน์ง•

1) Connectionless

: ํ•˜๋‚˜์˜ ์š”์ฒญ์— ํ•˜๋‚˜์˜ ์‘๋‹ต์„ ํ•œ ํ›„ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ

2) Stateless

: ํ†ต์‹ ์ด ๋๋‚œ ํ›„ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

 

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ฐ–๋Š” HTTP์—์„œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค๊ฐ€ ํƒ„์ƒํ•จ.

 

์ฟ ํ‚ค

: Key์™€ Value๋กœ ์ด๋ค„์ง„ ์ผ์ข…์˜ ๋‹จ์œ„๋กœ, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ฟ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์ฟ ํ‚ค๋ฅผ ๊ฐ™์ด ์ „์†กํ•จ. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ํฌํ•จ๋œ ์ฟ ํ‚ค๋ฅผ ํ™•์ธํ•ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ. 

: HTTP์—์„œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” Key-Value ํ˜•ํƒœ์˜ ๊ฐ’

 

์ฟ ํ‚ค์˜ ์šฉ๋„

1) ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด ๊ธฐ๋ก

ex) ์›น ์„œ๋ฒ„๋Š” ๊ฐ ํด๋ผ์ด์–ธํŠธ์˜ ํŒ์—… ์˜ต์…˜์„ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค์— ํ•ด๋‹น ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ํŒ์—… ์ฐฝ ํ‘œ์‹œ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•จ

2) ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ ์ •๋ณด ํ‘œํ˜„

- ์›น ์„œ๋ฒ„์—์„œ๋Š” ์ˆ˜๋งŽ์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ์™€ ์ด์šฉ์ž๋ฅผ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋•Œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ฟ ํ‚ค์— ์ €์žฅํ•ด ์‚ฌ์šฉํ•จ

 

์ฟ ํ‚ค๊ฐ€ ์—†๋Š” ํ†ต์‹ ์˜ ๊ฒฝ์šฐ

 

์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š” ํ†ต์‹ ์˜ ๊ฒฝ์šฐ

 

์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๊ณ  ์š”์ฒญ์— ํฌํ•จ๋˜๋Š” ์ •๋ณด์ž„.

๋”ฐ๋ผ์„œ ์•…์˜์ ์ธ ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ๋ณ€์กฐํ•ด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ.

ex) ๊ณต๊ฒฉ์ž๊ฐ€ ํƒ€ ์ด์šฉ์ž ์‚ฌ์นญํ•ด ์ •๋ณด ํƒˆ์ทจ

 

์„ธ์…˜

: ์ฟ ํ‚ค์— ์ธ์ฆ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋ณ€์กฐํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ.

: ์ธ์ฆ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค(์œ ์ถ”ํ•  ์ˆ˜ ์—†๋Š” ๋žœ๋คํ•œ ๋ฌธ์ž์—ด)๋ฅผ ๋งŒ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•จ. ํ•ด๋‹น ํ‚ค๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ Session ID๋ผ๊ณ  ํ•จ. ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ํ‚ค๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๊ณ  ์ดํ›„์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•จ. ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ํฌํ•จ๋œ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ธ์ฆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•จ.

: ์ฟ ํ‚ค์— ํฌํ•จ๋œ Session ID๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์— ์ €์žฅ๋œ ์„ธ์…˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹

 

์ฟ ํ‚ค vs. ์„ธ์…˜

์ฟ ํ‚ค - ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์ด์šฉ์ž๊ฐ€ ์ €์žฅํ•จ

์„ธ์…˜ - ์„œ๋ฒ„๊ฐ€ ์ €์žฅํ•จ

 

์ฟ ํ‚ค ์ ์šฉ๋ฒ•

์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋จ

-> ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ ์กฐํšŒ, ์ˆ˜์ •, ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ. ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์ง€์ •๋„ ๊ฐ€๋Šฅ. ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์ดํ›„์—๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฟ ํ‚ค๊ฐ€ ์‚ญ์ œ๋จ.

 

์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋‘˜ ๋‹ค ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.

 

์„œ๋ฒ„ - HTTP ์‘๋‹ต ์ค‘ ํ—ค๋”์— ์ฟ ํ‚ค ์„ค์ • ํ—ค๋”(Set-Cookie)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•จ.

HTTP/1.1 200 OK

Server: Apache/2.4.29 (Ubuntu)

Set-Cookie: name=test;

Set-Cookie: age=30; Expires=Fri, 30 Sep 2022 14:54:50

GMT;

...

 

ํด๋ผ์ด์–ธํŠธ - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•จ.

document.cookie = "name=test;"

document.cookie = "age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;"

 

ํฌ๋กฌ Console ํ™œ์šฉ

 

ํฌ๋กฌ Application ํ™œ์šฉ

ํฌ๋กฌ ํŽ˜์ด์ง€์—์„œ ์šฐํด๋ฆญ - ๊ฒ€์‚ฌ - Application ํƒญ - Cookies

 

์—ฐ์Šต: ๋“œ๋ฆผํ•ต ์„ธ์…˜

 

์„ธ์…˜ ํ•˜์ด์žฌํ‚น

: ํƒ€ ์ด์šฉ์ž์˜ ์ฟ ํ‚ค๋ฅผ ํ›”์ณ ์ธ์ฆ ์ •๋ณด๋ฅผ ํš๋“ํ•˜๋Š” ๊ณต๊ฒฉ. ๊ณต๊ฒฉ์ž๊ฐ€ ์ด์šฉ์ž์˜ ์ฟ ํ‚ค๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ์œผ๋ฉด ์„ธ์…˜์— ํ•ด๋‹นํ•˜๋Š” ์ด์šฉ์ž์˜ ์ธ์ฆ ์ƒํƒœ๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ์Œ.


STAGE 3. Exercise: Cookie

 

/

- ์ด์šฉ์ž์˜ username์„ ์ถœ๋ ฅํ•˜๊ณ  ๊ด€๋ฆฌ์ž ๊ณ„์ •์ธ์ง€ ํ™•์ธํ•จ

- ์š”์ฒญ์— ํฌํ•จ๋œ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ์ด์šฉ์ž๋ฅผ ์‹๋ณ„ํ•จ

- ๋งŒ์•ฝ ์ฟ ํ‚ค์— ์กด์žฌํ•˜๋Š” username์ด admin์ผ ๊ฒฝ์šฐ FLAG๋ฅผ ์ถœ๋ ฅํ•จ

 

/login 

- username, password๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ๋กœ๊ทธ์ธํ•จ

- GET : username๊ณผ password๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•จ

- POST : ์ด์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ username๊ณผ password ์ž…๋ ฅ ๊ฐ’์„ users ๋ณ€์ˆซ๊ฐ’๊ณผ ๋น„๊ตํ•จ

 

์ทจ์•ฝ์  ๋ถ„์„

- ์ด์šฉ์ž์˜ ๊ณ„์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” username ๋ณ€์ˆ˜๊ฐ€ ์š”์ฒญ์— ํฌํ•จ๋œ ์ฟ ํ‚ค์— ์˜ํ•ด ๊ฒฐ์ •๋˜์–ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ. ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ํฌํ•จ๋˜๋Š” ์ •๋ณด๋กœ, ์ด์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ. ์„œ๋ฒ„๋Š” ๋ณ„๋‹ค๋ฅธ ๊ฒ€์ฆ ์—†์ด ์ด์šฉ์ž ์š”์ฒญ์— ํฌํ•จ๋œ ์ฟ ํ‚ค๋ฅผ ์‹ ๋ขฐํ•˜๊ณ , ์ด์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฒฉ์ž๋Š” ์ฟ ํ‚ค์— ํƒ€ ๊ณ„์ • ์ •๋ณด๋ฅผ ์‚ฝ์ž…ํ•ด ๊ณ„์ •์„ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์Œ.

 

์ต์Šคํ”Œ๋กœ์ž‡

- ์ฟ ํ‚ค์— ์กด์žฌํ•˜๋Š” username์„ admin ๋ฌธ์ž์—ด๋กœ ์กฐ์ž‘ํ•ด์•ผ ํ•จ. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฟ ํ‚ค์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ • ๊ฐ€๋Šฅํ•จ. username์„ admin์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด FLAG ํš๋“ ๊ฐ€๋Šฅ.

 

>>> Cookie ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด, ์„œ๋ฒ„๊ฐ€ ๊ฒ€์ฆ ์—†์ด ์ฟ ํ‚ค๋ฅผ ์‹ ๋ขฐํ•˜๊ณ  ์ธ์ฆ ์ •๋ณด๋ฅผ ์‹๋ณ„ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Œ. ํ•ด๋‹น ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๊ณ„์ •์˜ ๊ถŒํ•œ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์—ˆ์Œ.

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

 


STAGE 3. cookie

 

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

users = {
    'guest': 'guest',
    'admin': FLAG
}

@app.route('/')
def index():
    username = request.cookies.get('username', None)
    if username:
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            resp.set_cookie('username', username)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

app.run(host='0.0.0.0', port=8000)

admin์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด FLAG๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

users ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ณด๊ณ , username guest, password guest๋กœ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•ด๋ดค๋‹ค.

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ฟ ํ‚ค๋ฅผ ์‚ดํŽด๋ณด๋ฉด,

 

index() ๋ฅผ ๋ณด๋ฉด, username ์„ ์ฟ ํ‚ค ๊ฐ’์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ฟ ํ‚ค ๊ฐ’์„ admin์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค.

์ƒˆ๋กœ๊ณ ์นจํ•œ ๊ฒฐ๊ณผ, ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


STAGE 3. session-basic

 

์ฟ ํ‚ค์™€ ์„ธ์…˜์œผ๋กœ ์ธ์ฆ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

admin ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

users = { #3๊ฐœ์˜ ๊ณ„์ •
    'guest': 'guest',
    'user': 'user1234',
    'admin': FLAG
}

session_storage = {
}


@app.route('/')
def index():
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html')

    return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username] #์ž…๋ ฅ๋ฐ›์€ username์˜ ํŒจ์Šค์›Œ๋“œ๋ฅผ pw์— ์ €์žฅ
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password: #ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ผ์น˜ํ•  ๊ฒฝ์šฐ
            resp = make_response(redirect(url_for('index')) ) #index๋กœ ์‘๋‹ต ๋งŒ๋“ค๊ธฐ
            session_id = os.urandom(32).hex() #๋‚œ์ˆ˜ ์ƒ์„ฑ ํ›„ hex ๊ฐ’์„ session_id์— ์ €์žฅ
            session_storage[session_id] = username #๋กœ๊ทธ์ธํ•œ username์˜ ์„ธ์…˜ ์„ค์ •
            resp.set_cookie('sessionid', session_id) #์ฟ ํ‚ค ์ƒ์„ฑ
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'


@app.route('/admin')
def admin():
    return session_storage


if __name__ == '__main__':
    import os
    session_storage[os.urandom(32).hex()] = 'admin' #admin์˜ ์„ธ์…˜ ์„ค์ •
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

session_storage[session_id]๊ฐ€ admin๊ณผ ๊ฐ™์„ ๋•Œ FLAG ์ถœ๋ ฅ. 

pw == password ์ผ ๋•Œ index

set_cookie() ๋กœ ์ด๋ฆ„์ด session_id ์ด๊ณ  ๊ฐ’์ด ๋ฌธ์ž์—ด session_id ์ธ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑ

@ : ์žฅ์‹์ž(decorator)๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, flask์—์„œ url ์—ฐ๊ฒฐ์— ํ™œ์šฉ๋จ

/admin ์— ์ ‘๊ทผํ•˜๋ฉด session_storage ๋ฅผ ๋ฆฌํ„ดํ•จ

 

guest๋กœ ๋กœ๊ทธ์ธ

 

/admin์œผ๋กœ ์ด๋™

 

user๋กœ ๋กœ๊ทธ์ธ

 

์ฟ ํ‚ค ๊ฐ’์„ ๋ณ€๊ฒฝ

 

์ƒˆ๋กœ๊ณ ์นจ ํ›„, ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

 


 

STAGE 3. Mitigation: Same Origin Policy

 

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ์„œ๋น„์Šค์— ์ ‘์†ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ํ—ค๋”์— ํฌํ•จ์‹œ์ผœ ์š”์ฒญ์„ ๋ณด๋ƒ„

-> ํฌํ„ธ ์‚ฌ์ดํŠธ, SNS์™€ ๊ฐ™์€ ์›น ์„œ๋น„์Šค์— ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธํ•œ ํ›„ ์ผ์ • ๊ธฐ๊ฐ„์€ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์•„๋„ ๋ฐ”๋กœ ์„œ๋น„์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

์•…์˜์ ์ธ ํŽ˜์ด์ง€๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ๊ถŒํ•œ์„ ์ด์šฉํ•ด ๋Œ€์ƒ ์‚ฌ์ดํŠธ์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , HTTP ์‘๋‹ต ์ •๋ณด๋ฅผ ํš๋“ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ -> ์ •๋ณด ์œ ์ถœ๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์œ„ํ˜‘์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๊ฐ€ ๋จ.

๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์•…์˜์ ์ธ ํŽ˜์ด์ง€์—์„œ ์ฝ์„ ์ˆ˜ ์—†๋„๋ก ํ•ด์•ผ ํ•จ.

 

๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ… (Same Origin Policy, SOP) 

: ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜

- Same Origin์ผ ๋•Œ๋งŒ ์ •๋ณด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ

- ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ฒƒ์€ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ•จ

 

ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๊ณต๊ฒฉ

: SOP๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฒฉ

 

์˜ค๋ฆฌ์ง„ ๊ตฌ์„ฑ ์š”์†Œ

1) ํ”„๋กœํ† ์ฝœ (Protocol, Scheme)

2) ํฌํŠธ (Port)

3) ํ˜ธ์ŠคํŠธ (Host)

 

>>> ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผ ๋™์ผํ•œ ์˜ค๋ฆฌ์ง„

ex) https://same-origin.com/ ๊ณผ ๋น„๊ต

https://same-origin.com/frame.html -> Path๋งŒ ๋‹ค๋ฅด๋ฏ€๋กœ Same Origin

https://cross.same-origin.com/frame.html -> Host๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ Cross Origin

 

* window.open()

: ์ƒˆ๋กœ์šด ์ฐฝ์„ ๋„์šฐ๋Š” ํ•จ์ˆ˜

 

* object.location.href

: ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” url ์ฃผ์†Œ๋ฅผ ์ฝ์–ด์˜ค๋Š” ์ฝ”๋“œ

 

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  (Cross Origin Resource Sharing, CORS)

: SOP์˜ ์ œํ•œ์„ ๋ฐ›์ง€ ์•Š๊ณ  Cross Origin์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜

 

์ง์ ‘ ์˜ˆ์ œ ์ฝ”๋“œ๋“ค์„ ๋”ฐ๋ผ์„œ ํƒ€์ดํ•‘ ํ•ด๋ณด๋ฉด์„œ ํ•˜๋‚˜์”ฉ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค๋Š”๋ฐ ํ•˜๋‚˜๋„ ์•ˆ ํ–ˆ์ฃต?ใ…Ž ใ…Ž

'Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Dreamhack] Web Hacking STAGE 5 (CSRF)  (0) 2022.02.07
[Dreamhack] xss-2  (0) 2022.02.06
[Dreamhack] Web Hacking STAGE 4 (XSS)  (0) 2022.01.30
[Dreamhack] Web Hacking STAGE 2  (0) 2022.01.15
[bWAPP] SQL Injection (GET/Search)  (0) 2021.09.16