Devran Atuğ tarafından yazılmıştır.
Eskiden web siteleri frontend ve backend olarak sadece kodlanır ve yayınlanırdı. Günümüzde ise artık web sitelerinin adı web uygulamaları içinde geçiyor. Web uygulamaları inanılmaz bir şekilde hızlandı ve gelişti, bu yüzden farklı web sistemleri ortaya çıktı. Bunlardan biride MVC mimarisi oldu. Bu tür mimarilerin ortaya çıkması asıl amaçlarında bir tanesi karışık kod ortamından kurtarılması ve okunaklı bir ortam oluşturulması idi ve Template uygulamaları ise MVC mimarisi üzerine kuruldu.
Kullanıcı tarafından web sitesine istek atılıyor bu istek ilk olarak Controller tarafından karşılanıyor sonrasında ise Model kısmından veriler (resim vb.) alınır. View katmanında şekil alır ve kullanıcıya iletilir. İsteklerde eğer işlenecek veri varsa tekrardan Controller kısmında bu işlem gerçekleşir ve tekrardan kullanıcıya iletilir. Asıl sıkıntılı kısım Controller katmanında gerçekleşiyor. Hacker tarafından girilen payload dizileri işlenir iken template bu girdileri işler ve kullanıcıya iletir.
Yukarıdaki görülen şablonda hacker tarafından SSTI acığını sömürmesi ve tespit etmesi için izleyeceği yollar bulunuyor. Bunlar üzerinden uygulama hangi template üzerinden yazıldığını anlamış oluruz bu sayede sömürüde kullanabileceğimiz payload dizilerini öğrenmiş oluruz. SSTI açığı bulunan web uygulamalarında risk çok yüksektir. Bu acık uzaktan kod çalıştırmaya kadar gidebilir.
SSTI Payload dizelerini bulabileceğininiz bazı yerler:
1-) Hacktricks
2-) PayloadsAllTheThings
(Hackerone üzerinden yayınlanmış raporlar hakkında bilgi edinebilirsiniz.)
Zaafiyetli Kod Yapısı:
Kullanıcıdan alınan isim bilgisi “$name” değişkenine alınıyor. Bu “$name” değişkeni “$result” değişkeni içerisinde twig template tarafından render ediliyor. Sonrasında ekran yazılıyor bu şekilde hiçbir önlem alınamıyor ve render kısımlarında SSTI açığı ortaya cıkıyor.
Yukarıda görülen kod örneğinde kodu güvenliği sağlanmış. Tekrardan kullanıcıdan isim bilgisi alındı ve “$result” değişkeninde işleme alınıyor. Twig uzantılı dosyaya name değişkeni alınıyor ve twig formatı ile render yapılıyor, sonrasında tekrardan name değişkenine atanıyor ve ekrana yazlıyor. Anlayacağınız ana kod içerisinde bu işlem yapılmıyor ve bu yüzden işlem sorunsuz yapılabiliyor.
[TR] Server Side Template Injection(SSTI) Nedir?
Eskiden web siteleri frontend ve backend olarak sadece kodlanır ve yayınlanırdı. Günümüzde ise artık web sitelerinin adı web uygulamaları içinde geçiyor. Web uygulamaları inanılmaz bir şekilde hızlandı ve gelişti, bu yüzden farklı web sistemleri ortaya çıktı. Bunlardan biride MVC mimarisi oldu. Bu tür mimarilerin ortaya çıkması asıl amaçlarında bir tanesi karışık kod ortamından kurtarılması ve okunaklı bir ortam oluşturulması idi ve Template uygulamaları ise MVC mimarisi üzerine kuruldu.
Kullanıcı tarafından web sitesine istek atılıyor bu istek ilk olarak Controller tarafından karşılanıyor sonrasında ise Model kısmından veriler (resim vb.) alınır. View katmanında şekil alır ve kullanıcıya iletilir. İsteklerde eğer işlenecek veri varsa tekrardan Controller kısmında bu işlem gerçekleşir ve tekrardan kullanıcıya iletilir. Asıl sıkıntılı kısım Controller katmanında gerçekleşiyor. Hacker tarafından girilen payload dizileri işlenir iken template bu girdileri işler ve kullanıcıya iletir.
Server Site Template Nasıl Sömürülür ?
Yukarıdaki görülen şablonda hacker tarafından SSTI acığını sömürmesi ve tespit etmesi için izleyeceği yollar bulunuyor. Bunlar üzerinden uygulama hangi template üzerinden yazıldığını anlamış oluruz bu sayede sömürüde kullanabileceğimiz payload dizilerini öğrenmiş oluruz. SSTI açığı bulunan web uygulamalarında risk çok yüksektir. Bu acık uzaktan kod çalıştırmaya kadar gidebilir.
SSTI Payload dizelerini bulabileceğininiz bazı yerler:
1-) Hacktricks
2-) PayloadsAllTheThings
(Hackerone üzerinden yayınlanmış raporlar hakkında bilgi edinebilirsiniz.)
Kod örnekleri
Zaafiyetli Kod Yapısı:
<?php
[B][I]include 'vendor/twig/twig/lib/Twig/Autoloader.php';[/I][/B]
[B][I]$name = $_GET['name'];[/I][/B]
[B][I]Twig_Autoloader::register();[/I][/B]
[B][I]$loader = new Twig_Loader_String();[/I][/B]
[B][I]$twig = new Twig_Environment($loader);[/I][/B]
[B][I]$result = $twig->render($name);[/I][/B]
[B][I]echo $result;[/I][/B]
?>
Kullanıcıdan alınan isim bilgisi “$name” değişkenine alınıyor. Bu “$name” değişkeni “$result” değişkeni içerisinde twig template tarafından render ediliyor. Sonrasında ekran yazılıyor bu şekilde hiçbir önlem alınamıyor ve render kısımlarında SSTI açığı ortaya cıkıyor.
[B][I]<?php[/I][/B]
[B][I]include 'vendor/twig/twig/lib/Twig/Autoloader.php';[/I][/B]
[B][I]$name = $_GET['name'];[/I][/B]
[B][I]Twig_Autoloader::register();[/I][/B]
[B][I]$loader = new Twig_Loader_String();[/I][/B]
[B][I]$twig = new Twig_Environment($loader);[/I][/B]
[B][I]$result = $twig->render(‘test.twig’, [[/I][/B]
[B][I]‘name’ => $name,[/I][/B]
[B][I]]);[/I][/B]
[B][I]echo $result;[/I][/B]
?>
Yukarıda görülen kod örneğinde kodu güvenliği sağlanmış. Tekrardan kullanıcıdan isim bilgisi alındı ve “$result” değişkeninde işleme alınıyor. Twig uzantılı dosyaya name değişkeni alınıyor ve twig formatı ile render yapılıyor, sonrasında tekrardan name değişkenine atanıyor ve ekrana yazlıyor. Anlayacağınız ana kod içerisinde bu işlem yapılmıyor ve bu yüzden işlem sorunsuz yapılabiliyor.
Moderatör tarafında düzenlendi: