在Java Web代碼審計中,尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller,其作為MVC架構中的一個組件,可以說是每個用戶交互的入口點。簡單介紹下Java Web中常見框架(Spring Web、Jersey)尋找路由技巧。
0x00 前言
在Java Web代碼審計中,尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller,其作為MVC架構中的一個組件,可以說是每個用戶交互的入口點。主要負責以下幾個方面的任務:
- 請求分發:控制器接收來自用戶的HTTP請求,并根據請求的URL和HTTP方法(如GET、POST等)將請求分發到相應的處理方法。
- 參數綁定:控制器將請求中的參數(如查詢參數、表單數據、JSON對象等)綁定到處理方法的參數上。
- 業務邏輯調用:控制器調用服務層(Service Layer)的組件來執行業務邏輯,如數據處理、計算等。
- 異常處理:控制器負責處理業務邏輯中可能拋出的異常,并返回適當的錯誤響應或重定向。
- 響應生成:控制器根據業務邏輯的結果生成響應,這可能包括渲染視圖、返回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 直接跳轉到對應的方法定義:
通過這個插件可以快速查找到對應的接口位置,很多時候我們知道一個api接口,想知道這個接口對應的類和位置時,查找起來很麻煩,這個插件可以很方便解決這個問題:
通過該插件可以很方便的對應用注冊的路由逐個進行分析。強迫癥提出一個問題,通過上述方法獲取到的路由就一定全嗎,會不會有遺漏的地方,如果路由信息在jar依賴里引入的能保證獲取全嗎?
1.3 結合Debug斷點獲取
結合上面的疑惑,很多時候應用會在框架的基礎上進行魔改,然后對Controller進行拓展。例如下面的例子,自定義了一個注解@BuyerController:
然后定義了具體的Controller以及業務邏輯:
但是通過RestfulToolkit并不能獲取到對應路由的定義:
而該路由對應的資源實際上是可以正常訪問的:
那么此時如果僅僅依賴關鍵字或者IDE插件的方式進行匹配的話,很可能會有遺漏。
實際上我們可以通過分析代碼,跟蹤HTTP請求是如何被框架處理的,對識別負責處理特定請求的控制器也會有一定的幫助。如果可以對應用進行調試的話,通過在對應的位置下斷點,即可獲取對應框架所注冊的全部路由:
1.2.1 Spring MVC
當一個HTTP請求到達Spring Web應用程序時,AbstractHandlerMethodMapping
類(或其子類,如 RequestMappingHandlerMapping
)會使用 lookupHandlerMethod
方法來確定哪個控制器(controller)中的方法應該被調用來處理該請求。通過org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#lookupHandlerMethod的mappingRegistry可以快速的獲取應用注冊的路由信息:
同樣是上面對Controller進行拓展的例子,除了常規的路由以外,可以看到對應的拓展Controller的路由信息同樣也獲取到了:
1.2.2 Spring WebFlux
同樣的,在Spring WebFlux中,則可以通過org.springframework.web.reactive.result.method.AbstractHandlerMethodMapping#lookupHandlerMethod進行注冊路由的獲取:
可以看到通過mappingRegistry可以獲取到當前應用注冊的路由信息:
1.2.3 Jersey
在Jersey中,則可以通過org.glassfish.jersey.server.ApplicationHandler#initialize
獲取jersey注冊的router,其的作用是初始化應用程序的請求處理,通過該方法可以查找并注冊應用程序中的資源類(Resources)和提供者(Providers),如異常處理器、攔截器、實體過濾器等。例如根據資源類上的注解(如 @Path
)和其他配置信息,配置請求到資源方法的路由:
可以看到通過routingStage可以獲取到當前jersey注冊的router:
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%免費
】