(문제)
csrf로 플래그를 받자!
(핵심 코드)
@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
@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"
첫 번째 코드를 보면 XSS 공격을 완화하기 위해 “frame”, “script” 및 “on”이 필터링됩니다.
두 번째 코드는 두 가지 조건(request ip, userid)을 만족해야 메모에 쓰여진 플래그를 볼 수 있습니다. 그렇다면 /admin/notice_flag를 통해 Memo의 플래그를 가져와야 함을 의미합니다.
이제 문제의 측면을 보자
xss와 유사한 구성이지만 약간 다릅니다. 공지 플래그가 추가되었고 vuln(csrf) 페이지가 조금 변경되었습니다.
실행 결과를 보여주세요! 그러나 단어가 필터링되기 때문에 제대로 작동하지 않습니다.
그렇다면 강의에서 배운 다른 스크립트를 사용해 봅시다.
<img src="http://psh0036.m/alert(1)">
alert() 메시지는 뜨지 않지만 임의의 이미지를 볼 수 있습니다. 잘됩니다.
그렇다면 플래그의 적절한 스크립트를 사용하여 플래그를 얻습니다.
<img src="http://psh0036.admin/notice_flag?userid=admin" />
얼마나 성공적인 모습입니까!