문제
https://dreamhack.io/wargame/challenges/36/
풀이
1. 코드 분석
1) /verify 페이지에서 if문의 조건을 만족하면 flag를 얻을 수 있다.
2) if문을 만족해야한다.
@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')
/live?csp=값 을 넣어주면 csp.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
2. 문제 풀이
test 페이지에 script-src ‘unsafe-inline’을 입력하면 아래 그림과 같이 뜬다.
코드대로 역시 a, b는 차단하고 c, d는 허용해줘야 flag를 얻을 수 있다.
/이번엔 script-src ‘none’을 입력하면 콘솔창에서 아래와 같이 볼 수 있다.
(script-src ‘해시값’ 을 각각 입력해보면 a, b, c를 구분 할 수 있음)
d는 https://code.~.js파일 인것을 알수 있다.
/verify 페이지에 가서 script-src ‘c해시값’ ‘d(js파일)’ 을 입력하여 두개를 허용해준다.
'Wargame > Web' 카테고리의 다른 글
[Dreamhack] login-1 (0) | 2023.06.20 |
---|---|
[Dreamhack] sql injection bypass WAF (0) | 2023.05.24 |
[Dreamhack] session (0) | 2022.07.04 |
[Dreamhack] File Vulnerability Advanced for linux (0) | 2022.06.23 |
[Dreamhack] CSRF Advanced (0) | 2022.06.22 |
댓글