FlawOpen

flawopen.com/SSTI/Penjelasan

Apa itu server-side template injection?

CWE-1336: Server-Side Template InjectionHalaman referensi
Jawaban singkat

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.

RENTAN — input menyusun template
# 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);
DIPERBAIKI — input menjadi data
# 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

Apakah ini sama dengan XSS?

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.

Apakah auto-escaping mencegahnya?

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.

Apakah aman jika hanya admin yang dapat mengedit 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

Lihat juga SSTI: Penyebab, Dampak, dan Perbaikan Template Injection SSTI FreeMarker dan Velocity: Keamanan Template Apakah render_template_string() Jinja2 aman?