이번 문제는 저번 session-basic 문제와 아주 흡사하므로 이해가 어렵다면 저번 게시글을 참조하면 좋다.
2022.09.01 - [Web hacking] - [Dream Hack] session-basic 풀이
문제 분석
우리는 이전 문제와 같이 웹페이지와 파이썬 파일 하나를 받았다.
웹 페이지를 확인해보자.
역시나 로그인 기능이 포함된 간단한 웹 페이지임을 확인할 수 있다.
app.py 파일을 확인해보자. (불필요한 부분은 생략하였다.)
users = {
'guest': 'guest',
'admin': FLAG
}
우리는 users 를 통하여 어떤 계정이 존재하는 지 확인할 수 있다.
@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')
코드를 보면 username이라는 쿠키 값을 얻어 username 변수에 저장하고 username == "admin"일 시 플래그를 얻을 수 있다.
헷갈릴 수 있으나 쿠키의 키 username과 username 변수는 다르다는 것을 알고 있자.
@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)
문제 풀이의 핵심은 이 로그인 페이지에 존재한다.
간단하게 설명하자면 username과 password를 통해 로그인에 성공하면 해당 username과 똑같은 값을 쿠키로 사용한다는 것이다.
즉 guest 계정으로 로그인에 성공하게 되면 쿠키의 값은 username : guest 가 된다.
결론은 admin 계정의 쿠키는 username : admin 이라는 것이다.
문제 해결
우선 해당 홈페이지에서 guest 계정으로 로그인을 해본다. 위에서 확인했듯이 username = guest / password = guest 이다.
이제 개발자도구 > application 의 쿠키값을 확인해보자.
guest 계정의 쿠키는 guest인 것을 알 수 있다.
이 값을 admin으로 수정하고 새로고침한다.
우리는 쿠키 변조를 통하여 admin 계정을 접속하였으며 플래그를 얻어냈다.
'Wargame' 카테고리의 다른 글
[Dream Hack] xss-2 풀이 (0) | 2022.09.07 |
---|---|
[Dream Hack] xss-1 풀이 (0) | 2022.09.06 |
[Dream Hack] session-basic 풀이 (0) | 2022.09.01 |
[Dream Hack] devtools-sources 풀이 (0) | 2022.09.01 |