Golang项目cmall-go代码审计
字数 1656 2025-08-30 06:50:35

Golang项目cmall-go代码审计报告

壹 项目介绍

1.1 前言

  • 项目地址: cmall-go
  • 技术版本:
    • Gin v1.5.0
    • gorm v1.9.10
  • 主要技术栈: 使用Golang主流web框架Gin,可通过go.mod文件确认

1.2 环境搭建

  1. 修改配置文件:

    • .env.example重命名为.env
    • 修改数据库连接信息
  2. 下载依赖:

    go mod tidy
    
  3. 运行项目:

    go run main.go
    

1.3 路由分析

  1. 路由入口位于main.go中的server.NewRouter()
  2. 具体路由定义在router.go文件中
  3. 示例路由:
    • 登录路由: /api/v1/user/login
  4. 参数获取方式:
    • 使用c.ShouldBind进行参数绑定
    • 以用户登录为例,绑定到service.UserLoginService结构体
    • 登录请求参数示例(JSON格式):
      {
        "username": "admin",
        "password": "123456",
        "captcha": "captcha_value",
        "captcha_id": "captcha_id_value",
        "remember": true
      }
      

贰 代码审计

2.1 用户名枚举漏洞

  • 位置: 登录接口
  • 漏洞描述:
    • 查询用户时,如果用户不存在,返回明确的错误信息ERROR_NOT_EXIST_USER
    • 攻击者可通过不同响应判断用户名是否存在
  • 影响范围: 管理员和普通用户登录处均存在

2.2 水平越权修改用户信息

  • 位置: /api/v1/user接口组下的UserUpdate方法
  • 漏洞描述:
    • 通过ID查找用户信息
    • 将前端获取的其他信息直接赋值更新
    • 无当前用户校验机制
  • 攻击方式:
    • 登录任意账号后,可修改其他用户信息

2.3 水平越权添加用户购物车

  • 位置: /api/v1/user接口组下的carts方法
  • 漏洞描述:
    • 仅通过用户ID和产品进行绑定
    • 无当前用户验证
    • 仅判断用户是否有购物记录
  • 攻击方式:
    • 登录任意账号后,可为其他用户添加购物车商品

2.4 水平越权添加其他用户地址

  • 位置: api.CreateAddress方法
  • 漏洞描述:
    • 直接获取客户端信息创建地址
    • 无当前用户鉴权操作
  • 请求参数:
    • 用户ID
    • 名字
    • 电话号码
    • 地址
  • 攻击方式:
    • 登录任意账号后,可为其他用户添加收货地址

叁 漏洞复现

3.1 用户名枚举复现

  1. 发送登录请求
  2. 观察不同用户名的响应:
    • 存在用户: 返回密码错误
    • 不存在用户: 返回ERROR_NOT_EXIST_USER

3.2 水平越权修改用户信息复现

  1. 登录普通用户A
  2. 获取token
  3. 调用/api/v1/user接口
  4. 设置其他用户ID(如用户ID=2)和信息
  5. 验证数据库确认修改成功

3.3 水平越权添加用户购物车复现

  1. 登录用户A
  2. 调用添加购物车接口
  3. 设置目标用户B的ID
  4. 验证用户B的购物车中已添加商品

3.4 水平越权添加其他用户地址复现

  1. 登录用户A
  2. 调用添加地址接口
  3. 设置目标用户B的ID和地址信息
  4. 验证用户B的地址列表中已添加新地址

肆 总结与建议

漏洞总结

  1. 系统存在多处水平越权漏洞
  2. 还存在上传漏洞(未复现)和0元购漏洞
  3. 使用gorm进行数据库查询,SQL注入风险较低

Golang代码审计建议

  1. 组件检查:

    • 检查go.mod文件中的依赖组件
    • 注意Golang公开组件漏洞较少
  2. 路由分析:

    • 重点检查router.go和main.go
    • Golang路由通常集中定义,接口显示明了
  3. 常见漏洞类型:

    • 逻辑漏洞(越权、权限绕过)
    • SQL注入(较少,但仍需注意)
    • 文件上传(通常需要配合路径才能RCE)
    • 命令执行
    • SSTI(服务器端模板注入)
  4. 开源项目查找技巧:

    • 使用特定语法在GitHub搜索Golang项目

修复建议

  1. 用户名枚举:

    • 统一返回"用户名或密码错误"
    • 不暴露用户是否存在信息
  2. 水平越权:

    • 添加当前用户校验
    • 确保用户只能操作自己的数据
    • 使用中间件进行权限验证
  3. 输入验证:

    • 对所有用户输入进行严格验证
    • 使用白名单机制限制参数范围
  4. 安全设计:

    • 实现最小权限原则
    • 添加操作日志记录关键操作

扩展资源

  • 靶场项目: Vulnerabilities_Server
  • 其他Golang项目审计案例参考
Golang项目cmall-go代码审计报告 壹 项目介绍 1.1 前言 项目地址 : cmall-go 技术版本 : Gin v1.5.0 gorm v1.9.10 主要技术栈 : 使用Golang主流web框架Gin,可通过go.mod文件确认 1.2 环境搭建 修改配置文件: 将 .env.example 重命名为 .env 修改数据库连接信息 下载依赖: 运行项目: 1.3 路由分析 路由入口位于 main.go 中的 server.NewRouter() 具体路由定义在 router.go 文件中 示例路由: 登录路由: /api/v1/user/login 参数获取方式: 使用 c.ShouldBind 进行参数绑定 以用户登录为例,绑定到 service.UserLoginService 结构体 登录请求参数示例(JSON格式): 贰 代码审计 2.1 用户名枚举漏洞 位置 : 登录接口 漏洞描述 : 查询用户时,如果用户不存在,返回明确的错误信息 ERROR_NOT_EXIST_USER 攻击者可通过不同响应判断用户名是否存在 影响范围 : 管理员和普通用户登录处均存在 2.2 水平越权修改用户信息 位置 : /api/v1/user 接口组下的 UserUpdate 方法 漏洞描述 : 通过ID查找用户信息 将前端获取的其他信息直接赋值更新 无当前用户校验机制 攻击方式 : 登录任意账号后,可修改其他用户信息 2.3 水平越权添加用户购物车 位置 : /api/v1/user 接口组下的 carts 方法 漏洞描述 : 仅通过用户ID和产品进行绑定 无当前用户验证 仅判断用户是否有购物记录 攻击方式 : 登录任意账号后,可为其他用户添加购物车商品 2.4 水平越权添加其他用户地址 位置 : api.CreateAddress 方法 漏洞描述 : 直接获取客户端信息创建地址 无当前用户鉴权操作 请求参数 : 用户ID 名字 电话号码 地址 攻击方式 : 登录任意账号后,可为其他用户添加收货地址 叁 漏洞复现 3.1 用户名枚举复现 发送登录请求 观察不同用户名的响应: 存在用户: 返回密码错误 不存在用户: 返回 ERROR_NOT_EXIST_USER 3.2 水平越权修改用户信息复现 登录普通用户A 获取token 调用 /api/v1/user 接口 设置其他用户ID(如用户ID=2)和信息 验证数据库确认修改成功 3.3 水平越权添加用户购物车复现 登录用户A 调用添加购物车接口 设置目标用户B的ID 验证用户B的购物车中已添加商品 3.4 水平越权添加其他用户地址复现 登录用户A 调用添加地址接口 设置目标用户B的ID和地址信息 验证用户B的地址列表中已添加新地址 肆 总结与建议 漏洞总结 系统存在多处水平越权漏洞 还存在上传漏洞(未复现)和0元购漏洞 使用gorm进行数据库查询,SQL注入风险较低 Golang代码审计建议 组件检查 : 检查go.mod文件中的依赖组件 注意Golang公开组件漏洞较少 路由分析 : 重点检查router.go和main.go Golang路由通常集中定义,接口显示明了 常见漏洞类型 : 逻辑漏洞(越权、权限绕过) SQL注入(较少,但仍需注意) 文件上传(通常需要配合路径才能RCE) 命令执行 SSTI(服务器端模板注入) 开源项目查找技巧 : 使用特定语法在GitHub搜索Golang项目 修复建议 用户名枚举 : 统一返回"用户名或密码错误" 不暴露用户是否存在信息 水平越权 : 添加当前用户校验 确保用户只能操作自己的数据 使用中间件进行权限验证 输入验证 : 对所有用户输入进行严格验证 使用白名单机制限制参数范围 安全设计 : 实现最小权限原则 添加操作日志记录关键操作 扩展资源 靶场项目: Vulnerabilities_ Server 其他Golang项目审计案例参考