freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

通过审计cms来掌握CodeQL的使用
2023-09-13 15:13:50

本文记录了一次完整的华夏ERP代码审计过程,其中使用了CodeQL来进行漏洞利用链的挖掘

一、环境搭建

使用的版本为:v2.3
下载源码:https://github.com/jishenghua/jshERP/tree/v2.3

  • 先导入IDEA,让他自动导入依赖

  • 创建数据库jsh_erp,docs/jsh_erp.sql 导入数据库

  • 运行src\main\java\com\jsh\erp\ErpApplication.java

  • 进入登录页面 jsh 123456

二、第三方组件扫描

使用我自己开发的PomEye进行第三方组件扫描
PomEye介绍:https://www.freebuf.com/sectool/366383.html
PomEye下载地址:https://github.com/feiweiliang/PomEye

image-20230906160103893.png

发现引用了有漏洞的依赖fastjson

待会儿使用CodeQL找到调用fastjson的parse或parseObject方法处,并且parseObject的参数可控

三、架构分析

对一些关键的类进行分析

  • config:Swagger配置类、Mapper路径配置、分页拦截器

  • constants:一些常量,例如SERVICE_SUCCESS_CODE = 200、USER_IS_MANAGER = 0

  • filter:用户登录校验过滤器 (requestUrl.startsWith(url))

  • controller:

    • AccountController:账户类

      • findBySelect:查找下拉框中所有账户的id和用户名,根据id排序

      • getAccount:获取所有的账户

      • findAccountInOutList: 查找主表出入库涉及的账户

      • updateAmountIsDefault:

    • DepotController:对仓库操作的类

    • FunctionController: 操作用户的功能相关类

    • InOutItemController: 查找收支项目、删除收支项目

    • UserController:用户登录、退出、重置密码、修改密码、获得所有用户信息、新增用户

    • SystemConfigController: 删除系统配置信息、

    • SupplierController:更新供应商的预付款、查找客户信息、查找供应商信息、导入导出excel表格

  • exception:自定义异常类,方便调试

  • utils:工具类,稍后分析

四、白盒审计

1. 越权(任意密码重置、删除)

UserController类的resetPwd方法

@PostMapping(value = "/resetPwd")
    public String resetPwd(@RequestParam("id") Long id,
                                     HttpServletRequest request) throws Exception {
        Map<String, Object> objectMap = new HashMap<String, Object>();
        String password = "123456";
        String md5Pwd = Tools.md5Encryp(password);
        int update = userService.resetPwd(md5Pwd, id);
    }

UserController类的deleteUser方法

@PostMapping("/deleteUser")
    @ResponseBody
    public Object deleteUser(@RequestParam("ids") String ids)throws Exception{
        JSONObject result = ExceptionConstants.standardSuccess();
        userService.batDeleteUser(ids);
        return result;
    }

2. 信息泄露

UserController类的getUserList

@GetMapping(value = "/getUserList")
    public JSONArray getUserList(HttpServletRequest request)throws Exception {
        JSONArray dataArray = new JSONArray();
        try {
            List<User> dataList = userService.getUser();
            if (null != dataList) {
                for (User user : dataList) {
                    JSONObject item = new JSONObject();
                    item.put("id", user.getId());
                    item.put("userName", user.getUsername());
                    dataArray.add(item);
                }
            }
        } catch(Exception e){
            e.printStackTrace();
        }
        return dataArray;
    }

3. 鉴权绕过(未授权)

在LogCostFilter类中的doFilter方法

//getRequestURI可以被绕过,绕过方式:/../../
String requestUrl = servletRequest.getRequestURI();
if (requestUrl != null && (requestUrl.contains("/doc.html") ||
            requestUrl.contains("/register.html") || requestUrl.contains("/login.html"))) {
            chain.doFilter(request, response);
            return;
        }

可以构造/register.html/../../user/getUserList

还有一种利用静态资源绕

initParams = {@WebInitParam(name = "ignoredUrl", value = ".css#.js#.jpg#.png#.
# java # 代码审计 # CodeQL
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录