김승현
[Dreamhack : Web] XS-Search 본문
문제
flag는 0~9, abcdef까지의 글자를 사용한 32자리라고 한다.
풀이
접속하면 이렇게 home 메뉴와 search, submit이 있다.
search의 경우 이렇게 쿼리를 입력할 수 있게 되어 있다.
submit의 경우 이렇게 url 입력을 통해 새로운 걸 입력할 수 있는 그런 건 것 같다.
소스코드 분석은 이미 강의에 되어 있기 때문에 넘어가겠다.
search.html
여길 보면 검색해서 해당 결과가 존재한다면 새로운 iframe을 생성하는 걸 볼 수 있는데 이를 이용해서
iframe의 개수를 카운트해서 flag를 도출해낼 수 있을 것 같다.
exploit code
#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for
from selenium.common.exceptions import TimeoutException
from urllib.parse import urlparse
from selenium import webdriver
from hashlib import md5
import urllib
import os
app = Flask(__name__)
app.secret_key = os.urandom(32)
try:
FLAG = open("./flag.txt", "r").read()
except:
FLAG = "[**FLAG**]"
notes = {
(FLAG, True),
("Hello World", False),
("DreamHack", False),
("carpe diem, quam minimum credula postero", False)
}
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(url)
except TimeoutException as e:
driver.quit()
return True
except Exception as e:
driver.quit()
# return str(e)
return False
driver.quit()
return True
@app.route("/")
def index():
return render_template('index.html')
@app.route('/search')
def search():
query = request.args.get('query', None)
if query == None:
return render_template("search.html", query=None, result=None)
for note, private in notes:
if private == True and request.remote_addr != "127.0.0.1" and request.headers.get("HOST") != "127.0.0.1:8000":
continue
if query != "" and query in note:
return render_template("search.html", query=query, result=note)
return render_template("search.html", query=query, result=None)
@app.route("/submit", methods=["GET", "POST"])
def submit():
if request.method == "GET":
return render_template("submit.html")
elif request.method == "POST":
url = request.form.get("url", "")
if not urlparse(url).scheme.startswith("http"):
return '<script>alert("wrong url");history.go(-1);</script>'
if not read_url(url):
return '<script>alert("wrong??");history.go(-1);</script>'
return '<script>alert("good");history.go(-1);</script>'
app.run(host="0.0.0.0", port=8000)
강의의 코드를 그대로 가져왔다.
나는 github에서 내 웹을 만들었기 때문에 index.html로 저장했다.
이렇게 입력하면
dreamhacktools에 flag가 전송된다. 그러나 selenium이 3초제한이 있어서 적당히 바꿔가면서 flag를 출력해야 한다.
secret의 내용을 이런식으로 얻은 부분까지 고치면 시간이 짧아진다.
'Web > Dreamhack : Web' 카테고리의 다른 글
[Dreamhack : Web] DOM XSS (0) | 2023.03.04 |
---|---|
[Dreamhack : Web] Relative Path Overwrite advanced (0) | 2023.03.04 |
[Dreamhack : Web] Relative Path Overwrite (0) | 2023.03.04 |
[Dreamhack : Web] CSS Injection (0) | 2023.03.03 |
[Dreamhack : Web] Client Side Template Injection (0) | 2023.03.03 |