dreamhack.io - file-csp-1
2021. 8. 24. 15:39ㆍWeb
제공된 app.py의 코드는 아래와 같습니다.
#!/usr/bin/env python3
import os
import shutil
from time import sleep
from urllib.parse import quote
from flask import Flask, request, render_template, redirect, make_response
from selenium import webdriver
#from flag import FLAG
APP = Flask(__name__)
@APP.route('/')
def index():
return render_template('index.html')
@APP.route('/test', methods=['GET', 'POST'])
def test_csp():
global CSP
if request.method == 'POST':
csp = request.form.get('csp')
# start bot..
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('check.html')
@APP.route('/live', methods=['GET'])
def live_csp():
csp = request.args.get('csp', '')
resp = make_response(render_template('csp.html'))
resp.headers.set('Content-Security-Policy', csp)
return resp
if __name__ == '__main__':
APP.run(host='0.0.0.0', port=8000, debug=True, threaded=True)
아래와 같은 경우에 FLAG를 획득할 수 있으니
if a == 'error' and b == 'error' and c == 'c' and d != 'error':
return FLAG
a와b를 벤해주고, c와d를 허용해주면 될 것 같습니다.
test페이지에 hint로 표시되어있던
script-src 'unsafe-inline'
구문을 넣게 되면
a: block me!
b: block me!
c: allow me!
위와 같은 text를 얻을 수 있고,
console에 에러가 난 부분을 따라가 보면
<!doctype html>
<html>
<head>
<!-- block me -->
<script>
function a() { return 'a'; }
document.write('a: block me!<br>');
</script>
<!-- block me -->
<script nonce="i_am_super_random">
function b() { return 'b'; }
document.write('b: block me!<br>');
</script>
<!-- allow me -->
<script
src="https://code.jquery.com/jquery-3.4.1.slim.min.js"
integrity="sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8="
crossorigin="anonymous"></script>
<!-- allow me -->
<script nonce="i_am_super_random">
function c() { return 'c'; }
document.write('c: allow me!<br>');
try { $(document); document.write('jquery: allow me!<br>'); } catch (e) { }
</script>
</head>
</html>
위와 같은 코드를 볼 수 있습니다.
csp.html에 있는 코드인데, d는
https://code.jquery.com/jquery-3.4.1.slim.min.js
을 허용해주면 될 것 같고,
c는 c자체를 허용해 줘야할 것 같습니다.
존재하는 값들의 dafult값을 찾기 위해
해당 사이트에 있는
script-src deafult-src
명령어를 test_page에 넣으니,
4개의 오류 로그를 모두 얻을 수 잇었고, hash값또한 얻을 수있었습니다.
a의 hash
'sha256-P9oV1Sc7O1Di7wEu1Q0fc9Jb2+DopNb6840c7E5XuNY='
b의 hash
'sha256-Pl2V1+QPNtARvuHPfLjHPFJ5rA0Ky2MhOJ8KD2Y0zN8='
c의 hash
'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4='
j-query 값
'https://code.jquery.com/jquery-3.4.1.slim.min.js'
따라서 아래와 같이 CSP를 허용해 줄 수 있을 것이고,
script-src 'self 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4=' [https://code.jquery.com/jquery-3.4.1.slim.min.js](https://code.jquery.com/jquery-3.4.1.slim.min.js)
이를 verify에 입력하게 되면 flag획득이 가능합니다.
'Web' 카테고리의 다른 글
dreamhack.io - baby-sqlite (0) | 2021.09.04 |
---|---|
dreamhack.io - web-HTTP-CLI (0) | 2021.09.02 |
dreamhack.io - mongoboard (0) | 2021.08.23 |
Dreamhack - funjs (0) | 2021.08.19 |
dreamhack.io - PATCH-1 (0) | 2021.08.08 |