1、介紹
表達(dá)式語言(Expression Language)簡稱 EL 表達(dá)式,是一種 JSP 內(nèi)置的語言。
在 JSP 中,使用 {name} 表示獲取 name 變量。
在 EL 表達(dá)式中有兩種獲取對象屬性的方法,第一種為 {param[name]}
2、實例
使用實例
使用 param 對象獲取用戶傳入的參數(shù)值,這里的 ${param.name} 相當(dāng)于 request.getParameter("name")
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>EL 表達(dá)式實例頁面</title>
</head>
<body>
<h3>輸入的 name 值為:${param.name}</h3>
</body>
</html>
這樣當(dāng)我們訪問 http://xxx:8080/xxx/?name=teamssix 的時候,頁面就會返回「輸入的 name 值為:teamssix」
EL 表達(dá)式也可以實例化 Java 的內(nèi)置類,比如 Runtime.class 會執(zhí)行系統(tǒng)命令
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>EL 表達(dá)式實例頁面</title>
</head>
<body>
${Runtime.getRuntime().exec("calc")}
</body>
</html>
當(dāng)執(zhí)行該頁面代碼時,就可以看到計算器被彈出來了,不過前提是 Tomcat 被部署在 Windows 下,如果在 Linux 下則需要將 calc 換成其他命令,不然會報錯 500
Spring 標(biāo)簽 EL 表達(dá)式漏洞(CVE-2011-2730)
在歷史上出現(xiàn)過一個 Spring 標(biāo)簽 EL 表達(dá)式漏洞(CVE-2011-2730),Spring 表達(dá)式語言(SpEL)是一種與 EL 功能類似的表達(dá)式語言。
在未對用戶的輸入做嚴(yán)格檢查并且錯誤的使用 Spring 表達(dá)式語言時就可能產(chǎn)生表達(dá)式注入漏洞。
在 SpEL 的 Evaluation 接口中,有兩個實現(xiàn)方法,分別為 SimpleEvaluationContext 和 StandardEvaluationContext 方法,其中前者權(quán)限比較小,后者權(quán)限比較大,因此當(dāng)使用 StandardEvaluation 方法時,就可以利用 Runtime.class 方法執(zhí)行命令,例如以下代碼:
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class SpEL {
public static void mian(String[] args) {
String expressionstr = "T(Runtime).getRuntime().exec(\"open -a Calculator\")";
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext evaluationContext = new StandardEvaluationContext();
Expression expression = parser.parseExpression(expressionstr);
System.out.println(expression.getValue(evaluationContext));
}
}
Spring Data Commons 遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2018-1273)
對于 2018 年出的 Spring Data Commons RCE 漏洞,RT 可以通過構(gòu)造 SpEL 表達(dá)式實現(xiàn) RCE
通過觀察官方補丁,可以發(fā)現(xiàn)正是將原來的 StandardEvaluationContext 方法換成了 SimpleEvaluationContext 方法。
175 - StandardEvaluationContext context = new StandardEvaluationContext();
180 + EvaluationContext context = SimpleEvaluationContext
參考文章:
https://blog.csdn.net/lup7in/article/details/8659408
https://misakikata.github.io/2018/09/%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B3%A8%E5%85%A5/
原文鏈接: