[1] ๋ฌธ์ ํ์ด
(1) ์น ํ์ด์ง ๋ถ์
cookie ๋ฌธ์ ์ ํ์ด์ง ๊ตฌ์ฑ์ด ๋์ผํ๋ค.
Home ํ์ด์ง์ Aboutํ์ด์ง๋ ์ฐจ์ด๊ฐ ์๋ค.
(About์ ๋๋ฅด๋ฉด URL๋งํฌ ๋ง์ง๋ง์ '#'์ด ๋ถ๋๋ค๋ ์ ๋...?)
Login ํ๋ฉด๊น์ง ๋๊ฐ์๋ค.
์์๋ผ ์ ์๋ ๊ฒ์ด ์์ด์ ๋ฐ๋ก ๋ฌธ์ ํ์ผ์ ๋ถ์ํด๋ณด์๋ค.
(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**]'
users = {
'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]
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>'
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
๋ถ๋ถ์ ๋ณด๊ณ , username๊ณผ password์ ๊ฐ๊ฐ์ ๊ฐ์ ์ ๋ ฅํ์ฌ ๋ก๊ทธ์ธ์ ์๋ํด๋ณด์๋ค.
guest - guest ๋ก ๋ก๊ทธ์ธ์ ์๋ํ ๊ฒฐ๊ณผ / ํ์ด์ง์ ์์ ํ๋ฉด๊ณผ ๊ฐ์ ๋ฌธ๊ตฌ๊ฐ ๋ํ๋ฌ๋ค.
username์ guest์๊ณ ,
sessionid ํญ๋ชฉ์ ์ฟ ํค๊ฐ์ด ์ด๋ค ๊ฐ์ ์ธ์ฝ๋ฉํ ๊ฒ์ฒ๋ผ ๋์ด์์๋ค.
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>'
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
app.py์์ ์ด ๋ถ๋ถ์ ๋ณด๋ฉด, ์์ ๋ชจ๋ฅด๊ฒ ์ผ๋... session_id๊ฐ ์ด๋ ํ ๊ท์น์ ์ํด ๊ฐ์ด ์กฐ์๋์ด ๋ณ์์ ์ ์ฅ๋๋ ๊ฒ์ผ๋ก ๋ณด์๋ค.
์ด ์ด์์ผ๋ก๋ ์์๋ผ ์ ์๋ ๊ฒ ์์ด์ ๊ตฌ๊ธ๋ง์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ฐพ์๋ณด๋,
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>'
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
์ด ์ฝ๋ ๋ถ๋ถ์์ os.urandom(4).hex() ํจ์๋ 4๋ฐ์ดํธ์ ๋ฌด์์ ๋ฐ์ดํธ ๋ฌธ์์ด์ ์์ฑํ๊ณ , ์ด๋ฅผ 16์ง์ ํ์์ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐํํ๋ค. ์ฆ, 8๊ฐ์ 16์ง์ ๋ฌธ์๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ด ์์ฑ๋๋ค. ์ด๋ ๊ฒ ์์ฑ๋ ๋ฌธ์์ด์ ์ธ์ ID๋ก ์ฌ์ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์, ์ธ์ ID๋ฅผ ํค๋ก ํ์ฌ session_storage ๋์ ๋๋ฆฌ์ ์ฌ์ฉ์ ์ด๋ฆ์ ์ ์ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๋น ์ธ์ ID๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ์ฌ์ฉ์์ ์ธ์ ์ ๋ํ๋ด๊ฒ ๋๋ค. (์ธ์ ID๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ฟ ํค๋ก ์ ์ก๋์ด ๋์ค์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ์ธ์ ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.)
๋ฐ๋ผ์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ์ฌ์ฉ์์ ์ธ์ ์ ๋ณด๊ฐ session_storage์ ์ ์ฅ๋๊ณ , ํด๋ผ์ด์ธํธ์๊ฒ๋ ํด๋น ์ธ์ ID๊ฐ ์ธ์ ์ฟ ํค๋ก ์ค์ ๋์ด ๋ฐํ๋๋ค. ์ด๋ฅผ ํตํด ์๋ฒ๋ ์ดํ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋ ํด๋น ์ธ์ ์ ์๋ณํ๊ณ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ ์ ์๋ค.
์ด ์ฝ๋์์๋ ๊ด๋ฆฌ์(admin)์ ์ธ์
ID๋ฅผ 1๋ฐ์ดํธ(์ฆ, 2์๋ฆฌ 16์ง์)์ ๋ฌด์์ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ์๋ค.
ํ์ง๋ง 1๋ฐ์ดํธ๋ก๋ ๊ฐ๋ฅํ ๊ฐ์ด 256๊ฐ์ง๋ฟ์ผ๋ก ๋งค์ฐ ์ ์ ํธ์ด๋ค.
์ฆ, ๊ณต๊ฒฉ์๋ 256๋ฒ ์๋ํ๋ฉด์ ๊ฐ๋ฅํ ๋ชจ๋ ์ธ์ ID๋ฅผ ์ฐพ์ ์ ์๋ค.
์ด๋ ๊ฒ ์ฐพ์ ์ธ์
ID๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๋ฆฌ์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ ์ ์๊ฒ ๋๋ค.
(โญ ๋ฐ๋ผ์ ์ด ์ฝ๋๋ ๋ณด์์ ์ทจ์ฝ์ ์ ๊ฐ์ง๊ณ ์๋ค. ์ธ์
ID๋ ๋งค์ฐ ์์ธก์ด ์ด๋ ต๊ณ ์์ ํ ๊ฐ์ด์ด์ผ ํ๋ค. 1๋ฐ์ดํธ๋ก๋ ์์ ํ ์ธ์
ID๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋ณด์์ ๊ฐํํ๋ ค๋ฉด ๋ ๋ง์ ๋นํธ(๋ฐ์ดํธ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌด์์ํ ๊ฐ์ ์์ฑํด์ผ ํ๋ค.)
burp suite ์ intruder๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๋ฌด์์ ๋์
๊ณต๊ฒฉ์ ์๋ํ ์ ์๋ค๊ณ ํ๋ค.
/index ํ์ด์ง์ ์ ์ํ๋ ํจํท์ ์บก์ฒํ์๋ค.
์๋ ํ์ด๋๋ก๋ผ๋ฉด ์ฟ ํค๊ฐ๋ ๊ฐ์ด ๋์์ผ ํ๋ ๊ฒ ๊ฐ์๋ฐ...
์ ๋๋ ๋์ค์ง ์๋ ๊ฑด์ง ๋ชจ๋ฅด๊ฒ ๋ค.
์์๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํด๋ณด์๋ค.
๊ณต๊ฒฉ์ ์๋ํด๋ณด์๋ค.
์ด๋ ๊ฒ ํ๋ ๊ฒ ๋ง๋ ๊ฒ ๊ฐ๋ค.
๊ธธ์ด๊ฐ ๋ค๋ฅธ ๊ฐ์ ์ฐพ์๋๋ค.
๊ฐ์ ์ ๋ ฅํ์ฌ ํ๋๊ทธ ๊ฐ์ ์ฐพ์๋๋ค.
ํ์ด ์ฑ๊ณต!
[2] ๋๋ ์
์ธ์ ID๊ฐ ๋๋ฌด ์งง๊ณ ์์ธก ๊ฐ๋ฅํ๋ค๋ฉด, ๊ณต๊ฒฉ์๊ฐ ํด๋น ์ธ์ ID๋ฅผ ์ถ์ธกํ์ฌ ๊ด๋ฆฌ์ ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ ์ ์๋ค.
์ธ์ ID๋ ๋งค์ฐ ์์ธก์ด ์ด๋ ค์ฐ๋ฉฐ, ์์ ํ ๋ฌด์์ ๊ฐ์ด์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๋ฐ๋ผ์ ์ ์ ํ ๋ณด์ ์์ค์ ์ ์งํ๊ธฐ ์ํด ๋ ๋ง์ ๋นํธ(๋ฐ์ดํธ)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌด์์ํ ๊ฐ์ ์์ฑํ๋ ๊ฒ์ด ํ์ํ ๊ฒ์ด๋ค.
'SWLUG > CTF ๋ฌธ์ ํ์ด (2)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack/๋๋ฆผํต] php7cmp4re (0) | 2024.04.28 |
---|---|
[Dreamhack/๋๋ฆผํต] Carve Party (0) | 2024.04.01 |
[Dreamhack/๋๋ฆผํต] devtools-sources (0) | 2024.03.30 |
[Dreamhack/๋๋ฆผํต] cookie (0) | 2024.03.23 |
[CTF] SWLUG CTF :: SSRF Exercise_write up (0) | 2023.11.12 |