Masalah

Diberikan layanan web yang dapat diakses pada http://localhost:5000 dan diberikan pula source codenya.

Penyelesaian

Isi source code:

from flask import Flask, request, render_template_string, render_template

app = Flask(__name__)

@app.route('/')
def hello_ssti():
    person = {'name':"world", 'secret':"UGhldmJoZj8gYWl2ZnZoei5wYnovcG5lcnJlZg=="}
    if request.args.get('name'):
        person['name'] = request.args.get('name')
    template = '''<h2>Hello %s!</h2>''' % person['name']
    return render_template_string(template, person=person)

# Private function if the user has local files.
def get_user_file(f_name):
    with open(f_name) as f:
        return f.readlines()

app.jinja_env.globals['get_user_file'] = get_user_file # Allows for use in Jinja2 templates

if __name__ == "__main__":
    app.run(debug=True)

Jika layanan web diakses pada / maka ia akan menampilkan pesan.

Hello world!

Sedangkan apabila diakses dengan parameter ?name=Dummy maka ia akan menampilkan pesan.

Hello Dummy!

Terdapat kelemahan RCE pada layanan web ketika menambahkan template injection setelah parameter name, misal ?name=Dummy {{3*3}}.

Hello Dummy 9!

Pencegahan

Kelemahan ini disebabkan oleh kode ini.

template = '''<h2>Hello %s!</h2>''' % person['name']

Untuk mencegah template injection, perbaharui kode.

template = '''<h2>Hello {{person.name}}!</h2>'''

Referensi

results matching ""

    No results matching ""