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