57:代碼審計-JAVA項目框架類漏洞分析報告


思維導圖

案例1:過濾器及攔截器相關區別解釋

過濾器&攔截器區別:

  • Filter是基於函數回調的,而Interceptor這是基於Java反射的。
  • Filter依賴於Servlet容器,而Interceptor不依賴於Servlet容器。
  • Filter對幾乎所有的請求起作用,而Interceptor只能對action請求起作用。
  • Interceptor可以訪問Action的上下文,值棧里的對象,而Filter不能。
  • 最重要的要記住他們的執行順序:先Filter后Interceptor,另外在不同框架中有的是自帶,有的是需要自寫,具體可以查看開發資料。

案例2:Struts2-016遠程代碼執行漏洞分析-黑盒流程

struts執行流程

0

術語解釋:

  • 1、HttpServletRequest 請求信息
  • 2、ActionContextCleanUp 不重要,現在貌似不用了
  • 3、Other filters 不重要,現在貌似不用了
  • 4、Filter Dispatcher 過濾器,這個應該是最底層的過濾器
  • 5、ActionMapper Struts2中主要檢測請求信息是否需要Struts2處理
  • 6、ActionProxy 一個中間層,就是可以調用其他類什么的
  • 7、ConfigurationManger 負責將Struts.xml配置文件映射到內存中去
  • 8、Struts.xml Struts.xml配置文件需要程序員填寫
  • 9、ActionInvocation 包含四個屬性分別獲取前端傳遞的值,action,struts.xml信息,其他一些數據。
  • 10、Interceptor 攔截器
  • 11、Tag Subsystem Struts2自帶標簽庫 沒用
  • 12、Templete struts2的前端模板,沒用吧,不清楚
  • 13、HttpServletResponse 響應用戶的類

Struts2詳細執行流程自己總結:https://blog.csdn.net/qq_33322074/article/details/80137667

Struts2 有漏洞,一般在傳統企業會用一點,比如:物流,erp 等 ,面試的時候要求你了解Struts的執行流程 ,真實工作開發中一般用的少一些。BS架構web項目SpringMVC ,SpringBoot,SpringCloud 企業中用的相對多一些。

Struts2-016遠程代碼執行漏洞官方描述:

struts2的defaultActionMapper支持一種方法,可以使用“action:”,“redirect:”,“redirectAction:”對輸入信息進行處理,從而改變前綴參數,這樣操作的目的是方便表單中的操作。在2.3.15.1版本以前的struts2中,沒有對“action:”,“redirect:”,“redirectAction:”等進行處理,導致ongl表達式可以被執行。

該漏洞利用st2特性:1.路由;2.ONGL表達式;3.執行流程

斷點調試查看執行代碼文件分析

根據st2框架執行流程測試:對比上圖

<1>查看web.xml可知,所有的.action請求都經過struts2過濾器

<2>斷點調試,未觸發關鍵字-斷點文件-調試到過濾器

在rasp.jsp頁面第一行代碼處打一個斷點

發送一個普通請求(未觸發關鍵字),發現調試到過濾器,執行了execute方法

<3>斷點調試,觸發關鍵字-斷點文件-未調試到過濾器

同樣在rasp.jsp頁面第一行代碼處打一個斷點

發送一個包含關鍵字redirect的請求(觸發關鍵字),發現未調試到過濾器,也未執行execute方法

總結漏洞成因,簡單來說,結束本來所有.action請求都經過過濾器,執行execute方法,但是由於st2框架自身特性,當請求中有redirect、redirectAction、method、action四個關鍵字時,請求會繞過過濾器,直接與系統交互,從而造成漏洞。

分析審計思路:

1.獲取配置信息:過濾器(攔截器),框架包,觸發請求,框架特性(ognl,路由等)

2.打開st2對應過濾器,配合st2路由配置文件,解讀:

分析開源框架的漏洞還是從其源碼入手,問題出在了DefaultActionMapper上,這個類主要是用來處理一些靈活的URL調用,比如處理Action中動態調用方法的形式,如

http://www.foo.com/bar/hello.action?foo!bar

foo!bar這種形式是動態的調用action中的方法,其中foo是action,bar是方法名,但是調用的前提是在strtus.xml中事先進行配置。當然這只是一種,這個類還有個重要的作用就是處理redirect、redirectAction、method、action

method用來動態指明調用的方法,如調用hello中的execute方法,則可以傳入url為:http;//www.foo.com/bar/hello.action?method:execute。

action用來指定其他的action,有了這個前綴,URL中的默認Action的execute方法不會被執行,而是執行其他action中的execute方法。

redirect一旦寫定,同樣不會執行默認action中的execute方法,而是重定向到其他的頁面,內部通過ServletRedirectResult完成執行。

redirectAction同樣會屏蔽默認action的方法,而是重定向到其他的Action,同樣依靠ServletRedirectResult實現任務。

至於為什么redirect后面的東西就會當做Ognl執行呢? 參考 Struts2漏洞之S2-016漏洞分析與exp編寫:https://blog.csdn.net/u011721501/article/details/41735885

OGNL,全稱叫Object Graphic Navigation Language(對象圖導航語言),是應用於Java中的一個開源的表達式語言(Expression Language),它被集成在Struts2等框架中,作用是對數據進行訪問,它擁有類型轉換、訪問對象方法、操作集合對象等功能。

總之,S2-016的根本原因就是沒有對幾個前綴的后面進行嚴格的過濾,導致黑客可以傳入符合Ognl表達式語法規則的字符串,使得Struts2將其當做Ognl表達式在ValueStack中執行,從而造成了任意命令的執行,getshell啊、列目錄、echo上傳,本質上都是執行java代碼。

3.payload加上路由關鍵字進行OGNL表達式接受處理執行

總結審計思路-struts

  • 已知漏洞:找框架自身的版本,利用漏洞庫去確定漏洞
  • 未知漏洞:執行流程,過濾器,攔截器,框架特性
  • 驗證:采用斷點調試,確定.action文件斷點后,無法攔截執行請求,說明滿足路由規則請求方法后跳出過濾攔截器,繞過實現ongl表達式漏洞。

案例3:SpringBoot-SpELl表達式注入漏洞分析-白盒思路

Spring Expression Language(縮寫為SpEL)是一種強大的表達式語言。在Spring產品組合中,它是表達式計算的基礎。它支持在運行時查詢和操作對象圖,它可以與基於XML和基於注解的Spring配置還有bean定義一起使用。由於它能夠在運行時動態分配值,因此可以為我們節省大量Java代碼。

審計思路-spring

  • 已知漏洞:找框架自身的版本,利用漏洞庫去確定漏洞,有spel表達式注入漏洞
  • 未知漏洞:從自身源碼分析到文件sql語句中有注入漏洞,嘗試成功(未發現過濾器及攔截器)

1.SpringBoot SpEL表達式注入漏洞-分析與復現:https://www.cnblogs.com/litlife/p/10183137.html

2.sql注入漏洞

總結:

  • 1.先確定源碼中是否存在框架-
    • 執行流程,特性(表達式,攔截器或過濾器自帶或自寫?)
    • 已知的框架版本漏洞 利用
  • 2.確定源碼中是否存在過濾器-自帶或引用或自定義攔截規則
  • 3.過濾器中怎么觸發,過濾器規則

學習

攻擊JavaWeb應用[1]-javaEE基礎:https://www.cnblogs.com/studyskill/p/6957194.htmll
攻擊JavaWeb應用1-9[JavaWeb安全系列]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM