0%

北京心领育健康教育漏挖

手挖

img

第一眼过去这个是基于url的多模块开发的

比方说这个sso是单点登录,plug是插件,user是用户,case是案例模块

这个时候访问对应网站其实就可以通过/sso来访问sso模块的东西

按上周来说我们翻阅每个模块的web-inf/web.xml配置文件里边

对于复杂的多模块项目,实际的请求处理逻辑并不在web.xml中实现,而是在对应的Controller类或方法中。审计时更重要的是了解请求是如何被处理的,而不是仅仅关注请求是如何映射到Servlet的。

一个请求的走向如下:

在一个标准的 Java Web 应用里,请求从客户端(浏览器、App 等)发过来后,整体的调用链路大概是这样的:

  1. 客户端发起请求 → 到达 Tomcat(或其他 Web 容器)的网络 IO 层。
  2. Tomcat 解析请求,匹配到对应的 <url-pattern>,找到要执行的 Servlet(如果是 Spring MVC,这个 Servlet 就是 DispatcherServlet)。
  3. 在真正调用 Servlet 的 service() 方法之前,会先执行一系列注册好的 Filter(过滤器的 doFilter() 方法)。Filter 可以做很多事情:比如权限校验、日志打印、字符编码设置、请求/响应包装……
  4. Filter 处理完后,才会调用到目标 Servlet(例如 DispatcherServlet)的 service() 方法。

img

并且可以看到这里servletname以及对应的pattern显示是springMVC框架的,项目显式地把 DispatcherServlet 注册为处理请求的入口;至于它拦截哪些路径,取决于你配置的 ,常见写法有“/”“*.do”等。DispatcherServlet 随后负责把请求分发到对应的 Controller,这也是审计时把 Controller 作为业务入口的重要原因

  1. Servlet 内部再根据请求 URL、请求方法等信息,转发(forward)或分派(dispatch)到对应的 Controller 方法(如果是 Spring MVC,就是通过 HandlerMapping 找到对应的 Controller,再由 HandlerAdapter 调用 Controller 方法)。
  2. Controller 处理完业务逻辑,返回 ModelAndView(或直接返回数据),接着又会回到 DispatcherServlet,由它来决定怎么渲染视图(如果是 Web 页面)、怎么写回响应。
  3. Filter 还有机会在响应返回给客户端之前,再次执行 doFilter() 的“后置逻辑”(比如给响应头加一些信息、压缩响应体……)。
  • Filter 多是“通用逻辑”,和业务无关
    Filter 一般用来做鉴权、日志、编码、跨域……这些属于通用横切逻辑,并不直接对应某一个业务功能。审计时,大家更关心“某个业务接口是怎么实现的、有没有漏洞”,自然会把目光优先放到 Controller 上——因为 Controller 里才是具体的业务方法(比如 /user/login 对应登录逻辑、/order/create 对应创建订单逻辑)。
  • Spring MVC 等框架的封装,让 Filter “隐形”了
    在 Spring 生态里,我们写业务代码时,很少会去碰 Filter 的细节(除非自己要写自定义 Filter)。大多数时候,框架已经帮我们配好了 CharacterEncodingFilterHiddenHttpMethodFilterSpringSecurityFilterChain(如果用了 Spring Security)这些 Filter。业务同学平时写代码,就是围绕 @Controller@RequestMapping 这些注解来写,自然会觉得“请求是直接进到 Controller”。
  • 审计/排查问题时,“业务视角”优先于“框架视角”
    做安全审计、Bug 排查时,大家最关心的是“哪个接口有漏洞、哪块业务逻辑有问题”。Controller 是业务逻辑的直接载体,Filter 很多是通用基础设施。所以审计人员会先从 Controller 入手,看每个接口有没有做参数校验、有没有越权、有没有 SQL 注入……而 Filter 往往是在“全链路”层面做拦截,只有在排查“全局性问题”(比如所有接口都返回乱码、所有接口都被拦截)时,才会重点看 Filter。

请求一定是先经过 Filter,再到 Controller

现在开始寻找controlller层代码

spring不像上周那种完全servlet开发的项目,可以根据web.xml写的路径那些直接跟,所以我们需要

在springboot里边文件上传的关键词就是:Multipartfile方法来搞

所以我们在搜关键词的同时还是要关注controller层的代码

这里即便说不懂逻辑代码,也可以看到这里写了规则

img

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

img

接下来搜索Multipartfile文件,

img

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

img

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

img

这里是上传文件加了时间戳

文件上传的参数是uploadfile

所以应该把参数里边,post传入

uploadfile=uploadfile&title&oriFileName=”oriFileName&****

接口就是那个接口,放入burp之后,右键修改body编码,编码之后uploadfile后边加上filename就行了

注意这个源码是没有鉴权的

任意文件读取

任意文件读取需要我们先找一下相关的关键字

InputStreamReader

img

这里有readfile进去看看

并非

那我们找实现,就在原先的代码里边

发现有

img

实现代码里边有,关键词FileiIputStream方法

这里边也没有加鉴权

打的话就是

https://ip+端口/plugFileDownAnnex_out.do/?filePathName=../../../../../../../../../../../../etc/passwd

打进去就好了

自动化