위의 문제를 다음과 같은 과정으로 풀어보았다.
1. 소스코드 다운로드
드림핵 문제 페이지에서 Description > File > Download 를 클릭하고 압축을 풀면 'app2.py'이라는 파이썬 코드를 확인할 수 있다.
2. 코드 분석
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
11~15행에 있는 users를 보면 guest, user, admin 3개의 계정이 있는 것을 확인할 수 있다.
@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"}')
23~32행을 살펴보면, cookie에서 sessionid를 키로 하여 session_id값을 불러내었고, session_storage에서 해당 session_id를 키로 하여 username을 가져오고 있다. 그 username이 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>'
위의 코드를 보면 /login페이지에서 로그인을 할 때 랜덤한 문자열로 session_id를 생성하여 쿠키에 저장하는 것을 볼 수 있다. 인덱스 페이지에서는 이렇게 저장된 쿠키를 이용해 사용자의 username을 식별하고 있으므로 admin의 session_id를 알 수 있다면 admin 계정으로 로그인할 수 있다.
@app.route('/admin')
def admin():
# what is it? Does this page tell you session?
# It is weird... TODO: the developer should add a routine for checking privilege
return session_storage
56~60행을 보면 admin이라는 페이지가 있는 것을 볼 수 있다. 해당 페이지로 들어가본다.
admin 페이지에서 모든 사용자의 session id를 볼 수 있다. 이 중에서 admin계정의 session id을 쿠키에 저장하면 admin 계정으로 로그인될 것이다.
3. 쿠키를 수정하여 admin계정으로 로그인
EditThisCookie라는 프로그램을 이용해 sessionid를 admin의 sessionid로 수정한다. 이제 다시 인덱스 페이지로 가면 플래그를 얻을 수 있다.
'드림핵' 카테고리의 다른 글
[드림핵 워게임] xss-2 (1) | 2022.09.21 |
---|---|
[드림핵 워게임] xss-1 (1) | 2022.09.21 |
[드림핵 워게임] cookie (0) | 2022.09.16 |
[드림핵 워게임] web-misconf-1 (0) | 2022.09.16 |
[드림핵 워게임] devtools-sources (0) | 2022.09.16 |