관리 메뉴

FU11M00N

[ DreamHack ] xss-1 본문

Web Hacking/DreamHack

[ DreamHack ] xss-1

호IT 2021. 3. 28. 05:03

- 문제 정보

여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
XSS 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.

 

 

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for, session, g
from selenium import webdriver
import urllib
import 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(f'http://127.0.0.1:8000/xss?xss={urllib.parse.quote(url)}')
    except:
        driver.quit()
        return False
    driver.quit()
    return True

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/xss')
def xss():
    xss = request.args.get('xss', '')
    return xss

@app.route('/flag', methods=['GET', 'POST'])
def flag():
    if request.method == 'GET':
        return render_template('flag.html')
    elif request.method == 'POST':
        xss = request.form.get('xss')
        if not read_url(xss, {'name': 'flag', 'value': FLAG}):
            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_text
    text = request.args.get('memo', None)
    if text:
        memo_text += text.replace('<', '&lt;') + '\n'
    return render_template('memo.html', memo=memo_text)

app.run(host='0.0.0.0', port=8000)

 

 

ㅌㄴ

xss 라우트는 아무런 검증없이 리턴을해서 스크립트가 먹힘.

memo라우트는 memo파라미터의 값을 출력함.

flag 라우트에선 URL을 보내면 서버에서 해당 URL에 접속을함.

 

 

flag라우트의 코드를 보면

read_url() 함수를 바로 실행하고 if문으로 드가게되는데 alert("wrong") 스크립트에 안걸리기 위해

read_url() 의 예외처리 문법에 걸리지않고 실행이 되어야함. 

또한 플래그 값을 쿠키로 전송하고있는것도 확인이 가능함.

 

문제를 풀기위해 서버가 해당 URL을 눌렀을때의 쿠키값을 보면 문제를 풀수있을것같음.

 

<script> location.href="/memo?memo="+document.cookie</script>

이렇게 작성해서 서버에 보내면 서버 자신의 쿠키값을 memo페이지에 출력하게됨.

 

 

 

 

이 문제를 엄청 오래풀었다... 처음에 어떻게 푸는지 접근방식을 몰랐어서 당황했었음..

'Web Hacking > DreamHack' 카테고리의 다른 글

[ DreamHack ] image-storage  (0) 2021.03.28
[ DreamHack ] file-download-1  (0) 2021.03.28
[ DreamHack ] pathtraversal  (0) 2021.03.28
[ Dreamhack ] simplesqli  (0) 2021.03.28
[ Dreamhack ] cookie  (0) 2021.03.28
Comments