728x90
반응형
문제
session-basic(Level 1)
문제파일
#!/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
}
# this is our session storage
session_storage = {
}
@app.route('/')
def index():
session_id = request.cookies.get('sessionid', None)
try:
# get username from session_storage
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:
# you cannot know admin's pw
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(32).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('/admin')
def admin():
# developer's note: review below commented code and uncomment it (TODO)
#session_id = request.cookies.get('sessionid', None)
#username = session_storage[session_id]
#if username != 'admin':
# return render_template('index.html')
return session_storage
if __name__ == '__main__':
import os
# create admin sessionid and save it to our storage
# and also you cannot reveal admin's sesseionid by brute forcing!!! haha
session_storage[os.urandom(32).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
https://dreamhack.io/wargame/challenges/409
풀이전략
@app.route('/')
def index():
session_id = request.cookies.get('sessionid', None)
try:
# get username from session_storage
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"}')
일단 "/"에 접속이 되면, 쿠키로부터 세션 id를 받고, 이 세션 id로 부터 username 을 얻는 걷을 확인할 수 있다. admin을 얻어야하는데, admin 세션 id가 그럼 필요한 것이다.
이 username 은 session_storage 에서 구하는 것 같은데, 이 session_storage를 구하는 곳을 찾아보자
@app.route('/admin')
def admin():
# developer's note: review below commented code and uncomment it (TODO)
#session_id = request.cookies.get('sessionid', None)
#username = session_storage[session_id]
#if username != 'admin':
# return render_template('index.html')
return session_storage
/admin 으로 접속하면 바로 session_storage 가 return 되는 것을 보고, 주소창 맨 뒤에 /admin만 넣으면 admin 세션아이디를 얻을 수 있을 것이다. 그래서 쿠키값에 sessionid 를 admin 세션 아이디로 넣어주면 아마 플래그 값이 나올 것이다.
실행
메인 화면에서 주소창에 /admin을 입력하자
저기로 들어갔더니
바로 admin의 세션 id가 나온다.
저 admin의 세션 id인
1058a25974108ebd3c714274218d2fc80ffda10065ba93b4e001be6ca984cf78
를 복사한 후에, 다시 메인 페이지로 돌아가자.
일단
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
이 사이트의 유저들의 정보이므로, 여기로 접속한 다음에, 쿠키값의 세션 id를 변경해주자.
login창에 들어가서 id부분에 user, pw부분에 user1234를 입력해서 로그인을 해주자
입력을 해주면
이렇게 sessionid부분이 쿠키값에 생기는 데, 이것을 아까 얻었던 값으로 바꿔주자.
세션값을 바꿔주고 새로고침을 누르면
이렇게 플래그 값이 나온다.
플래그 값은
DH{8f3d86d1134c26fedf7c4c3ecd563aae3da98d5c}
이다.
에필로그
아
728x90
반응형
'보안 스터디 > 웹 해킹' 카테고리의 다른 글
[드림핵/워게임] CSRF-1 (웹해킹) (1) | 2024.01.07 |
---|---|
[드림핵/웹해킹] ClientSide: CSRF (1) | 2024.01.06 |
[드림핵/워게임] xss-2 (웹 해킹) (1) | 2024.01.05 |
[드림핵/웹해킹] Mitigation : Same Origin Policy (0) | 2024.01.04 |
[드림핵/워게임] cookie (웹해킹) (1) | 2024.01.02 |