Por estos días tuve la oportunidad de trabajar con Los enlaces son solo para miembros.
Registrate o
iniciá sesión, un micro-framework que te permite hacer webs con Python y sintaxis de Jinja2. La aplicación que llegó a mis manos tenía un login, un panel que trabaja con una base de datos y hasta con algunos temas de criptografía. Me llamó mucho la atención como funcionaba y esto es un poco de lo que pude concluir.
Server-Side Template InjectionPor la forma en la que está diseñado Flask, podemos explotar Server Side Template Injection. Es interesante tomarlo en cuenta para el momento de hacer pentest porque ya le han reportado Los enlaces son solo para miembros.
Registrate o
iniciá sesión explotando este tipo de vulnerabilidades.
El primer ejemplo es un XSS mediante Template Injection. Por defecto flask no filtra las variables cuando se usa request.args.get('var'). El código a continuación es vulnerable a XSS.
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/XSS')
def hello_xss():
template = '''<h2>Hola %s!</h2>''' % request.args.get('nombre')
return render_template_string(template, person=request.args.get('nombre'))
if __name__ == "__main__":
app.run(debug=True)
El cual se puede explotar fácilmente de la siguiente forma:

Otro vector de ataque que encontré fue LFI a través del popular open(), como se puede ver en el siguiente ejemplo:
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/LFI')
def hello_lfi():
template = '''<h2>Hola %s!</h2>''' % request.args.get('name')
return render_template_string(template, person=request.args.get('name'), get_user_file=get_user_file)
def get_user_file(f_name):
with open(f_name) as f:
return f.readlines()
if __name__ == "__main__":
app.run(debug=True)
El cual se puede explotar de la siguiente forma:

El código que usé en el anterior ejemplo en la variable name fue:
<pre> {% for a in get_user_file("/etc/passwd") %} {{a}} {%endfor%} </pre>
También pude haber sacado el archivo completo de la siguiente forma:
{{get_user_file("/etc/passwd")}}
Pero le puse el FOR para hacer que se vea mucho mejor, si quieren entender la diferencia entre {{}} y {%%} les recomiendo leer la info sobre FLASK en el link del principio de este post y la verdad 100% recomendable, un framework bien interesante.
Como se pueden imaginar, también se puede explotar Inyección SQL pero he pensado también en otros tipos de explotación bastante interesantes. Si se les ocurren otros métodos de explotación coméntenmelos y no olviden seguirme en TW como @SeguridadBlanca