Java Web常見框架尋找路由技巧

在Java Web代碼審計中,尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller,其作為MVC架構中的一個組件,可以說是每個用戶交互的入口點。簡單介紹下Java Web中常見框架(Spring Web、Jersey)尋找路由技巧。

0x00 前言

在Java Web代碼審計中,尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller,其作為MVC架構中的一個組件,可以說是每個用戶交互的入口點。主要負責以下幾個方面的任務:

  1. 請求分發:控制器接收來自用戶的HTTP請求,并根據請求的URL和HTTP方法(如GET、POST等)將請求分發到相應的處理方法。
  2. 參數綁定:控制器將請求中的參數(如查詢參數、表單數據、JSON對象等)綁定到處理方法的參數上。
  3. 業務邏輯調用:控制器調用服務層(Service Layer)的組件來執行業務邏輯,如數據處理、計算等。
  4. 異常處理:控制器負責處理業務邏輯中可能拋出的異常,并返回適當的錯誤響應或重定向。
  5. 響應生成:控制器根據業務邏輯的結果生成響應,這可能包括渲染視圖、返回JSON數據、重定向到其他頁面等。

一般在代碼審計時都會逐個分析對應的實現,通過梳理對應的路由接口并檢查對應的業務實現,能幫助我們快速的檢索代碼中存在的漏洞缺陷,發現潛在的業務風險。下面簡單介紹下Java Web中常見框架(Spring Web、Jersey)尋找路由技巧。

0x01 獲取路由的技巧

大多數Java Web框架遵循MVC(Model-View-Controller)架構。了解框架的架構和約定可以快速定位。下面簡單介紹下一些技巧:

1.1 關鍵字匹配

可以直接通過Controller的定義來尋找路由。

大多數框架都有約定俗成的項目結構,控制器通常位于特定的包或目錄中。例如,在Spring MVC項目中,控制器類可能位于controller包下。

并且很多Java Web框架都會使用注解來標識控制器和映射請求。例如,在Spring MVC中,@Controller注解用于標記控制器類,@RequestMapping用于定義請求映射。在其他框架中,如Jersey(JAX-RS),就是@Path和@POST、@GET等注解。

當然還有一些特定的配置類,例如在Spring中,在Jersey中,ResourceConfig類常用于配置路由。

可以通過關鍵字匹配的方式獲取到對應的資源目錄,然后逐個進行審計。下面是一些關鍵字的總結:

1.1.1 Spring MVC

常見的注解如下:

  • @Controller
  • @RestController
  • @RequestMapping
  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

除了使用注解的方式,還可以在對應的xml配置文件中通過配置Controller相關的bean來實現。例如下面的例子:

在spring的配置文件中做如下配置:

<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 處理器 -->
<bean name="/userInfo" class="com.springmvc.test.UserController" />

相關的作用如下:

  • BeanNameUrlHandlerMapping:表示將請求的URL與Bean名字進行映射。
  • SimpleControllerHandlerAdapter:表示所有實現了org.springframework.web.servlet.mvc.Controller接口的Bean可以作為Spring Web MVC中的Controller。

1.1.2 Spring WebFlux

上面提到的注解在 WebFlux 中依然還可以繼續使用,不過 WebFlux 也提供了自己的方案Router。

其定義Controller與傳統的Spring MVC有所不同,因為WebFlux是基于響應式編程模型的。在WebFlux中,需要使用RouterFunction來路由請求到對應的處理方法。例如下面的例子:

@Configuration
public class RouterConfig {@Autowiredprivate ShowAction showAction;@Beanpublic RouterFunction timerRouter() {return RouterFunctions.route(RequestPredicates.GET("/hello"), showAction::hello).andRoute(RequestPredicates.GET("/time"), showAction::showTime).andRoute(RequestPredicates.GET("/date"), showAction::showDate).andRoute(RequestPredicates.GET("/times"), showAction::sendTimePerSec);}
}

1.1.3 Jersey

在Jersey中在資源類上使用@Path注解來定義基礎路徑,然后在資源方法上使用額外的@Path注解來指定具體的子路徑。例如下面的例子

@Component
@Path("/hello")
public class HelloWorldResource {@GET@Produces(MediaType.TEXT_PLAIN)public String sayHello() {return "hello world.";}
}

然后通過ResourceConfig類來配置資源和路由即可:

@Component
public class AppConfig extends ResourceConfig {AppConfig() {register(HelloWorldResource.class);}
}

常見的注解如下:

  • @Path
  • @GET
  • @POST
  • @PUT
  • @PATCH
  • @Delete
  • @HttpMethod

1.2 相關IDE插件

RestfulToolkit是一個RESTful 服務開發輔助工具集。可以根據 URI 直接跳轉到對應的方法定義:

image.png

通過這個插件可以快速查找到對應的接口位置,很多時候我們知道一個api接口,想知道這個接口對應的類和位置時,查找起來很麻煩,這個插件可以很方便解決這個問題:

image.png

通過該插件可以很方便的對應用注冊的路由逐個進行分析。強迫癥提出一個問題,通過上述方法獲取到的路由就一定全嗎,會不會有遺漏的地方,如果路由信息在jar依賴里引入的能保證獲取全嗎?

image.png

1.3 結合Debug斷點獲取

結合上面的疑惑,很多時候應用會在框架的基礎上進行魔改,然后對Controller進行拓展。例如下面的例子,自定義了一個注解@BuyerController:

image.png

然后定義了具體的Controller以及業務邏輯:

image.png

但是通過RestfulToolkit并不能獲取到對應路由的定義:

image.png

而該路由對應的資源實際上是可以正常訪問的:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

那么此時如果僅僅依賴關鍵字或者IDE插件的方式進行匹配的話,很可能會有遺漏。

實際上我們可以通過分析代碼,跟蹤HTTP請求是如何被框架處理的,對識別負責處理特定請求的控制器也會有一定的幫助。如果可以對應用進行調試的話,通過在對應的位置下斷點,即可獲取對應框架所注冊的全部路由:

1.2.1 Spring MVC

當一個HTTP請求到達Spring Web應用程序時,AbstractHandlerMethodMapping 類(或其子類,如 RequestMappingHandlerMapping)會使用 lookupHandlerMethod 方法來確定哪個控制器(controller)中的方法應該被調用來處理該請求。通過org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#lookupHandlerMethod的mappingRegistry可以快速的獲取應用注冊的路由信息:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

同樣是上面對Controller進行拓展的例子,除了常規的路由以外,可以看到對應的拓展Controller的路由信息同樣也獲取到了:

image.png

1.2.2 Spring WebFlux

同樣的,在Spring WebFlux中,則可以通過org.springframework.web.reactive.result.method.AbstractHandlerMethodMapping#lookupHandlerMethod進行注冊路由的獲取:

image.png

可以看到通過mappingRegistry可以獲取到當前應用注冊的路由信息:

image.png

1.2.3 Jersey

在Jersey中,則可以通過org.glassfish.jersey.server.ApplicationHandler#initialize獲取jersey注冊的router,其的作用是初始化應用程序的請求處理,通過該方法可以查找并注冊應用程序中的資源類(Resources)和提供者(Providers),如異常處理器、攔截器、實體過濾器等。例如根據資源類上的注解(如 @Path)和其他配置信息,配置請求到資源方法的路由:

在這里插入圖片描述

可以看到通過routingStage可以獲取到當前jersey注冊的router:

image.png

0x02 其他

通過上面的幾種方式,可以快速的定位并梳理對應的路由接口,快速的開展后續的審計工作。

除了上面提到的框架以外,類似JFinal、Struts在Java生態中也有一定的占有量。對應的方法是類似的,例如JFinal會使用Routes.add()方法,向Routes添加Controller的router定義,這里就不再展開討論了。

今天只要你給我的文章點贊,我私藏的網安學習資料一樣免費共享給你們,來看看有哪些東西。

網絡安全學習資源分享:

給大家分享我自己學習的一份全套的網絡安全學習資料,希望對想學習 網絡安全的小伙伴們有幫助!

零基礎入門

對于從來沒有接觸過網絡安全的同學,我們幫你準備了詳細的學習成長路線圖。可以說是最科學最系統的學習路線,大家跟著這個大的方向學習準沒問題。

【點擊免費領取】CSDN大禮包:《黑客&網絡安全入門&進階學習資源包》

1.學習路線圖

在這里插入圖片描述

攻擊和防守要學的東西也不少,具體要學的東西我都寫在了上面的路線圖,如果你能學完它們,你去接私活完全沒有問題。

2.視頻教程

網上雖然也有很多的學習資源,但基本上都殘缺不全的,這是我自己錄的網安視頻教程,上面路線圖的每一個知識點,我都有配套的視頻講解。【點擊領取視頻教程】

在這里插入圖片描述

技術文檔也是我自己整理的,包括我參加大型網安行動、CTF和挖SRC漏洞的經驗和技術要點,電子書也有200多本【點擊領取技術文檔】

在這里插入圖片描述

(都打包成一塊的了,不能一一展開,總共300多集)

3.技術文檔和電子書

技術文檔也是我自己整理的,包括我參加大型網安行動、CTF和挖SRC漏洞的經驗和技術要點,電子書也有200多本【點擊領取書籍】

在這里插入圖片描述

4.工具包、面試題和源碼

“工欲善其事必先利其器”我為大家總結出了最受歡迎的幾十款款黑客工具。涉及范圍主要集中在 信息收集、Android黑客工具、自動化工具、網絡釣魚等,感興趣的同學不容錯過。

在這里插入圖片描述

最后就是我這幾年整理的網安方面的面試題,如果你是要找網安方面的工作,它們絕對能幫你大忙。

這些題目都是大家在面試深信服、奇安信、騰訊或者其它大廠面試時經常遇到的,如果大家有好的題目或者好的見解歡迎分享。

參考解析:深信服官網、奇安信官網、Freebuf、csdn等

內容特點:條理清晰,含圖像化表示更加易懂。

內容概要:包括 內網、操作系統、協議、滲透測試、安服、漏洞、注入、XSS、CSRF、SSRF、文件上傳、文件下載、文件包含、XXE、邏輯漏洞、工具、SQLmap、NMAP、BP、MSF…

在這里插入圖片描述

👋全套《黑客&網絡安全入門&進階學習資源包》👇👇👇

這份完整版的學習資料已經上傳CSDN,也可以微信掃描下方CSDN官方認證二維碼免費領取【保證100%免費

img

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46101.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SASS/SCSS(二)】模塊化語法

目錄 一、use 1、命名空間 2、私有變量 3、用with改變模塊中的默認值 二、forward 1、給forward模塊起別名&#xff0c;讓成員加前綴 2、利用hide or show手動控制成員的可訪問性 三、import 1、不存在命名空間&#xff0c;成員變量在import之后直接公開 2、可以在嵌…

springboot防止重復提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表單重復提交有多種策略&#xff0c;以下是幾種常見且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按鈕&#xff1a;在表單提交后&#xff0c;使用JavaScript立即禁用提交按鈕&#xff0c;防止用戶再次點擊。響應式提示&#x…

十、Java集合 ★ ?(模塊18-20)【泛型、通配符、List、Set、TreeSet、自然排序和比較器排序、Collections、可變參數、Map】

day05 泛型,數據結構,List,Set 今日目標 泛型使用 數據結構 List Set 1 泛型 1.1 泛型的介紹 ★ 泛型是一種類型參數&#xff0c;專門用來保存類型用的 最早接觸泛型是在ArrayList&#xff0c;這個E就是所謂的泛型了。使用ArrayList時&#xff0c;只要給E指定某一個類型…

講真,現在留給2024年下半年軟考的時間還夠嗎?

常識是個好東西&#xff0c;但是有時候卻容易蒙蔽咱們的雙眼&#xff0c;就拿下半年軟考而言&#xff0c;看起來現在才7月份&#xff0c;剛剛入伏&#xff0c;考試要到11月份&#xff0c;是冬天呢&#xff0c;中間還隔了一個完整的秋季&#xff0c;常識感覺還很遙遠&#xff0c…

【Vue3】4個比較重要的設計模式!!

大家好,我是CodeQi! 一位熱衷于技術分享的碼仔。 在我投身于前端開發的職業生涯期間,曾有一次承接了一個大型項目的維護工作。此項目運用的是 Vue 框架,然而其代碼結構紊亂不堪,可維護性極度糟糕??。 這使我深刻領會到,理解并運用 Vue 中的重要設計模式是何等關鍵! …

對LinkedList ,單鏈表和雙鏈表的理解

一.ArrayList的缺陷 二.鏈表 三.鏈表部分相關oj面試題 四.LinkedList的模擬實現 五.LinkedList的使用 六.ArrayList和LinkedList的區別 一.ArrayList的缺陷: 1. ArrayList底層使用 數組 來存儲元素&#xff0c;如果不熟悉可以來再看看&#xff1a; ArrayList與順序表-CSDN…

一些常見的網絡故障

&#x1f4d1;打牌 &#xff1a; da pai ge的個人主頁 &#x1f324;?個人專欄 &#xff1a; da pai ge的博客專欄 ??寶劍鋒從磨礪出&#xff0c;梅花香自苦寒來 ??運維工程師的職責&#xff1a;監…

【數據分析】Python數據分析實戰:從零開始構建數據管道

Python數據分析實戰&#xff1a;從零開始構建數據管道 引言一、數據獲取二、數據清洗三、數據分析四、數據可視化五、案例研究&#xff1a;預測股票價格結論 我嘗試訪問您所提供的鏈接&#xff0c;但似乎該鏈接指向的內容已失效或被移除&#xff0c;因此無法直接獲取并閱讀該文…

【iOS】——ARC源碼探究

一、ARC介紹 ARC的全稱Auto Reference Counting. 也就是自動引用計數。使用MRC時開發者不得不花大量的時間在內存管理上&#xff0c;并且容易出現內存泄漏或者release一個已被釋放的對象&#xff0c;導致crash。后來&#xff0c;Apple引入了ARC。使用ARC&#xff0c;開發者不再…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查殼&#xff0c;本題是32位&#xff0c;有殼&#xff0c;進行脫殼。 第二步 這里的 jnz 指令會實現一個跳轉&#xff0c;并且下面的0EC85D78Bh被標紅了&#xff0c;應該是一個不存在的地址&#xff0c;這些東西就會導致IDA無法正常反匯編出原始代碼&#xff0c;也稱…

中文科技核心論文發表

中文科技核心論文題目如下&#xff1a; 1.混凝土結構用纖維增強塑料筋的耐久性評述&#xff1a;適合建筑、結構、材料等專業 2.建筑工程用阻燃塑料的研究進展&#xff1a;適合建筑、材料專業 3.纖維增強熱塑性塑料在面部護具中的應用研究&#xff1a;適合化工、醫學、材料等專…

springcloud2021.x使用nacos做配置中心

spirngcloud2021.0.5使用nacos做配置中心遇到的問題 環境 jdk1.8&#xff0c;spring-boot 2.6.13&#xff0c;spring-cloud-alibaba 2021.0.5.0 &#xff0c;spring-cloud 2021.0.5 方案一 application.properties # Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts…

C++中的condition_variable:條件變量

理解 C 中的條件變量&#xff08;Condition Variable&#xff09; 在多線程編程中&#xff0c;我們常常需要一個線程等待某個條件的變化&#xff0c;比如等待數據的生成或某個標志位的設置。如果沒有條件變量&#xff08;condition_variable&#xff09;&#xff0c;線程可能會…

啟智暢想火車類集裝箱號碼識別技術,軟硬件解決方案

集裝箱號碼識別需求&#xff1a; 實時檢測車皮號、火車底盤號碼、集裝箱號碼&#xff0c;根據火車類型分為以下三種情況&#xff1a; 1、純車皮&#xff0c;只檢測車皮號&#xff1b; 2、火車拉貨箱&#xff08;半車皮&#xff09;&#xff0c;檢測車皮號集裝箱號碼&#xff1b…

如何從0搭建一個Ai智體day01

&#x1f4da;《AI破局行動&#xff5c;AI智能體&#xff08;coze&#xff09;實戰手冊》&#xff1a; https://d16rg8unadx.feishu.cn/wiki/XQESwHW5HiPFlrkZbkqc0Xp7nEb 說明 這個是授權訪問的&#xff0c;想學習加我 微信/ Github:** watchpoints &#x1f4fa;Day1-大圣直播…

玩轉HarmonyOS NEXT之常用布局三

輪播&#xff08;Swiper&#xff09; Swiper組件提供滑動輪播顯示的能力。Swiper本身是一個容器組件&#xff0c;當設置了多個子組件后&#xff0c;可以對這些子組件進行輪播顯示。通常&#xff0c;在一些應用首頁顯示推薦的內容時&#xff0c;需要用到輪播顯示的能力。 針對…

git開發流程

分支介紹 master - 主分支 所有提供給用戶使用的正式版本&#xff0c;都在這個主分支上發布 開發者在此分支 不可進行 push 操作 dev - 開發分支 日常開發所使用的分支&#xff0c;開發者完成的階段性功能模塊將首先被合并到此分支 此分支亦是團隊內部測試、階段性工作驗證…

Xcode 16 beta3 真機調試找不到 Apple Watch 的嘗試解決

很多小伙伴們想用 Xcode 在 Apple Watch 真機上調試運行 App 時卻發現&#xff1a;在 Xcode 設備管理器中壓根找不到對應的 Apple Watch 設備。 大家是否已將 Apple Watch 和 Mac 都重啟一萬多遍了&#xff0c;還是束手無策。 Apple Watch not showing in XCodeApple Watch wo…

C++基礎語法:STL之容器(1)--容器概述和序列概述

前言 "打牢基礎,萬事不愁" .C的基礎語法的學習 引入 STL是標準模板庫,類模板主要是用來做容器的,所以個人理解:標準模板庫是"標準容器庫".容器是STL的核心 .以<C Prime Plus> 6th Edition(以下稱"本書")內容理解容器. 類模板內容回顧 類…

NineData全面支持PostgreSQL可視化表結構設計

“PostgreSQL 是最像 Oracle 的開源關系型數據庫“&#xff0c;也正因為如此&#xff0c;很多企業都青睞 PostgreSQL&#xff0c;拿它當成 Oracle 的替代品。所以毫無疑問&#xff0c;目前 PostgreSQL 在企業中非常常見。 對于直接接觸 PostgreSQL 的開發人員而言&#xff0c;…