-
Notifications
You must be signed in to change notification settings - Fork 31
SpEL表达式注入
en0th edited this page Jul 31, 2024
·
5 revisions
SpEL表达式注入漏洞指的是攻击者通过构造恶意的SpEL(Spring Expression Language)表达式,在Spring应用程序中执行任意的Java代码,从而获取系统权限或者窃取敏感数据。SpEL表达式是Spring框架中用来动态计算表达式的一种机制,允许开发人员在配置文件或注解中使用表达式来动态设置参数值。 SpEL表达式注入漏洞通常是由于开发人员在使用SpEL表达式时,没有对用户输入进行充分的验证和过滤,导致攻击者可以在表达式中注入恶意代码。攻击者可以通过修改请求中的参数或者请求头等信息,来触发SpEL表达式注入漏洞。
考察:了解SpEL
参考payload:T(java.lang.Runtime).getRuntime().exec("calc")
PS:这是Windows才有的命令calc
,如果你是按照安装文档安装的,请更换成Linux命令,可以是反弹shell、写计划任务。
在 SpEL 表达式中可以使用T(Type)
来表示java.lang.Class
实例。一旦未对用户输入进行处理就直接通过解析引擎对SpEL 表达式进行解析,就会达到 RCE 的目的。
网络上 Payload 的层出不穷,无法利用黑名单进行防御。不过 String 官方推出了SimpleEvaluationContext
作为安全类进行防御。
代码来源:com/pika/electricrat/spel/SpelServlet.java
public void spelView(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String apply = request.getHeader("apply");
// String spel = "T(java.lang.Runtime).getRuntime().exec("calc")";
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(apply);
System.out.println(expression.getValue().toString());
response.getWriter().append(expression.getValue().toString());
}