[WEB] simple-ssti 문제풀이

SSTI(Server Side Template Injection) 취약점은 공격자가 서버 측의 기본 템플릿 구문을 이용하여 악성 페이로드를 삽입한 다음 서버 측에서 실행되면서 생기는 취약점이며 웹 템플릿 엔진마다 사용되는 페이로드가 다르다..

 

템플릿 언어란 언어의 변수 및 문법을 html 안에서 쓸 수 있도록 제공해주는 언어이다.

django의 경우는 파이썬과 html을 같이 사용할 수 있다. 이런 템플릿을 이용하면 간단하면서 동적인 페이지를 만들 수 있다.

 

flask의 jinja2 문법을 사용할 경우 {{..}} 형태의 템플릿을 사용한다. {{7*7}}이 템플릿 언어로 삽입되면 49라는 결과 값을 출력한다. 아래 사진은 통용적인 템플릿 언어를 사용하면서 서버 측의 템플릿 언어를 도출해내는 과정을 나타낸다. 

 

 

 

문제를 확인해보자.

 

 

존재하지 않는 페이지 방문 시 404 에러를 출력하는 서비스에서 SSTI 취약점을 이용해 FLAG를 획득해야하는 문제이다.

페이지에 바로 접속해보자.

 

 

404Error 링크를 클릭해보자.

 

 

Page Not Found 라는 문구가 나온다. 

robots.txt 링크도 클릭해보자.

 

 

흠..터레스팅.....

페이지 경로를 그대로 출력한다. 입력한 페이지 경로를 그대로 출력해주는 것 같다.

한 번 테스트해보자.

 

 

역시 박셜록의 추리는 완벽했다. 그래서...어쩌..라고...???

일단은 소스코드를 봐보자.

 

#!/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)

 

나의 추리가 모두 들어 맞다. %(request.path) 를 통해 경로를 출력해준다.

경로에다가 템플릿 언어 삽입의 정석인 {{7*7}}을 넣어줘보자.

 

 

오호라 네놈이었구만. 너는 이제 곧 끝난 목숨이다.

{{config.items()}} 명령어를 통해 현재 딕셔너리 형태로 설정되어 있는 config를 확인해보자.

 

 

플래그가 나왔다. 

 

문제풀이 끗

'워게임 > dreamhack' 카테고리의 다른 글

[dreamhack] login-1 문제풀이  (0) 2021.07.01
[dreamhack] Mango 문제풀이  (0) 2021.06.24
[dreamhack] web-misconf-1 문제풀이  (0) 2021.06.15
[dreamhack] php-1 문제풀이  (0) 2021.06.15
[dreamhack] proxy-1 문제풀이  (0) 2021.06.08
복사했습니다!