1. 程式人生 > 其它 >57:程式碼審計-JAVA專案框架類漏洞分析報告

57:程式碼審計-JAVA專案框架類漏洞分析報告

思維導圖

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

過濾器&攔截器區別:

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

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

struts執行流程

術語解釋:

  • 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安全系列]