记一次帮助学员审计EDU流程[代码审计]

admin 2024年7月30日14:18:53评论25 views字数 2789阅读9分17秒阅读模式
 

xxxx学员分享:

这位师傅比较低调,哈哈哈哈哈,就不爆出来了。

记一次帮助学员审计EDU流程[代码审计]

在一次审计的流程正常的审计流程当中,这位学员找到了我,给我甩了一套源码,目前已经发现了一个任意文件读取,并且源码也是一步一步读取下来的,被这种方式打动了,于是有了一下这个文章。

鉴权分析

打开源码之后,逛了一圈发现源码为Spring Boot框架开发的,那么就不可以再去使用相关的Servlet那套方式去找相关的拦截器等信息了,先来看看配置文件。

记一次帮助学员审计EDU流程[代码审计]

其实可以看到配置文件当中并没有一些相关的拦截器等关键词的配置器,只是一些基础的application等配置器,简单看一看吧。

application.properties

记一次帮助学员审计EDU流程[代码审计]

这里其实可以看到这里加载了新的一个配置文件为prod文件,去看看对应的配置文件。

application-prod.properties

记一次帮助学员审计EDU流程[代码审计]

最关键的在这里,其实其中还有一些相关的数据库以及redis等连接信息,但是这里就不给大家放出来了,我们着重读取到了一个信息为在访问@RequestMapping("/dome")的时候要在前面添加一个固定的路由为/wxxxxxxx,看到这个路由的时候,有点心凉,感觉这像是一个纯后台的源码,但是无我们开始搜集拦截器。

.addPathPatterns(

在我们之前的文章有提到过,相关的一个拦截器是如何进行编写的,这里我们直接进行全局搜索即可。

记一次帮助学员审计EDU流程[代码审计]

只存在一个相对应的拦截器,点进去看看。

记一次帮助学员审计EDU流程[代码审计]

好好好,非常的明显啊,拦截的路径调用方法getIncludePathPatterns方法,/**表示拦截全部的路径,我们在看看全部的方法具体的实现路径在哪里。

记一次帮助学员审计EDU流程[代码审计]

好好好,这里我把代码复制出来放到下面。

    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进行判断。

记一次帮助学员审计EDU流程[代码审计]

这里如果没有检测到token的值的话直接提示你没有登录,请进行登录。

记一次帮助学员审计EDU流程[代码审计]

并且在后面进行了jwt的一系列相关的判断,这里已经无疑了,只能说帮助学员找到相关的后台漏洞了。

任意文件读取漏洞分析

因为学员已经跟我说存在一个任意文件的读取漏洞了,所以这里进行简单的分析一下,当然分析的时候还是我们主要先来看看前台有哪些功能点,后台具有哪些功能点。

真正的审计分析

这里我们引入第一视角给大家分析一下。

用给学员制作的审计宝典来尝试进行审计,很快会定位到一个点。

记一次帮助学员审计EDU流程[代码审计]

RCE文件上传分析

还是使用给学员的审计宝典定位到一处代码。

记一次帮助学员审计EDU流程[代码审计]

可以看到这里用户传入file参数并且给到了方法uploadWorkImg,跟入方法进行查看。

记一次帮助学员审计EDU流程[代码审计]

这里代码有点长,对应的上传代码大致如上,可以看到获取到文件的后缀吗进行判断是什么后缀,但是重要的来了,如果上传的是jsp文件这里会导致一个问题即为他没有对有对应jsp的后缀进行处理从而导致jsp正常上传上去,导致一个任意文件上传漏洞的产生,但是唯一不足的是这个是一个需要一定的权限来操作的一个功能。

记一次帮助学员审计EDU流程[代码审计]

这里附带一张学员成果数据包。。。

记一次帮助学员审计EDU流程[代码审计]

作者本人联系方式:

记一次帮助学员审计EDU流程[代码审计]

原文始发于微信公众号(进击安全):记一次帮助学员审计EDU流程

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月30日14:18:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次帮助学员审计EDU流程[代码审计]https://cn-sec.com/archives/3015190.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息