Web

Dreamhack - simple-ssti(Write-up)

HackHiJack 2021. 12. 29. 22:10
728x90
반응형

오늘은 드림핵의 simple-ssti라는 문제를 풀어볼 것이다.

문제는 2단계인데 굉장히 쉬운 문제이다.

정말 ssti의 기초만 알아도 풀수 있는 문제이다.

 

먼저 python코드를 살펴보자.

#!/usr/bin/python3
from flask import Flask, request, render_template, render_template_string, make_response, redirect, url_for
import socket

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

app.secret_key = FLAG


@app.route('/')
def index():
    return render_template('index.html')

@app.errorhandler(404)
def Error404(e):
    template = '''
    <div class="center">
        <h1>Page Not Found.</h1>
        <h3>%s</h3>
    </div>
''' % (request.path)
    return render_template_string(template), 404

app.run(host='0.0.0.0', port=8000)

먼저 코드를 살펴보면, 아래와 같은 부분에서 ssti의 취약점이 발생하는걸 확인할 수 있다.

def Error404(e):
    template = '''
    <div class="center">
        <h1>Page Not Found.</h1>
        <h3>%s</h3>
    </div>
''' % (request.path)

이는 python Flask에서 나타나는 취약점인데, flask는 jinja2라는 템플릿을 이용하여 취약점이 발생한다.

 

여기서 {{ }} 형식으로 넣으면, 웹 템플릿이라고 인식을 하여 정보를 출력하거나, 연산, 심지어 RCE까지 이어지는 위험한 취약점이 발생한다.

 

그러면 이제 웹사이트를 살펴보자.

걍 어디를 들어가던 404에러가 발생된다.

그런데 만약 / 뒤에 웹 템플릿 구문을 넣으면 실행이 될 것이다.

 

flask는 대부분의 중요한 정보다 config라는 class로 들어간다.

그러면 아래처럼 주소를 넣으면 config파일을 불러올수 있을 것이다.

http://host1.dreamhack.games:<your port>/{{config}}
반응형

위를 넣으면 아래처럼 flag를 확인할 수 있다.

728x90
반응형