https://dreamhack.io/wargame/challenges/6
문제
쿠키로 인증 상태를 관리하는 간단한 로그인 서비스입니다.
admin 계정으로 로그인에 성공하면 플래그를 획득할 수 있습니다.플래그 형식은 DH{...} 입니다.
풀이
1. 문제를 다운 받고 app.py 코드를 확인한다
#!/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)
flask로 이루어진 코드를 확인 할 수 있다.
flask 코드를 볼 줄 알아야 그래도 문제를 이해하고 풀 수 있다
2. 취약점 분석
#!/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')
처음 중점적으로 봤던 부분은 users 부분이다.
- admin 뿐만 아니라 guest 라는 user도 있다
- guest라는 user로 로그인하면 guest라는 쿠키를 얻는다
- 하지만 guest라는 계정으로 로그인하면 you are not admin이라는 문구를 띄운다
- admin 계정으로 로그인하면 Hello admin flag is DH{..} 이런식으로 flag 를 띄어주는 것같다
- flag는 ./flag.txt. 파일을 열어서 읽어준다
@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)
- /login 이라는 경로에서 일어나는 http method에 관해서 적혀있다
- cookie가 생성되는 방식에 대해서는 여기서 다시 나와있다 key value로 저장이 되는데 guest로 로그인시 key = username, value = guest 가 되는 것이다.
- 이미 정답을 알지 않았는가??
- 저 코드에 의하면 key=username 이고 value가 username에 따라서 바뀐다면 admin으로 바뀌면 문제가 풀릴 것이다.
- 코드를 보고 문제의 가닥을 잡았으니 진짜 문제를 풀어보자
3. exploit
주어진 웹해킹 사이트에 접속해 검사에서 Network 부분이 나오게 한다
이후에 알고 있는 guest 아이디로 로그인한다
역시 guest로 로그인하면 너는 admin이 아니다 라는 문구와 함께 검사창에 Set-Cookie 가 남는 모습을 확인할 수 있다
Application 부분에서 Key(Name) 부분은 역시 username 으로 Value 부분에는 guest로 나온다 코드에서 본것과 같이 나오는 모습이다 그럼 이제 value 부분을 admin으로 변경 후에 새로고침을 해보자
새로고침을 하니 자동으로 admin 계정으로 로그인이 되고 flag 값을 출력하는 것을 확인 할 수 있다.
FLAG
DH{7952074b69ee388ab45432737f9b0c56}
'Dreamhack' 카테고리의 다른 글
[Dreamhack] xss-1 Write-Up (0) | 2024.03.18 |
---|---|
[Dreamhack] session-basic Write-Up (0) | 2024.03.16 |
[Dreamhack] phpreq Write-Up (2) | 2024.03.15 |
[Dreamhack] ex-req-ex Write-Up (2) | 2024.03.15 |
[Dreamhack] blue-whale Write-Up (3) | 2024.03.15 |