flawopen.com/Vulnerabilities/Server-Side Template Injection (SSTI)
Server-Side Template Injection (SSTI): Penyebab dan Perbaikan
Bayangkan perusahaan yang mencetak surat dengan templat βHalo, {{ name }}β. Cara yang aman memberikan templat tetap dan nama pelanggan sebagai data secara terpisah. Cara yang tidak aman menyisipkan teks pelanggan ke dalam instruksi templat sebelum dicetak. Jika mesin templat menafsirkan teks itu sebagai sintaks templat, terjadilah Server-Side Template Injection. Dampaknya bergantung pada mesin, konfigurasi, objek yang tersedia, dan hak proses; evaluasi ekspresi tidak otomatis berarti perintah sistem operasi dijalankan.
Konsep inti dan istilah subsistem
- Mesin templat
- Komponen sisi server seperti Jinja atau Twig yang mengurai sintaks templat dan menghasilkan output dari templat serta data konteks.
- Injeksi source templat
- Cacat ketika teks eksternal dimasukkan ke source sebelum parsing sehingga ditafsirkan sebagai sintaks templat, bukan data biasa.
- Data konteks
- Nilai yang diberikan secara terpisah kepada templat tetap yang tepercaya. Pemisahan yang benar mencegah nilai seperti
{{ 7 * 7 }}diurai ulang sebagai source. - CWE-1336
- Netralisasi elemen khusus yang digunakan dalam mesin templat secara tidak tepat. Kategori ini mencakup pemrosesan input eksternal sebagai sintaks templat yang tidak aman.
Alur serangan langkah demi langkah
Input yang dikendalikan penyerang mencapai jalur templat
Field formulir, nilai profil tersimpan, atau string lain yang dipengaruhi pihak luar mencapai kode yang membuat atau mengompilasi templat. Batas rentannya adalah penyusunan source, bukan sekadar rendering nilai.
Aplikasi mencampur data dengan instruksi templat
Aplikasi menyisipkan string tidak tepercaya ke source templat (misalnya f-string yang diteruskan ke render_template_string) alih-alih memakai templat statis dan nilai konteks terpisah.
Mesin mengurai source gabungan
Mesin menafsirkan ekspresi sesuai bahasa dan konfigurasinya. Ekspresi aritmetika yang tidak berbahaya dapat menunjukkan evaluasi; hal itu sendiri tidak membuktikan akses ke file, rahasia, atau perintah sistem.
Dampak bergantung pada mesin dan deployment
Dampak lanjutan bergantung pada objek/fungsi yang tersedia, perilaku sandbox, pembatasan mesin, dan hak proses web. RCE mungkin terjadi pada konfigurasi tertentu, tetapi bukan akibat otomatis setiap SSTI.
Mekanisme dan akar masalah
SSTI terjadi ketika aplikasi menjadikan teks yang dipengaruhi pihak luar sebagai bagian program templat sebelum parsing. Pada Flask/Jinja, pola rentannya membuat string source baru dari data request lalu mengirimkannya ke render_template_string(); HTML escaping melindungi konteks output dan tidak mengubah source templat yang tidak tepercaya menjadi data. Perbaikannya adalah memuat templat tetap lalu memberikan nilai secara terpisah sebagai konteks. Jika pengguna perlu menulis templat, berikan model data minimal dan lakukan rendering di worker terisolasi dengan batas sumber daya. Sandbox adalah pertahanan berlapis, bukan alasan untuk mengekspos rahasia atau objek aplikasi yang berkuasa.
# VULNERABLE: request data becomes template source before parsing.
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route("/greet")
def greet():
name = request.args.get("name", "Guest")
# A value such as {{ 7 * 7 }} is interpreted by the template engine.
source = f"<h1>Welcome, {name}!</h1>"
return render_template_string(source)
# HARDENED: fixed template source; request data stays a context value.
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route("/greet")
def greet():
name = request.args.get("name", "Guest")
return render_template("greet.html", name=name)
# templates/greet.html is trusted, static source:
# <h1>Welcome, {{ name }}!</h1>
Urutan serangan dan contoh konseptual
- 1Sumber: Nilai yang dipengaruhi pihak luar mencapai jalur yang menyusun templat.
- 2Penggabungan tidak aman: Aplikasi memasukkan nilai ke source templat alih-alih memberikannya terpisah sebagai data konteks.
- 3Interpretasi: Mesin mengurai source gabungan. Dalam pengujian berizin, ekspresi aritmetika jinak dapat mengonfirmasi evaluasi.
- 4Dampak bersyarat: Akses lanjutan bergantung pada mesin, objek terekspos, konfigurasi, dan hak proses; jangan menyimpulkan RCE hanya dari evaluasi ekspresi.
Aturan pencegahan dan perlindungan engineering
- βJaga source tetap statis: Muat templat tepercaya dari file atau loader terkontrol; berikan input pengguna hanya sebagai nilai konteks. Jangan gabungkan data request ke source.
- βBedakan SSTI dari HTML injection: HTML escaping melindungi konteks output; ini tidak memperbaiki alur ketika input tidak tepercaya diurai sebagai source templat.
- βBatasi templat buatan pengguna: Jika fitur ini diperlukan, gunakan sandbox mesin sesuai tujuan, berikan model data minimal, dan render di worker terisolasi dengan batas sumber daya. Ikuti panduan keamanan mesin.
- βBatasi dampak: Jalankan renderer sebagai layanan non-root dengan akses minimal ke file, jaringan, dan rahasia. Ini adalah containment, bukan perbaikan utama.
- βTambahkan tes regresi: Berikan penanda jinak seperti
{{ 7 * 7 }}sebagai data dan pastikan tetap dianggap data; pastikan templat hanya berasal dari loader tepercaya.