1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/36
2. ํด๊ฒฐ ๊ณผ์
์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด, verify ๋ถ๋ถ์ ์ฝ๋๊ฐ ์ค์ํด๋ณด์ธ๋ค.
@APP.route('/verify', methods=['GET', 'POST'])
def verify_csp():
global CSP
if request.method == 'POST':
csp = request.form.get('csp')
try:
options = webdriver.ChromeOptions()
for _ in ['headless', 'window-size=1920x1080', 'disable-gpu', 'no-sandbox', 'disable-dev-shm-usage']:
options.add_argument(_)
driver = webdriver.Chrome('/chromedriver', options=options)
driver.implicitly_wait(3)
driver.set_page_load_timeout(3)
driver.get(f'http://localhost:8000/live?csp={quote(csp)}')
try:
a = driver.execute_script('return a()');
except:
a = 'error'
try:
b = driver.execute_script('return b()');
except:
b = 'error'
try:
c = driver.execute_script('return c()');
except Exception as e:
c = 'error'
c = e
try:
d = driver.execute_script('return $(document)');
except:
d = 'error'
if a == 'error' and b == 'error' and c == 'c' and d != 'error':
return FLAG
return f'Try again!, {a}, {b}, {c}, {d}'
except Exception as e:
return f'An error occured!, {e}'
return render_template('verify.html')
csp ์ ์ฑ ์ form์ ์ ๋ ฅ๋ ๊ทธ๋๋ก ์ ํด์ง๋ค.
if๋ฌธ์ ๋ณด๋ฉด, a์ b์์๋ ์๋ฌ(block)๊ฐ ๋ฐ์ํด์ผ ํ๊ณ , c๋ 'c'๊ฐ ๋ฆฌํด๋์ด์ผ ํ๊ณ , d๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์๋๋ค(= document ํ์ฉ).
a,b,c,d๋ ์ฝ๋์์์ ํ์ธํ์ ๋์๋ ์๋์ ๊ฐ๋ค.
a = driver.execute_script('return a()');
b = driver.execute_script('return b()');
c = driver.execute_script('return c()');
d = driver.execute_script('return $(document)');
๋ฌธ์ ํ์ด์ง์ ์ ์ํด Test CSP ํ์ด์ง๋ฅผ ๋ค์ด๊ฐ๋ณด๋, CSP ์ ์ฑ ์ ์ ๋ ฅํ๋ผ๋ form์ด ๋ณด์๋ค.
๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก ๋ณด์ด๋ ๋ด์ฉ๊ณผ ๋์ผํ๊ฒ ์ ๋ ฅํ๋๋ c๋ฅผ ์ ์ธํ๊ณ block๋์๋ค. d๋ ๋ณด์ด์ง ์๋๋ค.
script-src 'unsafe-inline' ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋(e.g. <script>...</script> ํ๊ทธ ๋ด์ ์ฝ๋)์ ์คํ์ ํ์ฉํ๋ ๊ฒ์ด๋ค.
1) script-src '' (์ ์ ํ csp ์ ๋ ฅ X)
f12๋ก ๊ฐ๋ฐ์๋ชจ๋๋ฅผ ์ผ์ ์ฝ์๊ณผ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
์ฝ์์ฐฝ์ ๋ณด๋ฉด ์์๋๋ก, a, b, d, c ์ ์๋ฌ ๋ฉ์์ง์ธ ๊ฒ์ ์ ์ ์๋ค.
์ฐ๋ฆฌ๋ a์ b์์๋ ์๋ฌ(block)๊ฐ ๋ฐ์ํด์ผ ํ๊ณ , c๋ 'c'๊ฐ ๋ฆฌํด๋์ด์ผ ํ๊ณ , d๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์๋๋ค.
์ด๋, b์ c๊ฐ ๋์ผํ๊ฒ nonce๊ฐ์ผ๋ก ์ค์ ์ด ๋์ด ์์ผ๋ฏ๋ก c์ d๊ฐ ๊ฐ์ด ์๋ ์คํฌ๋ฆฝํธ ํด์๊ฐ์ ์ด์ฉํ ์ ์๋ค.
script-src 'sha256-<ํด์๊ฐ> ํํ๋ก ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
script-src 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4='
์ด์ document๋ง allowํ๋ฉด ๋๋ค. ์ฝ์์ฐฝ์ ๋ณด์ด๋ jqeury์ url์ ํ์ฉํ๋๋ก ์ง์ ํด์ค ๊ฒ์ด๋ค.
๋ค์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
script-src 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4=' 'https://code.jquery.com/jquery-3.4.1.slim.min.js'
-> url์ '' ๋ถ์ด๋ฉด ์๋จ (์คํจ)
script-src 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4=' https://code.jquery.com/jquery-3.4.1.slim.min.js
์ฑ๊ณต