JavaWeb的某管理系统的一次常规审计 - L4zily

admin 2021年12月31日14:46:55评论83 views字数 2124阅读7分4秒阅读模式

前言

之前各位看过先知的php审计,不过后期随着技术需求学习了Java的代码审计,这几天来实战检验自己的成果,其实代码审计我认为不仅仅在于代码层面的测试,包括你去搭建部署起来和去黑盒测试功能点对应的代码中去摸索这个过程是最重要的,在代码审计中往往都是沉下心来一步一步的摸索就可以柳暗花明了!

环境配置

本地部署环境:idea+tomcat8.5.67+mysql5.7.26+jdk1.8

cms技术栈:SpringBoot、SpringCloud、Shiro、Thymeleaf、Vue、Element、Bootstrap

拿到源码期初看的时候,看的真的离谱这框架和架构给我看的很懵,第一次做java的代码审计审这么多架构的组合。

垂直越权

Java审计流程还有架构原理什么的可以看之前的文章都有说明~

上手代码来看,admin-system的SysRoleCotroller。

如图所示 @PostMapping("/authUser/selectAll")
这是Spring4.3中来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。

/**
     * 批量选择用户授权
     */
    @RequiresPermissions("system:role:edit")
    @Log(title = "角色管理", businessType = BusinessType.GRANT)
    @PostMapping("/authUser/selectAll")
    @ResponseBody
    public AjaxResult selectAuthUserAll(Long roleId, String userIds)
    {
        return toAjax(roleService.insertAuthUsers(roleId, userIds));
    }
}

看代码传递了roleId, userIds两个参数,跟进insertAuthUsers方法

这个地方依旧没有进行参数的过滤和校验,这样我们直接构造burp的数据包

直接返回操作成功

这个地方其实还有个修改其他人权限,在cookie这个地方只要保证我们的cookie没有失效的情况,这样去修改其他的userIds和roleId都可以去修改的。

失败的白名单

其实审计大家都希望直接去寻找getshell方法找上传点,在MVC架构里面的uploadController

跟踪一下(tips:在这里我用的idea搜索双击shift跟踪的话直接ctrl+单击)FileUploadUtils

再继续跟踪DEFAULT_ALLOWED_EXTENSION

这个地方写了白名单,想了很久不知道怎么绕过这个白名单,有师傅会的话可以私聊交流一下~

过时的漏洞分析

cnvd看到了过去的版本中存在任意文件下载

看代码分析~

@GetMapping("/common/download/resource")
    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
            throws Exception
    {
        try
        {
            if (!FileUtils.checkAllowDownload(resource))
            {
                throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
            }
            // 本地资源路径
            String localPath = XXXConfig.getProfile();
            // 数据库资源地址
            String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
            // 下载名称
            String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, downloadName);
            FileUtils.writeBytes(downloadPath, response.getOutputStream());
        }
        catch (Exception e)
        {
            log.error("下载文件失败", e);
        }
    }
}

跟踪checkAllowDownload

这个地方加了限制没办法去穿越目录达到任意文件下载了。

总结

有代码基础的朋友可以和我一样找cms练手,去看cnvd之前版本的旧漏洞,可以去复现也可以去对比他的更新做了哪些修复,官方的补丁有哪些,然后自己进行分析和笔记的记录,这样不仅仅有助于代码审计更对于漏洞原理&构成有更加深入的了解,虽然这次审计审出来的垂直越权提交cnvd了,剩下两个是上个版本漏洞的分析,希望大家提建议

附一个常规审计思路

  • 正向数据流分析-根据业务推代码
  • 逆向数据流分析-根据缺陷推业务
  • 代码审计工具辅助
  • 检查关键组件
  • 自定义框架审计

BY:先知论坛

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月31日14:46:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JavaWeb的某管理系统的一次常规审计 - L4zilyhttp://cn-sec.com/archives/709611.html

发表评论

匿名网友 填写信息