학습 기록일지
Dreamhack - file-csp-1 본문
드림핵 웹 3레벨 문제
문제를 풀때는 할만했는데 정리하려고 할때마다 머리가 따뜻해지는거같음
CSP를 다루며 관한 자세한 설명은 아래 링크 참고
https://krampus.tistory.com/96
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#!/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)
|
cs |
위에는 문제의 소스코드이다.
python flask를 통해 웹서버를 열어줌.
소스코드의 a,b,c,d 에서 조건을 맞추어 각각 error, error, c, true 를 출력하는 것이 목표이다.
62째 라인을 보면 입력받는 값을 CSP 인자로 사용한다는것을 알수있다.
위 분석했던 a,b,c,d 스크립트를 각각 CSP 설정을 조작하여 우회하면 된다.
csp.html 소스에선 3, 4번째 스크립트를 허용해줘야 하므로 설정을 알아보자
각각 CSP를 테스트해볼수 있는 화면과 flag를 얻는 화면이 존재한다.
테스트창에 default-src 'none' 입력시 웹 개발자 도구에서 다음과 같은 에러 확인가능.
이 에러메시지를 통해, a(), b(), c() 함수의 sha256 해시 변환값을 얻을 수 있었다.
a : sha256-P9oV1Sc7O1Di7wEu1Q0fc9Jb2+DopNb6840c7E5XuNY=
b : sha256-Pl2V1+QPNtARvuHPfLjHPFJ5rA0Ky2MhOJ8KD2Y0zN8=
c : sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4=
(혹은 https://report-uri.com/home/hash 이 사이트에서 스크립트를 해시로 변환 가능함.)
default-src 'unsafe-inline' 적용시켰을때 모습
c,d를 allow해야함으로
위에서 구한 c함수의 sha256를 적용시킴
>> script-src 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4='
그리고 마지막 d 함수도 허용시켜야 하는데,
csp.html에서 적혀있는 integrity="sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8=" 사용했음
>> script-src 'sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8='
따라서 최종 결과는 script-src 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4='; script-src 'sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8='
인줄 알았으나,
같은 정책은 그냥 사이에 공백하나 넣어주더라.
script-src 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4=' 'sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8='
또다른 풀이
default-src * 'sha256-l1OSKODPRVBa1/91J7WfPisrJ6WCxCRnKFzXaOkpsY4='; img-src 'self' data:
'워게임 > 웹' 카테고리의 다른 글
Dreamhack - PHP (0) | 2021.07.08 |
---|---|
Dreamhack - login-1 (0) | 2021.07.07 |