免责申明
本文章仅用于信息安全防御技术分享,因用于其他用途而产生不良后果,作者不承担任何法律责任,请严格遵循中华人民共和国相关法律法规,禁止做一切违法犯罪行为。
xxxx学员分享:
这位师傅比较低调,哈哈哈哈哈,就不爆出来了。
在一次审计的流程正常的审计流程当中,这位学员找到了我,给我甩了一套源码,目前已经发现了一个任意文件读取,并且源码也是一步一步读取下来的,被这种方式打动了,于是有了一下这个文章。
鉴权分析
打开源码之后,逛了一圈发现源码为Spring Boot框架开发的,那么就不可以再去使用相关的Servlet那套方式去找相关的拦截器等信息了,先来看看配置文件。
其实可以看到配置文件当中并没有一些相关的拦截器等关键词的配置器,只是一些基础的application等配置器,简单看一看吧。
application.properties
这里其实可以看到这里加载了新的一个配置文件为prod文件,去看看对应的配置文件。
application-prod.properties
最关键的在这里,其实其中还有一些相关的数据库以及redis等连接信息,但是这里就不给大家放出来了,我们着重读取到了一个信息为在访问@RequestMapping("/dome")的时候要在前面添加一个固定的路由为/wxxxxxxx,看到这个路由的时候,有点心凉,感觉这像是一个纯后台的源码,但是无我们开始搜集拦截器。
.addPathPatterns(
在我们之前的文章有提到过,相关的一个拦截器是如何进行编写的,这里我们直接进行全局搜索即可。
只存在一个相对应的拦截器,点进去看看。
好好好,非常的明显啊,拦截的路径调用方法getIncludePathPatterns方法,/**表示拦截全部的路径,我们在看看全部的方法具体的实现路径在哪里。
好好好,这里我把代码复制出来放到下面。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
if (method.isAnnotationPresent(IgnoreUserToken.class)) {
IgnoreUserToken passToken = (IgnoreUserToken) method.getAnnotation(IgnoreUserToken.class);
if (passToken.required()) {
return true;
}
}
String token = request.getHeader("Authorization");
if (StringUtils.isBlank(token)) {
throw new UserInvalidException(BaseAuthEnum.EX_JWT_UNLOGIN);
}
String logOut = this.redisOperator.get(RedisKeyConstant.LOG_OUT_LIST_KEY + token);
if (StringUtils.isNotBlank(logOut)) {
throw new UserInvalidException(BaseAuthEnum.EX_JWT_UNLOGIN);
}
JWTInfo infoFromToken = this.jwtTokenUtil.getInfoFromToken(token);
log.info("infoFromToken === [{}] ", infoFromToken.toString());
BaseContextHandler.setLoginName(infoFromToken.getLoginName());
BaseContextHandler.setUserID(infoFromToken.getUserId());
BaseContextHandler.setUserName(infoFromToken.getUserName());
BaseContextHandler.setOrgCode(infoFromToken.getOrgCode());
BaseContextHandler.setRoleId(infoFromToken.getRoleId());
BaseContextHandler.setAppId(infoFromToken.getAppId());
BaseContextHandler.setUserType(infoFromToken.getUserType());
BaseContextHandler.setToken(token);
BaseContextHandler.setReqTime(DateUtil.formatDate(new Date()));
return true;
}
其实这里我们已经可以发现了,获取到了用户当中的headers当中的信息,并且从中拿到相关的请求头为Authorization的值,并且放入到StringUtils.isBlank进行判断。
这里如果没有检测到token的值的话直接提示你没有登录,请进行登录。
并且在后面进行了jwt的一系列相关的判断,这里已经无疑了,只能说帮助学员找到相关的后台漏洞了。
任意文件读取漏洞分析
因为学员已经跟我说存在一个任意文件的读取漏洞了,所以这里进行简单的分析一下,当然分析的时候还是我们主要先来看看前台有哪些功能点,后台具有哪些功能点。
真正的审计分析
这里我们引入第一视角给大家分析一下。
用给学员制作的审计宝典来尝试进行审计,很快会定位到一个点。
RCE文件上传分析
还是使用给学员的审计宝典定位到一处代码。
可以看到这里用户传入file参数并且给到了方法uploadWorkImg,跟入方法进行查看。
这里代码有点长,对应的上传代码大致如上,可以看到获取到文件的后缀吗进行判断是什么后缀,但是重要的来了,如果上传的是jsp文件这里会导致一个问题即为他没有对有对应jsp的后缀进行处理从而导致jsp正常上传上去,导致一个任意文件上传漏洞的产生,但是唯一不足的是这个是一个需要一定的权限来操作的一个功能。
这里附带一张学员成果数据包。。。
作者本人联系方式:
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...