Wargame/Web

[Dreamhack] file-csp-1

월루이 2022. 7. 6.

문제

https://dreamhack.io/wargame/challenges/36/

 

file-csp-1

문제에서 요구하는 조건에 맞게 CSP를 작성하면 플래그를 획득할 수 있습니다. Reference Introduction of Webhacking

dreamhack.io

 

 

 

 

 

풀이

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

댓글