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 环境搭建
-
修改配置文件:
- 将
.env.example重命名为.env - 修改数据库连接信息
- 将
-
下载依赖:
go mod tidy -
运行项目:
go run main.go
1.3 路由分析
- 路由入口位于
main.go中的server.NewRouter() - 具体路由定义在
router.go文件中 - 示例路由:
- 登录路由:
/api/v1/user/login
- 登录路由:
- 参数获取方式:
- 使用
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 用户名枚举复现
- 发送登录请求
- 观察不同用户名的响应:
- 存在用户: 返回密码错误
- 不存在用户: 返回
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项目审计案例参考