๐๏ธ Session ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด
1. ๋ฌธ์ ์ ๋ํ ์ค๋ช ์ ์ฝ์ ํ ๋ฌธ์ ํ์ผ ๋ค์ด๋ก๋
2. ๋ค์ด๋ฐ์ app.py ํ์ผ ์คํ ํ ์ฝ๋ ๋ถ์
#!/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**]'
์ฝ๋ | ์ค๋ช |
from flask import Flask, request, render_template, make_response, redirect, url_for |
์น ์๋ฒ ์์ฑ, ์์ฒญ ์ฒ๋ฆฌ, ํ
ํ๋ฆฟ ๋ ๋๋ง ๋ฑ์ ํ์ํ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ |
app = Flask(__name__) | Flask ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ |
FLAG = open('./flag.txt', 'r').read() | ํ์ผ์ ์ด์ด FLAG ๊ฐ ์ฝ์ด์ค๊ธฐ |
except | ํ์ผ์ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ธ FLAG ์ฌ์ฉ |
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
session_storage = {
}
์ฝ๋ | ์ค๋ช |
users = {...} | ์ฌ์ฉ์๋ช ๊ณผ ํจ์ค์๋ ์ ๋ณด๋ฅผ ๋์ ๋๋ฆฌ๋ก ์ ์ฅ |
session_storage = {...} | ์ฌ์ฉ์ ์ธ์
์ ๋ณด๋ฅผ ๋์
๋๋ฆฌ๋ก ์ ์ฅํ๊ณ , ์ธ์
ID์ ์ฌ์ฉ์๋ช ์ ๋งคํํ์ฌ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์ ์ถ์ |
@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('/') | ์น ์ดํ๋ฆฌ์ผ์ด์ ์ Root ๊ฒฝ๋ก์ ๋ํ ํธ๋ค๋ฌ ์ ์ |
index() | ์ธ๋ฑ์ค ํ์ด์ง ๋ฐํ ํจ์ (๋ก๊ทธ์ธ๋ ์ฌ์ฉ์๊ฐ ๊ด๋ฆฌ์์ธ ๊ฒฝ์ฐ FLAG ํ์) |
@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')) )
session_id = os.urandom(4).hex()
session_storage[session_id] = username
resp.set_cookie('sessionid', session_id)
return resp
return '<script>alert("wrong password");history.go(-1);</script>'
์ฝ๋ | ์ค๋ช |
@app.route('/login', methods=['GET', 'POST']) | ๋ก๊ทธ์ธ ๊ฒฝ๋ก์ ๋ํ ํธ๋ค๋ฌ ์ ์ A) GET ๋ฐฉ์ ์์ฒญ --> Login ํ์ด์ง ๋ ๋๋ง B) POST ๋ฐฉ์ ์์ฒญ --> ์ฌ์ฉ์ ์ธ์ฆ ์ฒ๋ฆฌ |
login() | ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ํจ์ (๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ธ์ ์์ฑ ๋ฐ index ํ์ด์ง๋ก ์ฌ์ฐ๊ฒฐ) |
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
์ฝ๋ | ์ค๋ช |
if __name__ == '__main__': | ์คํฌ๋ฆฝํธ๊ฐ ์ง์ ์คํ๋๋ ๊ฒฝ์ฐ, ํ๋จ์ ์ฝ๋ ์คํ |
session_storage[os.urandom(1).hex()] = 'admin' | ์ด๊ธฐ ๊ด๋ฆฌ์ ์ธ์
์ค์ ์ ์ํด Session ์ ์ฅ์์ admin ์ฌ์ฉ์ ์ถ๊ฐ |
app.run(host='0.0.0.0', port=8000) | ์น ์๋ฒ ์คํ |
3. ๋ค์ ๋ฌธ์ ํ์ด์ง๋ก ๋์์ ์๋ฒ ์์ฑ
4. ๋ฒํ ์ค์ํธ(Burp Suite)๋ฅผ ์คํํ ํ, ์์ฑ๋ ๋งํฌ๋ฅผ ๋ธ๋ผ์ฐ์ ๋ก ์ด๊ธฐ
++ Burp Suite ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํ ์น ํ์ด์ง ์ ์
--> https://alim11.tistory.com/203
5. Login ํ์ด์ง๋ก ์ด๋ํ ํ, ์๋์ ๊ฐ์ด ์ ๋ ฅํ์ฌ guest๋ก ๋ก๊ทธ์ธ
6. ๋ค์ ๋ฒํ ์ค์ํธ(Burp Suite)๋ก ๋์์, ์ต์๋จ์ History ํด๋ฆญ
7. ๋ง์ฐ์ค ์ฐ์ธก ๋ฒํผ์ ๋๋ฅด๊ณ , Send to Intruder ํด๋ฆญ
8. ์๋จ์ Intruder ํญ์ผ๋ก ์ด๋ ํ, Positions & Payloads ๋ฅผ ์๋์ ๊ฐ์ด ์ค์
๊ณต๊ฒฉ ํ์์ Sniper
๊ณต๊ฒฉํ Target ํ์ธ
(ํ๊น์ ์ด์ ์ ์์ฑํ ๋งํฌ์ ๋์ผํด์ผ ํจ)
Payload set๋ 1, ํ์ ์ Brute forcer
Character set ์ a ~ e & 1 ~ 9
+
Min & Max length๋ ๋ชจ๋ 2 ๋ก ์ค์
9. Start Attack ํด๋ฆญ ํ, ๊ธธ์ด๊ฐ ๋ค๋ฅธ ํจํท์ด ๋ํ๋ ๋๊น์ง ๋๊ธฐ
10. ๊ธธ์ด๊ฐ ๋ค๋ฅธ 97๋ฒ ํจํท์ Sesson ID ํ์ธ
97๋ฒ ํจํท์ Sesson ID๋ a0
11. ๋ค์ ์์ฑํ ๋งํฌ๋ก ๋์์ ๊ฐ๋ฐ์ ๋๊ตฌ ์คํ
12. ๊ฐ๋ฐ์ ๋๊ตฌ์ Applicaton ํญ์ผ๋ก ์ด๋ ํ Sesson Storage ํด๋ฆญ
13. guest ์ Session ID๋ฅผ 10๋ฒ์์ ์ฐพ์ ID๋ก ๋ณ๊ฒฝ
14. ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ๋ซ๊ณ ํ์ด์ง ์๋ก๊ณ ์นจ --> FLAG๊ฐ ์ถ๋ ฅ๋จ์ ํ์ธ