Web 400: NoXSS

By HackBUAZ Team

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.


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