1. 程式人生 > >Struts2漏洞分析與研究之Ognl機制探討

Struts2漏洞分析與研究之Ognl機制探討

0、前言

最近專業實訓上需要新增一個struts2的批量利用程式,倒騰半天,我發現我對struts2系列的漏洞根本就不懂,用是會用,但是對我來說還是不夠,網上也沒有什麼好的分析文章來老老實實分析每一個細節。所以我這裡就結合每天的研究寫一些部落格share出來。這是第一篇,也是昨天研究的一部分。

1、概述
在Struts2中,使用Ognl表示式作為字串與物件之間轉換的一種實現,通過Ognl表示式可以輕鬆做到String與Object之間的溝通。 在Struts2工程中,ognl對應的jar包是ognl-2.7.3,附上原始碼來看一下Ognl類的實現。 在Ognl.java中,最基本的兩個方法就是getValue與setValue,傳入三個引數(表示式,上下文以及根物件)。其他的實現都是實現相同的功能。
Ognl的API很簡單,無論什麼複雜的功能,都會通過OGNL的三個要素完成。這三個要素分別是: (1)表示式 表示式(Expression)規定Ognl做些什麼,其本質是一個帶有語法含義的字串。支援的語法非常強大,從物件屬性、方法的訪問到簡單計算,甚至可以進行物件的建立與lambda。 (2)Root物件 這個又稱為根物件,是用來存放執行Ognl的物件。比如要利用Ognl表示式對User物件的name屬性,這時候User物件就是本次操作的根物件(Root)。 (3)上下文環境 Context,這個對有Java開發經驗的人來說並不算新奇,但是對於一般人來說很難理解,Context翻譯為上下文,也可以理解為環境變數,是標明整個執行環境中的引數資訊,預設值等。OGNL的上下文環境其實就是個Map結構,裡面儲存了一些值。
2、基本操作 (1)訪問根物件 訪問根物件的屬性和方法可以不寫物件名前面的"#",使用點號進行訪問即可。 如訪問User根物件的name屬性: OGNL: user.name (2)對上下文的訪問 由於上下文是一個Map結構,訪問這些引數需要通過#符號加上鍊式表示式進行。 如訪問parameter中的name: OGNL:#parameter.name (3)靜態方法/屬性呼叫 通過@[class]@[field/method]訪問,這裡的類名要帶著包名。 如呼叫User中的靜態方法get (4)方法的呼叫 使用點號加方法名稱進行呼叫,而且可以傳遞引數。 如訪問Root物件中的group屬性中的Users的size方法
group.users.size() 此外,Ognl還支援簡單計算,如9 mod 2 取模運算;支援對陣列和容器的訪問,可以按照陣列下標進行訪問,對於Map結構還可以直接使用鍵值來訪問。 還有投影選擇功能,用來篩選資料,這裡不再贅述。 3、深入研究 (1)Context構成 上面是OGNL上下文的結構,在OGNL中使用OgnlContext類進行實現。由上圖可以看到OGNL Context的具體構成。其中的ValueStack叫做值棧,是根物件的實現,在OGNL中則是使用OgnlValueStack實現ValueStack介面來實現這個機制。 那麼如何儲存請求中的多個物件呢?Ognl中使用了CompoundRootroot; 來儲存。CompoundRoot類繼承了ArrayList類,裡面有pop、push方法,很顯然是被做成了一個棧結構,正好解釋了為啥叫ValueStack(值棧)。在上下文中,除了ValueStack,其他都是Map結構,訪問時直接#符號跟名稱即可。 以前沒有閱讀原始碼,我一直認為根物件是獨立與上下文環境而存在,知道看了上下文的實現(OgnlContext中的addDefaultContext方法),這個方法返回預設Map結構,作為Context。方法中還呼叫了setRoot方法將根物件也給附上去了,也就是說這個根物件(ValueStack)也是上下文的一部分。 (2)Context其他重要引數 root(_root):作為根物件的引用。 values(_values):如果自己傳入一個Map作為上下文,那麼也要用OgnlContext進行包裝,這個values就被看做為真正的容器。 ClassResolver(_classResolver):指定類載入機制的處理類,預設使用反射機制動態載入類。 TypeConvert(_typeConverter):處理型別轉化的類。處理字串轉為java型別。 MemeberAccess(_memberAccess):指定了訪問策略的處理方式。 (3)方法/屬性訪問策略MemberAccess 我們知道,在Struts2漏洞中的s2-005的攻擊程式碼中有('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true這麼一句。 這裡就是為了修改上下文中的_memberAccess為true,為啥設定為true呢?  因為預設為false........ 原始碼如下圖: MemberAccess在OGNL中的實現是DefaultMemberAccess,在Struts2中是SecurityMemberAccess。 這裡說一下SecurityMemberAccess: Struts2為了自身機制實現,又把這個memberAccess在OGNL上的實現封裝了一遍,可以其中的allStaticMethodAccess預設是false,也就是說預設不支援靜態方法的執行。 (4)方法/屬性訪問機制-------MethodAccessor和PropertyAccessor 這倆規定了OGNL訪問方法和屬性時的實現方式。在Struts2中,MethodAcccessor的實現類是XWorkMethodAccessor。 (('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false"))) 這句也是攻擊程式碼的一部分,意思是將XWorkMethodAccessor的denyMethodExecution設定為false。 讀原始碼,只有當ReflectionContextState.DENY_INDEXED_ACCESS_EXECUTION為false,方法才可以執行。 具體控制在callStaticMethod中,這裡從上下文中獲取這個值xwork.MethodAccessor.denyMethodExecution ,轉化為Boolean的型別,可以看到,如果沒有設定,預設為False。如果e為false,就return null,方法不會成功執行。 4、總結 OGNL機制是建立在三個基本元素根物件、上下文、表示式的基礎上,其他的實現都是提供一套解析引擎。由於OGNL及其靈活,所以造成了不少的漏洞,想必做安全的大家都會知道,接下來的幾篇我就會從原始碼角度探索Struts2的各個漏洞。 參考資料 Struts2技術內幕 

相關推薦

Struts2漏洞分析研究Ognl機制探討

0、前言 最近專業實訓上需要新增一個struts2的批量利用程式,倒騰半天,我發現我對struts2系列的漏洞根本就不懂,用是會用,但是對我來說還是不夠,網上也沒有什麼好的分析文章來老老實實分析每一

IntelAMT 固件密碼繞過登錄漏洞分析實戰

英特爾 管理工具 系統管理員 計算機 卡洛斯 IntelAMT 固件密碼繞過登錄漏洞分析與實戰Byantian365.com simeon1.1漏洞簡介 2017年5月1日,英特爾公布了AMT漏洞(INTEL-SA-00075),但該漏洞的細節未公開。2017年5月5日,Tenabl

[CVE-2017-5487] WordPress <=4.7.1 REST API 內容註入漏洞分析復現

tps 文章 分析 請求 利用 api文檔 each includes 什麽 不是很新的漏洞,記錄下自己的工作任務 漏洞影響: 未授權獲取發布過文章的其他用戶的用戶名、id 觸發前提:wordpress配置REST API 影響版本:<= 4.7 0x01漏洞

定心丸!ZipperDown漏洞分析修復建議

ZipperDown 漏洞 近日,盤古實驗室對外披露了ZipperDown漏洞,該漏洞是盤古團隊針對不同客戶的iOS應用安全審計的過程中發現的,大約有10%的iOS應用會受到此漏洞的影響。 利用此漏洞可以做很多事情,例如實現目錄遍歷攻擊和App Container目錄中任意文件覆蓋風險……影響究竟有多

演算法分析設計多處最優服務次序問題

#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int main() { int i,n,j,k

演算法分析設計多處最優服務次序問題2

¢ 設有n個顧客同時等待一項服務,顧客i需要的服務時間為ti,1≤i≤n,共有s處可以提供此項服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和除以n。 ¢ 給定的n個顧客需要的服務時間和s的值,程式設計計算最優服務次序。 ¢ 輸入 第一行

算法分析設計多處最優服務次序問題2

循環 sin bsp 一行 print include 對比 進行 ios ¢ 設有n個顧客同時等待一項服務,顧客i需要的服務時間為ti,1≤i≤n,共有s處可以提供此項服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和

nginx漏洞分析升級修復

一 、此次漏洞分析 1 nginx HTTP/2漏洞 [nginx-announce] nginx安全公告(CVE-2018-16843,CVE-2018-16844)在nginx HTTP / 2實現中發現了兩個安全問題,漏洞對伺服器的影響: 可能會導致過多的記憶體消耗(CVE-2018-16843)和

騰訊大牛親授 Web 前後端漏洞分析防禦技巧

第1章 課程介紹介紹安全問題在web開發中的重要性,並對課程整體進行介紹1-1 Web安全課程介紹1-2 專案總覽 第2章 環境搭建本章節我們會搭建專案所需要的環境2-1 環境搭建上2-2 環境搭建下 第3章 前端XSS系統介紹XSS攻擊的原理、危害,以真實案例講解XSS帶來過的損失,最後以實戰程式碼講解

python資料分析挖掘資料清洗

        資料探索的目的是及早發現數據的一些簡單規律或特徵,資料清洗的目的是留下可靠的資料,避免髒資料的干擾。 這兩者沒有嚴格的先後順序,經常在一個階段進行。    &nb

python資料分析挖掘聚類kmeans演算法

聚類不指定類別進行分類 (劃分(分裂)法,層次分析法、密度分析法)、網格法、模型法     Kmeans演算法屬於分裂法 隨機選擇k各點作為聚類中心 計算各個點到這K個點的距離   將對應的點聚到與它最近的這個聚類中心 重新

python資料分析挖掘貝葉斯演算法演算法實現

程式碼中有詳細的註釋 訓練檔案: Txt檔案中為0,1矩陣,將圖片轉換為0,1矩陣見上一篇部落格方法 import numpy import operator from os import listdir class Bayes: def __init__(self):

資料分析挖掘資料預處理

目錄 資料整合 簡單變換 資料整合 #資料整合 import numpy a=numpy.array([[1,5,6],[9,4,3]]) b=numpy.array([[6,36,7],[2,3,39]]) c=numpy.conca

struts2 漏洞分析 及解決辦法

1.討論關於struts 安全問題。 2.黑客文化。 3.如何降低安全漏洞的出現。 4.忠告建議。 題記: 這篇文章本來很早應該和大家見面的,中間由於個人原因調整了系列文章釋出時間,實屬罪過。為了不誤導大眾文章中間講述的經歷想法實戰,均屬個人看法個人行為不代表任

C++(14)STL分析實踐容器介面卡

STL實踐與分析 --容器介面卡 引: 除了順序容器,標準庫還提供了三種順序容器介面卡:queue,priority_queue和stack,介面卡是標準庫中的概念,包

SSRF漏洞分析利用

轉自:http://www.4o4notfound.org/index.php/archives/33/#pingback-26 作者: 404notfound 時間: 2017-05-25 分類: 網路安全,程式碼審計 瀏覽: 5812 前言:總結了一些常見的姿勢,以PH

Web 前後端漏洞分析防禦技巧

pan style href 防禦 漏洞分析 ron 網盤 html strong 騰訊大牛親授 Web 前後端漏洞分析與防禦技巧 項目終於上線了,卻面臨安全威脅,你怕不怕?本課程以一個實戰項目演示XSS、CSRF、點擊劫持、SQL註入等主要安全問題和防禦措施,打消你對項目

懸鏡安全丨Java 反序列化任意程式碼執行漏洞分析利用

本文首發平臺:懸鏡官網,如需轉載,請聯絡小編,謝謝。        2015年的1月28號,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上給出了一個報告[3],報告中介紹了Java反序列化漏洞可以利用Apache Commons

騰訊大牛教你web前後端漏洞分析防禦-XSS

所謂的安全,其實是指兩個方面 私密性:不被非法獲取和利用(Get) 程式碼層面 架構層面 運維層面 問題 使用者身份被盜用 使用者密碼洩露 使用者資料被盜取 網站資料庫洩露 其他 可靠性:不丟失不損壞不被篡改 搭建測試環境 測試環境是用Koa搭

[轉]資料分析處理二:Leveldb 實現原理

鄭重宣告:本篇部落格是自己學習 Leveldb 實現原理時參考了郎格科技系列部落格整理的,原文地址:LevelDb日知錄之一:LevelDb 101  說起LevelDb也許您不清楚,但是如果作為IT工程師,不知道下面兩位大神級別的工程師,那您的領導估計會Hold不住了:Je