본문 바로가기
웹 해킹/드림핵

[Dreamhack] simple-ssti

by L3m0n S0ju 2021. 7. 20.


#!/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(server side template injection)을 이용하여 문제를 해결해야합니다. 문제의 핵심은 템플릿 엔진입니다. 웹 템플릿 엔진이란 웹 페이지에 연산과 같은 작업들을 편하게 수행할 수 있도록 도움을 주는 기능이라고 볼 수 있겠습니다. @app.errorhandler(404)를 보면 tenplate에 문자열을 저장하고 마치 c언어와 같이 %s에 뒤에 붙어있는 (request.path)를 삽입합니다.  그리고 템플릿 엔진에 template 문자열을 넘겨줍니다. 문제점은 %s에 들어가는 입력값이 템플릿 문법으로 작동할 수 있다는 것이다.

 

첫번째로 템플릿 엔진의 종류를 알기위해서 아래와 같이 트리 서치를 이용하여 찾아냅니다.

 

 

 

예를 들어 http://host1.dreamhack.games:13486/{{7*7}}을 검색하면 아래와 같이 문법이 작동하므로 다음 단계로 넘어갑니다.


 

템플릿 엔진은 jinja2, Twig 둘 중 하나인데 jinja2는 파이썬 문법, Twig는 php 문법으로 알려져있다. 따라서 jinja2임을 알 수 있고 현재 웹페이지 설정을 보기위해 {{config}}를 입력값으로 넣으면 여러가지 설정들이 출력되는데 플래그도 같이 출력된다.

플래그

 

'웹 해킹 > 드림핵' 카테고리의 다른 글

[Dreamhack] funjs  (0) 2021.10.10
[Dreamhack] Mango  (0) 2021.07.18
[Dreamhack] php-1  (0) 2021.07.16
[Dreamhack] pathtraversal  (0) 2021.07.16
[Dreamhack] proxy-1  (0) 2021.07.16

댓글