专栏名称: 合天网安实验室
为广大信息安全爱好者提供有价值的文章推送服务!
目录
相关文章推荐
创伙伴  ·  欢迎你也加入创伙伴知识星球 ·  8 小时前  
独角兽智库  ·  AI算力、机器人、AI眼镜、汽车、消费电子板 ... ·  3 天前  
创伙伴  ·  欢迎你也加入创伙伴知识星球 ·  3 天前  
51好读  ›  专栏  ›  合天网安实验室

Java Web常见框架寻找路由技巧

合天网安实验室  · 公众号  ·  · 2024-07-30 16:35

主要观点总结

本文介绍了在Java Web代码审计中如何寻找和识别路由,特别关注了常见框架如Spring Web和Jersey的路由技巧。文章详细阐述了路由在MVC架构中的作用,包括请求分发、参数绑定、业务逻辑调用、异常处理和响应生成等方面。

关键观点总结

关键观点1: 路由的关键作用及在代码审计中的重要性

路由是Java Web应用中用户交互的入口点,负责将HTTP请求分发到相应的处理方法。在代码审计中,分析和检查路由是实现有效审计的关键部分,有助于发现潜在的业务风险和漏洞缺陷。

关键观点2: Java Web中常见框架的路由技巧

介绍了Spring Web、Jersey等常见Java Web框架的路由技巧,包括关键字匹配、IDE插件使用、结合Debug断点获取等方法来获取和应用路由信息。

关键观点3: 框架的魔改与路由获取的挑战

讨论了应用框架魔改时如何获取完整路由信息的挑战,并介绍了通过跟踪HTTP请求处理流程、设置调试断点等方法来识别负责处理特定请求的控制器。

关键观点4: 其他Java Web框架的路由方法

简要提及了其他Java生态中的Web框架如JFinal和Struts的路由方法,虽然不再详细展开讨论,但强调了类似的方法在寻找和识别路由中的适用性。


正文

在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来实现。

相关的作用如下:

  • 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 {
@Autowired
private ShowAction showAction;

@Bean
public 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可以快速的获取应用注册的路由信息:







请到「今天看啥」查看全文