0. 접속하면 뜨는 화면

1. vuln (xss) page

2. memo

3. flag

4. 작성된 코드 분석
1) 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_xss(param, {"name": "flag", "value": FLAG.strip()}):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
- POST 요청으로 param 값을 전송해야 함
- check_xss(param, {"name": "flag", "value": FLAG.strip()})을 호출하여 XSS가 발생하는지 검사
→ 만약 XSS가 성공하면 good 메시지를 반환함
- check_xss()는 read_url()을 이용해 Selenium을 사용해 봇이 실제로 브라우저에서 XSS 실행 여부를 확인함.
2) check_xss 함수
def check_xss(param, cookie={"name": "name", "value": "value"}):
url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
return read_url(url, cookie)
- param을 /vuln?param=값에 전달하여 XSS가 발생하는지 확인
- 만약 XSS가 성공하면 /flag에서 "good"을 반환함
===> 정리
flag는 /flag 엔드포인트에서 check_xss로 넘겨주는 cookie에 있음
check_xss함수를 보면 사용자가 입력한 param 값을 127.0.0.1:8000 로컬 url에서 /vuln 엔드포인트에 url 주소 자체를 출력해줌. param 값에 자바스크립트 코드를 입력해 cookie 값을 탈취해야함.
/memo 엔드포인트에서 param 값을 memo.html에 렌더링해 사용자에게 보여줌을 알 수 있는데
따라서 memo에 찾고자 하는 플래그를 출력하기 위해 /memo 엔드포인트에 document.cookie 값을 memo에 저장해
이를 location.href의 url 주소로 넘겨주면 memo에서 플래그를 얻을 수 있음
http://127.0.0.1:8000/vuln?param=<script>location.href="/memo?memo="+document.cookie;</script>
입력 시 플래그가 memo에 출력됨
====> 한 줄 정리
플래그는 /flag의 쿠키 안에 있음
XSS(자바스크립트) 코드를 /vuln에 삽입하여 실행 가능
쿠키 값을 /memo에 저장해서 쉽게 볼 수 있음
이제 /memo 페이지를 확인하면 플래그를 얻을 수 있음
5. flag 획득




해결 완👊🏻
'SWUFORCE 워게임👊🏻' 카테고리의 다른 글
| [Webhacking] old - 38 ; web (0) | 2025.05.13 |
|---|---|
| [Dreamhack] web ; xss -1 추가 공부 (0) | 2025.04.08 |
| [Dreamhack] rev ; simple-operation 추가 공부 (1) | 2025.04.01 |
| [Dreamhack] Beginner ; rev ; simple-operation (0) | 2025.04.01 |
| [Dreamhack] level1 ; web ; ctrl-c (0) | 2025.03.25 |