<문제>
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
CSRF 취약점을 이용해 플래그를 획득하세요.
@app.route("/")
def index():
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html', text='please login')
return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not an admin"}')
flag를 얻으려면 username을 admin으로 만들어야 한다.
@app.route("/flag", methods=["GET", "POST"])
def flag():
if request.method == "GET":
return render_template("flag.html")
elif request.method == "POST":
param = request.form.get("param", "")
session_id = os.urandom(16).hex()
session_storage[session_id] = 'admin'
if not check_csrf(param, {"name":"sessionid", "value": session_id}):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
flag링크에 특이한 부분이 있는데 session_storage[session_id] = 'admin'이 있다.
이 session_id를 담아서 read_url 함수가 실행되면 cookie에 추가가 된다.
@app.route("/change_password")
def change_password():
pw = request.args.get("pw", "")
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html', text='please login')
users[username] = pw
return 'Done'
이를 이용해서 flag 링크로 change_password 링크로 접속하면 session_storage[session_id]가 admin이 되고
username이 admin이 된다. 따라서 admin 계정의 password를 마음대로 바꿀 수 있다.
<img src="/change_password?pw=admin" /> 를 flag 링크에서 넣어주면
admin계정의 password가 admin이 된다.
바꾼 비밀번호로 로그인을 하면
이렇게 flag가 나온다.
'웹해킹' 카테고리의 다른 글
드림핵 simple_sqli 롸업 (0) | 2023.11.04 |
---|---|
SQL Injection (0) | 2023.11.04 |
드림핵 csrf-1 롸업 (0) | 2023.11.03 |
ClientSide: CSRF (0) | 2023.11.03 |
드림핵 xss-2 롸업 (0) | 2023.11.03 |