Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 자바스크립트 기본 문법
- Oracle SQL
- 랜섬웨어
- 자바스크립트 node
- 보안뉴스한줄요약
- php
- 깃허브
- numpy
- 카카오프로젝트 100
- 다크웹
- 자바스크립트 element api
- ES6
- oracle
- 자바스크립트 prototype
- oracle db
- 카카오프로젝트100
- 자바스크립트 jQuery
- javascript
- 파이썬
- 보안뉴스 요약
- 오라클
- 자바스크립트
- 카카오프로젝트
- 보안뉴스
- 자바스크립트 API
- 자바스크립트 객체
- python
- 보안뉴스 한줄요약
- GIT
- 보안뉴스요약
Archives
- Today
- Total
FU11M00N
[ DreamHack ] pathtraversal 본문
- 문제 정보
사용자의 정보를 조회하는 API 서버입니다.
Path Traversal 취약점을 이용해 /api/flag에 있는 플래그를 획득하세요!
#!/usr/bin/python3
from flask import Flask, request, render_template, abort
from functools import wraps
import requests
import os, json
users = {
'0': {
'userid': 'guest',
'level': 1,
'password': 'guest'
},
'1': {
'userid': 'admin',
'level': 9999,
'password': 'admin'
}
}
def internal_api(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if request.remote_addr == '127.0.0.1':
return func(*args, **kwargs)
else:
abort(401)
return decorated_view
app = Flask(__name__)
app.secret_key = os.urandom(32)
API_HOST = 'http://127.0.0.1:8000'
try:
FLAG = open('./flag.txt', 'r').read() # Flag is here!!
except:
FLAG = '[**FLAG**]'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/get_info', methods=['GET', 'POST'])
def get_info():
if request.method == 'GET':
return render_template('get_info.html')
elif request.method == 'POST':
userid = request.form.get('userid', '')
info = requests.get(f'{API_HOST}/api/user/{userid}').text
return render_template('get_info.html', info=info)
@app.route('/api')
@internal_api
def api():
return '/user/<uid>, /flag'
@app.route('/api/user/<uid>')
@internal_api
def get_flag(uid):
try:
info = users[uid]
except:
info = {}
return json.dumps(info)
@app.route('/api/flag')
@internal_api
def flag():
return FLAG
application = app # app.run(host='0.0.0.0', port=8000)
# Dockerfile
# ENTRYPOINT ["uwsgi", "--socket", "0.0.0.0:8000", "--protocol=http", "--threads", "4", "--wsgi-file", "app.py"]
Get User Info에 보면 userid칸에 guest값이 들어가 있는데,
View를 누르는 순간 guest 값이 0으로 바뀌어서 딕셔너리 값 0의 값인 guest의 정보가 출력됨.
반대로 admin을 누르면 값이 1로 변경되면서 딕셔너리 값 1인 admin의 정보가 출력됨.
딕셔너리 0,1 값이 아닌 다른 값을 넣으면 undefined로 요청되어서 아무 값도 출력 안됨.
플래그는 경로 한칸위인 /api/flag 경로에 있으니
문제를 보면 Path Traversal 취약점을 사용해 "../flag" 를 해주면 될 것 같지만
자바스크립트에 있는 로직때문에 undefined로 요청이 감.
그래서 프록시 툴을 사용하거나 자바스크립트 필터링을 우회해야 함.
프록시 툴에 요청을 잡은뒤 ../flag로 요청하면 clear
'Web Hacking > DreamHack' 카테고리의 다른 글
[ DreamHack ] image-storage (0) | 2021.03.28 |
---|---|
[ DreamHack ] file-download-1 (0) | 2021.03.28 |
[ DreamHack ] xss-1 (0) | 2021.03.28 |
[ Dreamhack ] simplesqli (0) | 2021.03.28 |
[ Dreamhack ] cookie (0) | 2021.03.28 |
Comments