해당 문제 정보는 아래와 같다.
접속 정보 보기를 통해 접속한 페이지는 아래와 같다.
해당 페이지를 둘러보니 클릭해서 접속할 수 있는 것은 '404Error'와 '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) 를 통해 경로를 출력해주는 것을 알 수 있었다.
따라서 {{config.items()}} 명령어를 통해 현재 딕셔너리 형태로 설정되어 있는 config를 확인해보자.
3번째 줄에 있는 플래그 값을 찾을 수 있었다.
문제풀이 완료!
이 문제를 풀기 위해 구글링을 해보면서 이 문제는 SSTI 취약점 문제임을 알 수 있었다. SSTI 취약점에 대한 내용은 아래와 같다.
SSTI (Server Side Template Injection) 취약점
공격자가 서버측의 기본 템플릿 구문을 이용하여 악성 페이로드를 삽입 한 다음 서버 측에 실행되면서 생기는 취약점이며 웹 템플릿 엔진마다 사용되는 페이로드가 다르다.
이 문제는 flask로 구동되기 때문에 템플릿 구문으로 {{ }}를 사용한다.
즉 {{1*1}}을 넣어 봤을 때, {{1*1}} 페이지를 찾을 수 없다면 SSTI가 안 되는 것이고, 1 페이지를 찾을 수 없다면 SSTI가 되는 것이다.
본 문제에서는 1 페이지를 찾을 수 없다고 하기에 SSTI에 취약한 것을 알 수 있다.
또한 플래그는 app.secret_key에 저장되어 있기 때문에 어플리케이션 설정 값 ({{config}}) 을 통해 확인할 수 있을 것이다. {{config}} 를 넣어보면, SECRET_KEY 변수에 플래그가 저장되어 있는 것을 확인할 수 있다.
[참고자료] https://onsoim.tistory.com/entry/Dreamhack-web-simple-ssti
[SSTI 관련 자료] https://me2nuk.com/SSTI-Vulnerability/
'CTF' 카테고리의 다른 글
[Dreamhack] proxy-1 (0) | 2023.05.21 |
---|---|
[Dreamhack] broken-png (0) | 2023.05.21 |
[Dreamhack] dreamhack-tools-cyberchef (0) | 2023.05.13 |
[Suninatas] 1번 (1) | 2023.05.13 |
[Dreamhack] error based sql injection (1) | 2023.05.10 |