Di bagian ini, kita akan berbicara tentang apa itu injeksi template sisi server dan mendefinisikan metodologi sederhana untuk mengeksploitasi kerentanan injeksi template sisi server. Kami juga akan mengusulkan metode untuk memastikan bahwa penggunaan template pribadi Anda tidak akan membuat Anda terkena injeksi template sisi server.

Apa Itu Server-Side Template Injection

Injeksi template sisi server adalah saat penyerang mampu menggunakan sintaks template asli untuk menyuntikkan muatan berbahaya ke dalam template, yang kemudian dilakukan di sisi server.

Mesin templat dirancang untuk menghasilkan halaman bersih dengan menggunakan kombinasi templat konstan dengan data berisiko. Serangan injeksi template sisi server dapat terjadi ketika input pengguna digabungkan sekaligus ke dalam template, sebagai pengganti daripada dilampaui sebagai data. Ini memungkinkan penyerang untuk menyuntikkan arahan templat arbitrer untuk memanipulasi mesin templat, secara teratur memungkinkan mereka untuk mengambil seluruh pengelolaan server. Seperti namanya, muatan injeksi template sisi server dikirim dan dievaluasi di sisi server, mungkin membuatnya jauh lebih berbahaya daripada injeksi template sisi klien tradisional.

Apa Pengaruhnya Terhadap Injeksi Template Sisi Server?

Kerentanan injeksi template sisi server dapat mengekspos situs web ke berbagai serangan yang mengandalkan mesin template dalam kueri dan seberapa tepat perangkat lunak memanfaatkannya. Dalam keadaan tertentu yang tidak biasa, kerentanan ini tidak menimbulkan risiko perlindungan yang sebenarnya. Namun, sebagian besar waktu, pengaruh injeksi template sisi server dapat menjadi bencana besar.

Pada skala ekstrim, penyerang mungkin dapat menuai jauh dari eksekusi kode, mengambil kendali penuh dari server back-end dan menggunakannya untuk mengoperasikan berbagai serangan pada infrastruktur di dalam.

Bahkan dalam kasus di mana eksekusi kode jauh tidak mungkin lagi, penyerang sering masih dapat menggunakan injeksi template sisi server sebagai dasar untuk beberapa serangan lain, mungkin mendapatkan akses ke statistik sensitif dan arsip acak pada server.

Bagaimana Kerentanan Injeksi Template Sisi Server Muncul?

Kerentanan injeksi template sisi server terjadi ketika orang yang masuk digabungkan ke dalam template sebagai pengganti daripada dilampaui sebagai data.

Template statis yang benar-benar memberikan tempat penampung di mana materi konten dinamis dirender biasanya sekarang tidak cenderung ke injeksi template sisi server. Contoh dasarnya adalah surat elektronik yang menyapa setiap konsumen melalui nama mereka, seperti kutipan berikut dari template Twig :

$output = $twig->render("Dear {first_name},", array("first_name" => $user.first_name) );
Ini tidak lagi cenderung ke injeksi template sisi server karena nama pengguna pertama hanya dilampaui ke dalam template sebagai data.

Namun, sebagai template benar-benar string, pembangun internet sekarang dan lagi tanpa penundaan menggabungkan orang masuk ke dalam template sebelum rendering. Mari kita ambil contoh yang mirip dengan yang di atas, tetapi kali ini, pelanggan dapat menyesuaikan komponen email sebelum dikirim. Misalnya, mereka mungkin dapat memilih judul yang digunakan :

$output = $twig->render("Dear " . $_GET['name']);

Dalam contoh ini, sebagai alternatif dari biaya statis yang terlampaui ke dalam template, fase dari template itu sendiri secara dinamis dihasilkan dengan menggunakan nama parameter GET. Karena sintaks templat dievaluasi di sisi server, ini pasti mengizinkan penyerang untuk memasukkan muatan injeksi templat sisi server ke dalam parameter identifikasi sebagai berikut:

http://vulnerable-website.com/?name={{bad-stuff-here}}
Kerentanan seperti ini sering disebabkan oleh kecelakaan karena pola template yang buruk oleh orang-orang yang tidak terbiasa dengan implikasi keselamatan. Seperti pada contoh di atas, Anda mungkin juga melihat komponen luar biasa, beberapa di antaranya termasuk input orang, digabungkan, dan disematkan ke dalam template. Dalam beberapa hal, ini sebanding dengan kerentanan injeksi SQL yang terjadi dalam pernyataan terorganisir yang ditulis dengan buruk.

Namun, sekarang dan lagi perilaku ini jelas dilakukan dengan sengaja. Misalnya, beberapa situs web dengan sengaja mengizinkan pengguna dengan hak istimewa yang positif, seperti editor materi konten, untuk mengedit atau memasang template yang disesuaikan dengan menggunakan desain. Ini tanpa diragukan lagi menimbulkan peluang keamanan yang besar jika penyerang mampu berkompromi dengan akun dengan hak istimewa tersebut.

Membangun Serangan Injeksi Template Sisi Server

Mengidentifikasi kerentanan injeksi template sisi server dan menyusun serangan yang menguntungkan biasanya mencakup proses tingkat tinggi berikut.


 

  • Deteksi

Kerentanan injeksi template sisi server sering tidak diperhatikan sekarang bukan karena rumit tetapi karena mereka benar-benar jelas bagi auditor yang secara eksplisit mencari mereka. Jika Anda dapat mengamati bahwa ada kerentanan, akan sangat mudah untuk memanfaatkannya. Ini khusus asli di lingkungan tanpa kotak pasir (unsandboxed environments.).

Seperti halnya kerentanan apa pun, langkah pertama menuju eksploitasi adalah kemampuan untuk menemukannya. Mungkin metode awal yang paling mudah adalah dengan mencoba mengaburkan template dengan menyuntikkan urutan karakter luar biasa dalam banyak contoh yang digunakan dalam ekspresi template, seperti

${{<%[%'"}}%\

Jika pengecualian dimunculkan, ini menunjukkan bahwa sintaks template yang disuntikkan tidak diragukan lagi ditafsirkan oleh server dalam beberapa cara.Ini adalah salah satu sinyal bahwa kerentanan terhadap injeksi template sisi server mungkin juga ada.

Kerentanan injeksi template sisi server terjadi dalam dua konteks yang mengagumkan, yang masing-masing memerlukan metode deteksi pribadinya. Terlepas dari efek upaya fuzzing Anda, perlu juga mencoba pendekatan khusus konteks berikut. Jika fuzzing dulunya tidak meyakinkan, kerentanan juga dapat mengungkapkan sendiri penggunaan salah satu pendekatan ini. Bahkan jika fuzzing memang menyarankan kerentanan injeksi template, Anda tetap ingin menemukan konteksnya untuk memanfaatkannya sebaik mungkin.

  • Konteks Teks

Sebagian besar bahasa templat mengizinkan Anda untuk memasukkan materi konten secara bebas baik melalui penggunaan tag HTML tanpa penundaan atau melalui penggunaan sintaks asli templat, yang akan dirender ke HTML di back-end sebelum respons HTTP dikirim. Misalnya, di Freemarker, baris render('Hello ' + username) akan dirender menjadi sesuatu seperti Hello Carlos.

Ini kadang-kadang dapat dieksploitasi untuk XSS dan sering kali tidak cocok untuk kerentanan XSS yang mudah. Namun, dengan menempatkan operasi matematika sebagai biaya parameter, kita dapat melihat apakah ini juga merupakan faktor masuk yang mungkin untuk serangan injeksi template sisi server.

Misalnya, pikirkan tentang templat yang menyertakan kode rawan berikut :

render('Hello ' + username)

Selama audit, kami mungkin melihat injeksi template sisi server dengan bantuan meminta URL seperti :

http://vulnerable-website.com/?username=${7*7}
Jika keluaran berikutnya menyertakan Hello 49, ini menunjukkan bahwa operasi matematika sedang dievaluasi di sisi server. Ini adalah bukti gagasan yang sesuai untuk kerentanan injeksi template sisi server.

Perhatikan bahwa sintaks tertentu yang diperlukan untuk secara efektif mempertimbangkan operasi matematika akan berbeda bergantung pada mesin templat mana yang digunakan. Kita akan membicarakan hal ini dalam elemen tambahan di langkah Identifikasi.

  • Konteks Kode

Dalam kasus lain, kerentanan terungkap dengan cara pengguna masuk ditempatkan di dalam ekspresi template, seperti yang kami perhatikan sebelumnya dengan contoh email kami. Ini juga dapat mengambil struktur variabel yang dapat dikontrol pengguna yang mengidentifikasi sedang diposisikan di dalam parameter, seperti : 

salam = getQueryParameter('salam') engine.render("Halo {{"+salam+"}}", data)

 Di situs web, URL berikutnya akan seperti :

http://vulnerable-website.com/?greeting=data.namapengguna

Ini akan ditampilkan dalam output ke Hello MataKucing, misalnya.

Konteks ini dengan mudah diabaikan selama evaluasi karena tidak menghasilkan XSS yang jelas dan hampir tidak dapat dibedakan dari pencarian hashmap yang mudah. Salah satu pendekatan untuk memeriksa injeksi template sisi server dalam konteks ini adalah pertama-tama mengatur bahwa parameter tidak memasukkan kerentanan XSS langsung dengan cara menyuntikkan HTML arbitrer ke dalam nilai:

http://vulnerable-website.com/?greeting=data.username<tag>

Dengan tidak adanya XSS, ini biasanya akan menghasilkan entri bersih di output (hanya Halo tanpa nama pengguna), tag yang disandikan, atau pesan kesalahan. Langkah selanjutnya adalah mencoba dan merusak pernyataan penggunaan sintaks templating yang sering dan berusaha untuk menyuntikkan HTML sewenang-wenang setelahnya :

http://vulnerable-website.com/?greeting=data.username}}<tag>

Jika ini sekali lagi menyebabkan kesalahan atau keluaran bersih, Anda berdua menggunakan sintaks dari bahasa templat yang salah atau, jika tidak ada sintaks gaya templat yang tampaknya valid, injeksi templat sisi server tidak lagi dimungkinkan. Atau, jika output dirender dengan benar, bersama dengan HTML arbitrer, ini adalah indikasi utama bahwa ada kerentanan injeksi template sisi server :

Halo MataKucing<tag>

  • Mengenali

Setelah Anda mendeteksi potensi injeksi template, langkah selanjutnya adalah menyadari mesin template.

Meskipun ada berbagai macam bahasa templating, banyak dari mereka menggunakan sintaks yang sangat sebanding yang dipilih secara khusus tidak lagi bertentangan dengan karakter HTML. Akibatnya, akan sangat mudah untuk membuat muatan probing untuk memeriksa mesin template mana yang digunakan.

Cukup mengirimkan sintaks yang tidak valid seringkali cukup karena fakta pesan kesalahan berikutnya akan memberi tahu Anda dengan tepat apa mesin template itu, dan kadang-kadang bahkan versi mana. Misalnya, ekspresi tidak valid <%=foobar%> memicu respons berikut dari mesin ERB berbasis Ruby :

(erb):1:in `<main>': undefined local variable or method `foobar' for main:Object (NameError) from /usr/lib/ruby/2.5.0/erb.rb:876:in `eval' from /usr/lib/ruby/2.5.0/erb.rb:876:in `result' from -e:4:in `<main>'

Jika tidak, Anda mungkin ingin memeriksa secara manual muatan khusus bahasa yang unik dan mempelajari tentang bagaimana mereka ditafsirkan melalui mesin template. Menggunakan teknik menghapus terutama berdasarkan sintaks mana yang tampaknya sah atau tidak valid, Anda dapat menurunkan preferensi lebih cepat daripada yang mungkin Anda pikirkan. Cara yang sering dilakukan adalah dengan menyuntikkan operasi matematika sewenang-wenang menggunakan sintaks dari salah satu mesin template sejenis. Anda kemudian dapat melihat apakah mereka dievaluasi secara efisien atau tidak. Untuk membantu proses ini, Anda dapat menggunakan pohon pilihan yang sebanding dengan yang berikut ini :


 

Anda harus menyadari bahwa muatan yang sama kadang-kadang dapat mengembalikan respons yang menguntungkan dalam lebih dari satu bahasa templat. Misalnya, payload {{7*'7'}} mengembalikan empat puluh sembilan di Twig dan 7777777 di Jinja2. Oleh karena itu, sekarang perlu untuk tidak melompat ke kesimpulan terutama berdasarkan satu tanggapan yang menguntungkan.

Cara Mencegah Kerentanan Injeksi Template Sisi Server

Cara terbaik untuk menghentikan injeksi template sisi server adalah dengan tidak mengizinkan pelanggan mengubah atau memasang template baru. Namun, ini kadang-kadang tidak dapat dihindari karena persyaratan perusahaan.

Salah satu pendekatan termudah untuk menghindari pengenalan kerentanan injeksi template sisi server adalah dengan biasanya menggunakan mesin template "logika-kurang", seperti Kumis, kecuali benar-benar diperlukan. Memisahkan akal sehat dari presentasi sebanyak mungkin dapat secara signifikan meminimalkan publisitas Anda ke serangan berbasis template yang paling berbahaya.

Langkah lain adalah dengan hanya mengeksekusi kode pengguna di lingkungan kotak pasir di mana modul dan fitur yang mungkin berbahaya telah dihilangkan sama sekali. Sayangnya, sandboxing kode tidak tepercaya secara inheren menantang dan cenderung untuk dilewati.

Akhirnya, strategi pelengkap lainnya adalah menerima bahwa eksekusi kode arbitrer tidak dapat dihindari dan amati sandboxing Anda sendiri dengan menggunakan penerapan lingkungan template Anda dalam wadah Docker yang terkunci, misalnya. </main></main></tag></tag></tag>