By HackBUAZ Team
1. Recibimos un archivo de Python para analizar:
2.- Revisamos la dirección dada y nos da un formulario de registro similar (Se recreó para propósitos ilustrativos). Podemos ver que que el nombre que recibe la app lo devuelve en pantalla.
render_template_string es usado con el input del usuario, sin antes ser sanitizado, por lo que es probable que sea vulnerable a “Server Side Template Injection” (STTI), pero vemos que antes procesa el input con una blacklist de strings no válidos.
3.- Comprobamos que sea vulnerable a SSTI.
1. Recibimos un archivo de Python para analizar:
# -*- coding: utf-8 -*- from flask import Flask, render_template, render_template_string, request app = Flask(__name__) @app.route("/") def index(): return render_template('index.html') @app.route("/register") def process(): blacklist = ["__class__", "__","."] name = request.args.get('name') for bad_string in blacklist: if bad_string in name: err_temp = '<!DOCTYPE html><html><body><h2>Intento de hackeo detectado por el uso de: %s </h2></body></html>' % bad_string return render_template_string(err_temp) template = '<!DOCTYPE html><html><body><h2>Bienvenido %s! </h2></body></html>' % name return render_template_string(template) if __name__ == "__main__": app.run(host= '0.0.0.0')
2.- Revisamos la dirección dada y nos da un formulario de registro similar (Se recreó para propósitos ilustrativos). Podemos ver que que el nombre que recibe la app lo devuelve en pantalla.
render_template_string es usado con el input del usuario, sin antes ser sanitizado, por lo que es probable que sea vulnerable a “Server Side Template Injection” (STTI), pero vemos que antes procesa el input con una blacklist de strings no válidos.
3.- Comprobamos que sea vulnerable a SSTI.
Pero tenemos el problema de que bloquea guiones bajos y puntos, por lo que hay que hace bypass.
Al investigar, descubrimos que podemos usar | para hacer piping a través de funciones. Además, descubrimos que si pasamos una lista vacía y llamamos map obtenemos un mensaje.
Al investigar, descubrimos que podemos usar | para hacer piping a través de funciones. Además, descubrimos que si pasamos una lista vacía y llamamos map obtenemos un mensaje.
Con ese mensaje, podemos extraer el guión bajo y hacer bypass!!!
5.- Intentamos hacer bypass de los guiones.
6. Segun este blog, con la vulnerabilidad es posible obtener LFI e incluso RCE, por lo que intentamos obtener LFI basado en el payload que nos muestra, para transformarlo en un payload que pueda hacer bypass.
7.- Creamos archivos para preprarar RCE
8.- Cargamos el archivo.
9.- Comprobamos RCE.
Comments
Post a Comment