dreamhack.io - file-csp-1

2021. 8. 24. 15:39Web

제공된 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