학습 기록일지

Dreamhack - file-csp-1 본문

워게임/웹

Dreamhack - file-csp-1

KRMP 2021. 6. 29. 21:24

드림핵 웹 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 인자로 사용한다는것을 알수있다.

csp.html

위 분석했던 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