flawopen.com/SSTI/Penjelasan
Apa itu server-side template injection?
Server-side template injection terjadi ketika input tak tepercaya diparse sebagai sumber template, bukan diberikan sebagai data. Dampaknya bergantung pada engine, konfigurasi, dan kemampuan yang terekspos: mulai dari evaluasi ekspresi hingga eksekusi kode server. Tidak semua SSTI menyebabkan eksekusi kode.
# Python / Jinja2 template = f"Hello {name}!" return render_template_string(template) # Input: {{ 7*7 }} renders as "49" # This confirms expression evaluation; # impact still depends on engine access. // Java / Freemarker String tpl = "Welcome " + userName; new Template("t", tpl, cfg) .process(model, out);
# The template is a fixed string the # developer wrote. The user value is # passed in as a variable. return render_template( "greeting.html", name=name ) # Or with a literal template string: return render_template_string( "Hello {{ name }}!", name=name ) // Java equivalent: template from file, // user value in the model map.
Perbedaan utama
Setiap engine template menerima dua input: template dan data konteks. Template adalah program; data adalah nilai yang dibaca program itu. SSTI terjadi ketika input pengguna berpindah dari data menjadi sumber template.
Ini kesalahan struktural yang sama seperti SQL injection, saat data digabungkan ke teks kueri, serta Log4Shell, ketika data mencapai evaluator ekspresi melalui pesan log. Prinsip perbaikannya sama: pertahankan program tetap dan kirim nilai tak tepercaya melalui kanal parameter.
Kapan dampak dapat mencakup eksekusi kode
Jika engine mengekspos objek atau metode yang kuat ke template, penyerang mungkin dapat mencapai kemampuan sensitif aplikasi. Eksekusi kode bergantung pada engine, versi, konfigurasi, sandbox, dan data yang terekspos. Dampak lain mencakup pengungkapan data atau penghabisan sumber daya. Perlakukan sumber template dari pengguna sebagai logika aktif; jangan hanya mengandalkan sandbox tanpa membatasi objek dan sumber daya rendering.
Cara mendeteksi
{{7*7}}
${7*7}
<%= 7*7 %>
#{7*7}
Jika respons berisi 49 alih-alih teks literal, input sedang dievaluasi sebagai sintaks template. Probe aritmetika singkat membantu mendeteksi evaluasi dalam lingkungan uji berizin; sintaks berbeda antar-engine dan tidak cukup untuk mengidentifikasinya dengan andal.
Pertanyaan umum
Tidak. Client-side template injection berjalan di browser korban dan dapat menjadi varian XSS. SSTI dievaluasi di server dalam proses aplikasi. Dampaknya bergantung pada engine dan kemampuan yang terekspos; beberapa konfigurasi memungkinkan eksekusi kode server, tetapi tidak otomatis terjadi pada setiap SSTI.
Tidak. Auto-escaping membersihkan nilai yang dirender; fitur ini tidak mencegah nilai diparse sebagai sintaks template. Ini membantu mencegah XSS pada output, bukan injection ke sumber template.
Perlakukan sumber template dari pengguna sebagai logika yang dapat dieksekusi dan secara default jangan memprosesnya dalam konteks aplikasi utama. Jika perlu, gunakan engine untuk template terbatas, berikan data inert minimum, dan batasi CPU, memori, ukuran output, serta waktu. Sandbox saja bukan batas keamanan lengkap.
Referensi
- CWE-1336 — Improper Neutralization of Special Elements Used in a Template Engine
- PortSwigger Web Security Academy — server-side template injection
- OWASP Testing Guide — testing for SSTI
- Is Jinja2's render_template_string() safe?
- Are Freemarker and Velocity templates safe with user input?
- Jinja documentation — Sandbox security considerations