드림핵 웹해킹 로드맵 마지막 문제다 .. 드디어
먼저, 코드를 보자
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)
각각의 엔드포인트를 간단하게 분석해보자. /file의 경우 파라미터로 경로를 입력받고 파일을 읽어 결과를 리턴한다. /admin 엔드포인트는 api_key가 일치할 경우 시스템 명령어를 실행시킬수 있다. -> 근데 api_key는 알 수가 없음
그러나 /file 엔드포인트에서 파라미터의 값에 대한 별도의 검사가 없으므로 path traversal이 발생하게 되고 임의 파일을 다운로드 할 수 있다. 따라서 API 키를 다운로드 받아 시스템 명령어를 실행해야된다.
익스
먼저 /etc/passwd에 접근해서 path traversal이 발생하는 것을 확인했다.
강의에서 알려준 환경변수가 저장된 파일에 접근하니 API_KEY를 바로 얻었다..
gg
'Web Hacking > Dreamhack' 카테고리의 다른 글
[Dreamhack] baby-union write up (2) | 2024.03.31 |
---|---|
[Dreamhack] BypassIF write up (0) | 2024.03.30 |
[Dreamhack] Apache htaccess write up (0) | 2024.03.21 |
[Dreamhack] Command Injection Advanced write up (0) | 2024.03.18 |
[Dreamhack] sql injection bypass WAF Advanced write up (0) | 2024.03.17 |