본문 바로가기

Web Hacking/Dreamhack

[Dreamhack] Dream Gallery write up

 

위 문제는 flag가 루트 디렉토리 밑에 존재한다.

 

코드 ㄱㄱ

 

from flask import Flask, request, render_template, url_for, redirect
from urllib.request import urlopen
import base64, os

app = Flask(__name__)
app.secret_key = os.urandom(32)

mini_database = []


@app.route('/')
def index():
    return redirect(url_for('view'))


@app.route('/request')
def url_request():
    url = request.args.get('url', '').lower()
    title = request.args.get('title', '')
    if url == '' or url.startswith("file://") or "flag" in url or title == '':
        return render_template('request.html')

    try:
        data = urlopen(url).read()
        mini_database.append({title: base64.b64encode(data).decode('utf-8')})
        return redirect(url_for('view'))
    except:
        return render_template("request.html")


@app.route('/view')
def view():
    return render_template('view.html', img_list=mini_database)


@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        f = request.files['file']
        title = request.form.get('title', '')
        if not f or title == '':
            return render_template('upload.html')

        en_data = base64.b64encode(f.read()).decode('utf-8')
        mini_database.append({title: en_data})
        return redirect(url_for('view'))
    else:
        return render_template('upload.html')


if __name__ == "__main__":
    img_list = [
        {'초록색 선글라스': "static/hanni-1.jpeg"}, 
        {'분홍색 선글라스': "static/hanni-2.jpeg"},
        {'보라색 선글라스': "static/hanni-3.jpeg"}, 
        {'파란색 선글라스': "static/hanni-4.jpeg"}
    ]
    for img in img_list:
        for k, v in img.items():
            data = open(v, 'rb').read()
            mini_database.append({k: base64.b64encode(data).decode('utf-8')})
    
    app.run(host="0.0.0.0", port=3333, debug=False)

 

요약하자면 두 가지 파일 업로드 기능이 있고 해당 이미지 파일을 보여주는 뷰어 기능도 있다. 

 

1. 로컬파일 업로드

 

2. 외부 파일 업로드

 

2번에서 취약점이 발생한다. 2번에서 서버의 flag.txt를 가져와야 한다.

 

 

필터링이 있다. flag 문자열을 거르고 있고 넘긴 url이 file://로 시작하면 거른다.

 

 

file 스키마를 사용할 땐 KDE 환경에선 file:/etc/passwd와 같이 사용이 가능하다고 한다. 즉, 슬래쉬는 필요가 없다. 따라서 file://가 우회된다. 문제는 flag단어다

(KDE 환경이란 권한이 필요하지 않은 파일인 것 같다)

 

고민하다가 에라 모르겠다 식으로 url 인코딩해서 넘겨봤는데 풀렸다.. 

 

 

해당 값을 디코딩하자.

 

 

 

생각해보니 urlopen()함수이니 url 인코딩이 가능한게 당연(?)하지 않을까

 

+file스키마 역시 url인코딩이 허용된다.

'Web Hacking > Dreamhack' 카테고리의 다른 글

[Dreamhack] Just read flag  (0) 2024.05.28
[Dreamhack] EZ_command_injection write up  (0) 2024.05.19
[Dreamhack] filestorage write up  (0) 2024.04.26
[Dreamhack] crawling write up  (0) 2024.04.26
[Dreamhack] file-csp-1 write up  (0) 2024.04.23