手挖

第一眼过去这个是基于url的多模块开发的
比方说这个sso是单点登录,plug是插件,user是用户,case是案例模块
这个时候访问对应网站其实就可以通过/sso来访问sso模块的东西
按上周来说我们翻阅每个模块的web-inf/web.xml配置文件里边
对于复杂的多模块项目,实际的请求处理逻辑并不在web.xml中实现,而是在对应的Controller类或方法中。审计时更重要的是了解请求是如何被处理的,而不是仅仅关注请求是如何映射到Servlet的。
一个请求的走向如下:
在一个标准的 Java Web 应用里,请求从客户端(浏览器、App 等)发过来后,整体的调用链路大概是这样的:
- 客户端发起请求 → 到达 Tomcat(或其他 Web 容器)的网络 IO 层。
- Tomcat 解析请求,匹配到对应的
<url-pattern>,找到要执行的 Servlet(如果是 Spring MVC,这个 Servlet 就是DispatcherServlet)。 - 在真正调用 Servlet 的 service() 方法之前,会先执行一系列注册好的 Filter(过滤器的
doFilter()方法)。Filter 可以做很多事情:比如权限校验、日志打印、字符编码设置、请求/响应包装…… - Filter 处理完后,才会调用到目标 Servlet(例如
DispatcherServlet)的service()方法。

并且可以看到这里servletname以及对应的pattern显示是springMVC框架的,项目显式地把 DispatcherServlet 注册为处理请求的入口;至于它拦截哪些路径,取决于你配置的 ,常见写法有“/”“*.do”等。DispatcherServlet 随后负责把请求分发到对应的 Controller,这也是审计时把 Controller 作为业务入口的重要原因
- Servlet 内部再根据请求 URL、请求方法等信息,转发(forward)或分派(dispatch)到对应的 Controller 方法(如果是 Spring MVC,就是通过 HandlerMapping 找到对应的 Controller,再由 HandlerAdapter 调用 Controller 方法)。
- Controller 处理完业务逻辑,返回 ModelAndView(或直接返回数据),接着又会回到
DispatcherServlet,由它来决定怎么渲染视图(如果是 Web 页面)、怎么写回响应。 - Filter 还有机会在响应返回给客户端之前,再次执行
doFilter()的“后置逻辑”(比如给响应头加一些信息、压缩响应体……)。
- Filter 多是“通用逻辑”,和业务无关:
Filter 一般用来做鉴权、日志、编码、跨域……这些属于通用横切逻辑,并不直接对应某一个业务功能。审计时,大家更关心“某个业务接口是怎么实现的、有没有漏洞”,自然会把目光优先放到 Controller 上——因为 Controller 里才是具体的业务方法(比如/user/login对应登录逻辑、/order/create对应创建订单逻辑)。 - Spring MVC 等框架的封装,让 Filter “隐形”了:
在 Spring 生态里,我们写业务代码时,很少会去碰 Filter 的细节(除非自己要写自定义 Filter)。大多数时候,框架已经帮我们配好了CharacterEncodingFilter、HiddenHttpMethodFilter、SpringSecurityFilterChain(如果用了 Spring Security)这些 Filter。业务同学平时写代码,就是围绕@Controller、@RequestMapping这些注解来写,自然会觉得“请求是直接进到 Controller”。 - 审计/排查问题时,“业务视角”优先于“框架视角”:
做安全审计、Bug 排查时,大家最关心的是“哪个接口有漏洞、哪块业务逻辑有问题”。Controller 是业务逻辑的直接载体,Filter 很多是通用基础设施。所以审计人员会先从 Controller 入手,看每个接口有没有做参数校验、有没有越权、有没有 SQL 注入……而 Filter 往往是在“全链路”层面做拦截,只有在排查“全局性问题”(比如所有接口都返回乱码、所有接口都被拦截)时,才会重点看 Filter。
请求一定是先经过 Filter,再到 Controller
现在开始寻找controlller层代码
spring不像上周那种完全servlet开发的项目,可以根据web.xml写的路径那些直接跟,所以我们需要
在springboot里边文件上传的关键词就是:Multipartfile方法来搞
所以我们在搜关键词的同时还是要关注controller层的代码
这里即便说不懂逻辑代码,也可以看到这里写了规则

比方说这个文件里边就写了要上传mp4文件

接下来搜索Multipartfile文件,

跟进去之后右键查找用例,然后只找跟controller层相关的代码

这个是要上传指定类型的文件,前边的方法也只是重命名给路径啥的

这里是上传文件加了时间戳
文件上传的参数是uploadfile
所以应该把参数里边,post传入
uploadfile=uploadfile&title&oriFileName=”oriFileName&****
接口就是那个接口,放入burp之后,右键修改body编码,编码之后uploadfile后边加上filename就行了
注意这个源码是没有鉴权的
任意文件读取
任意文件读取需要我们先找一下相关的关键字
InputStreamReader

这里有readfile进去看看
并非
那我们找实现,就在原先的代码里边
发现有

实现代码里边有,关键词FileiIputStream方法
这里边也没有加鉴权
打的话就是
https://ip+端口/plugFileDownAnnex_out.do/?filePathName=../../../../../../../../../../../../etc/passwd
打进去就好了