입력하다
요즘 흥미로운 문제를 발견하고 해결하려고 노력하고 있습니다.
wargame
이란 모의해킹 문제를 제공한 사이트인데 이 사이트가 폐쇄되어 현재 폐쇄중입니다.
꿈 해킹 이란은 문제를 제시합니다.
처음 입사했을 때 초급 문제를 추천해 주셨는데 사실 1단계는 웹 개발 능력만 있으면 누구나 풀 수 있는 간단한 문제인 것 같습니다.
저는 보안에 대해 공부하거나 일하는 사람은 아니지만, 제가 어떤 취약점을 가질 수 있는지 보여주는 문제가 많기 때문에 문제 해결을 즐깁니다.
쿠키
쿠키,
인터넷 이용자가 특정 웹 사이트에 방문했을 때 이용자의 웹 브라우저를 통하여 인터넷 이용자의 컴퓨터나 다른 기기에 설치되는 작은 정보 파일을 말합니다.
(위키피디아)
Dreamhack에서 제공하는 연결 VM에 들어가면 이렇게 간단한 웹이 보입니다.
우리가 찾아야 할 것은 관리자 비밀번호뿐입니다.
#!
/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)
웹용 app.py
제안
users
에게 guest
사용자에 대한 액세스 정보가 제공됩니다.login()
코드 로그인 성공 시 set_cookie('username', username)
쿠키가 저장되고 있음을 코드에서 알 수 있습니다.
개발자 도구 쿠키에서 username
, guest
쿠키를 확인할 수 있습니다.
username
두번째 admin
로 바꾸자
쿠키만으로 관리자 플래그를 성공적으로 하이재킹했습니다.
세션 기본
회의,
세션은 웹 사이트의 여러 페이지에서 사용되는 사용자 정보를 저장하는 방법입니다.
사용자가 서버와의 연결을 종료하기 위해 브라우저를 닫는 지점을 세션이라고 합니다.
(TCP 학교)
쿠키 문제와 마찬가지로 동일한 웹사이트로 보이는 곳에 액세스할 수 있습니다.
문제에서 제공하는 코드는 다음과 같습니다.
#!
/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)
조금 길지만 코드를 보면
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
이와 같이 guest
, user
계정 정보의.
guest
사용자로 로그인합시다.
주어진 코드에 따라 sessionId
값이 쿠키에 저장되어 있음을 알 수 있습니다.
여기서 다시 코드를 따라가면 /admin
이라는 부분을 발견하게 됩니다.
@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
코드는 간단하다 session_storage
반환
이 페이지로 이동하면 세션 정보가 표시되는 것 같습니다.
짜잔 관리자 sessionId
값을 찾을 수 있습니다.
쿠키의 값을 변경
관리자의 쿠키 값 sessionId
홈으로 변경하고 업데이트하면 이렇게 플래그가 뜹니다!