문제
풀이
단순 API index 페이지가 보여진다.
소스코드를 확인한다.
import os, subprocess
from functools import wraps
from flask import Flask, request
app = Flask(__name__)
API_KEY = os.environ.get('API_KEY', None)
def key_required(view):
@wraps(view)
def wrapped_view(**kwargs):
apikey = request.args.get('API_KEY', None)
if API_KEY and apikey:
if apikey == API_KEY:
return view(**kwargs)
return 'Access Denied !'
return wrapped_view
@app.route('/', methods=['GET'])
def index():
return 'API Index'
@app.route('/file', methods=['GET'])
def file():
path = request.args.get('path', None)
if path:
data = open('./files/' + path).read()
return data
return 'Error !'
@app.route('/admin', methods=['GET'])
@key_required
def admin():
cmd = request.args.get('cmd', None)
if cmd:
result = subprocess.getoutput(cmd)
return result
else:
return 'Error !'
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
위 소스코드를 확인하면, get으로 받는 파라미터에 대한 제약 사항이 없다.
그러므로, /file 에서는 traversal 취약점이 시행될 것이고, /admin 에서는 command 실행 취약점 이 존재할 것이다.
풀이는 아래와 같다.
/etc/passwd 를 출력하며, traversal 취약점을 확인한다.
/proc/self/environ 에 접근해 API_KEY 값을 확인한다.
이 API_KEY를 /admin 으로 넘기며 동시에 cmd 파라미터도 보내야한다.
로직을 거치면 명령어를 사용할 수 있다.
flag라는 실행파일이 존재하는 것을 확인할 수 있다.
flag 를 실행시킨다.
'Dreamhack > Dreamhack(1단계)' 카테고리의 다른 글
rev-basic-3 (Reversing) (1) | 2025.06.04 |
---|---|
rev-basic-2 (Reversing) (0) | 2025.04.28 |
Command Injection Advanced (웹 해킹) (0) | 2024.10.23 |
error based sql injection (웹 해킹) (0) | 2024.10.23 |
session-basic (웹 해킹) (2) | 2024.10.16 |