SRC:gin-vue-admin攻击面
0x01 历史漏洞
- 路径遍历导致的任意文件上传漏洞-CVE-2022-39345(https://github.com/flipped-aurora/gin-vue-admin/security/advisories/GHSA-7gc4-r5jr-9hxv)
- 路径遍历导致的任意文件上传漏洞2(RCE)-CVE-2022-39305 (https://github.com/flipped-aurora/gin-vue-admin/security/advisories/GHSA-wrmq-4v4c-gxp2)
- 任意文件读取(可读setSystemConfig文件)-CVE-2022-24843(https://github.com/flipped-aurora/gin-vue-admin/security/advisories/GHSA-32gq-gj42-mw43)
- SQL注入漏洞-CVE-2022-24844(https://github.com/flipped-aurora/gin-vue-admin/security/advisories/GHSA-5g92-6hpp-w425)
- 后台垂直修改密码漏洞-CVE-2022-21660(https://github.com/flipped-aurora/gin-vue-admin/security/advisories/GHSA-xxvh-9c87-pqjx)
0x02 攻击面
从历史漏洞可以看出,大多数的漏洞都存在后台,包括RCE、越权等等,实际上关于Gin-vue-admin的攻击面不止于后台,整理了一下,大概思路如下:
0x03 前台攻击面
撞库分为两种情况,主要还是围绕着验证码展开,校验逻辑在server\api\v1\system\sys_user.go
中的52行
访问业务网站会首先像接口/api/base/captcha
发送一次请求,获取captchaId以及验证码图片,手动点击验证码刷新与点击登录都会触发/api/base/captcha
刷新验证码
当系统管理员在二开接入单点登录或注册接口时,会出现配置不当的情况存在,可以尝试绕过
captchaId
与captcha
是否为空,不校验验证码是否正确,captcha
与captchaId
无论为多少都会回显
{"code":7,"data":{},"msg":"用户名不存在或者密码错误"}
captchaId
与captcha
是否为空,可通过删除captcha
字段绕过验证码检测。
校验验证码是否正确captchaId
是否为空但不判断captcha
是否为空,删除captcha
字段绕过验证码检测
管理员弱口令
初始化后的后端默认管理员admin
账户密码为123456
单点登录
如Gin-vue-admin配置了单点登录获取扫描登录功能,可尝试利用单点登录与扫码获取一个低权限的x-token,如QQ单点登录
开放注册
如下,也可通过注册获取一个低权限的x-token
案例1:TSRC逻辑撞库漏洞
平台提供注册功能,自定义接口未鉴权,/api/user/getUserList
获取平台所有用户列表
python脚本简单处理,提取一下用户名
存在绕过思路1,撞库获取大量用户权限,包括管理员
前面在历史漏洞中提到过,setSystemConfig文件,该文件记录了整个平台的各种配置,包括jwt、mysql password、aksk等,利用setSystemConfig文件读取AKSK创建crossfire后门用户接管腾讯某游戏工作室云控制台
0x02 后台攻击面
到目前结束了吗?前面提到过,开放注册接口能获取低权限的x-token,意味着还有后台攻击面,后台的漏洞过多,就不多阐述,主要写一个通杀的提权思路,前面的历史漏洞也说到了很多,但是不知道为什么很多师傅都没有注意到/api/user/admin_register
这一个默认的接口,代码逻辑在 /server/api/v1/system/sys_user.go
的第141行
该接口允许低权限账号注册一个管理员账户,在满足:开放注册的前提下或低权限用户情景下,调用管理员注册接口注册一个管理员账号,再通过登录接口获取jwt登录至后台。
漏洞复现:利用官方的环境先新增一个低权限角色,角色权限只有用户登录
新增一个ceshi123
用户,用户角色权限为刚刚新增的test即可
测试角色权限如下
漏洞复现:只要满足获取到一个低权限jwt的前提下,就可以通过这个接口,注册一个管理员权限账号,接管后台,其中"AuthorityId":888
默认为管理员权限,Poc如下:
|
|
属于一个没啥技术的小0day,目前漏洞已同步给了官方,官方已确认
案例2:80199报告bypass再次获取aksk
通过获取到的低权限jwt,即可调⽤/api/user/admin_register
接⼝越权注册⼀个管理员账户,接管oss存储桶
案例3:报告再次bypass再次获取aksk
前面案例1的时候,提到过自定义接口未鉴权,Golang本身能RCE的漏洞很少,但是比如zip包造成的文件读取类,权限逻辑类漏洞非常多,前面的/api/user/admin_register
接口就连官方也没有注意鉴权,那么自定义的接口,是不是在权限上,是不是也会存在越权,开发在后台自定义了/api/common/getConfigListxxxx
接口,通过该接口再次越权读取配置文件获取aksk劫持桶,以及另外其它fuzz处理的接口获取到一些用户列表等
0x05 武器化
学习golang编程练习写的一款简单的gin-vue-admin框架利用小工具
能力有限,代码写得很垃圾,各位师傅们轻喷,也欢迎各位师傅指导与讨论
声明:此工具仅作学习交流用,不要做任何违法行为,如果违法&恶意操作,与本人无关!!!
主要功能
- 前端绕过
- 绕过思路1:只判断
captchaId
与captcha
是否为空,不校验验证码是否正确 - 绕过思路2:只判断
captchaId
与captcha
是否为空,不校验验证码是否正确
- 绕过思路1:只判断
- 绕过后撞库
- Username:内置字典,默认
"admin", "test", "demo", "guest", "test1", "user", "ceshi", "test123", "system", "web", "sys", "admin1"
- password:加载根目录
bigpasswdDict.txt
文件
- Username:内置字典,默认
- 漏洞利用
- 提权/后门利用(CNVD-2024-00979)
- 读取系统配置利用
使用说明
|
|
编译命令
|
|
运行截图
|
|
|
|
计划
- 添加第二种撞库模式,引入字典dict,固定密码撞库(实现不难,但是太懒了)
设计
代码整体逻辑如下
|
|
Bug记录
1. 并发数过高而导致的程序奔溃
- 解决方案:用信号量
semaphore
来限制最大并发数
sem := semaphore.NewWeighted(int64(maxGoroutines))
创建了一个新的信号量,其最大并发数由 maxGoroutines
变量控制。每次启动一个新的 goroutine 之前,都会调用 sem.Acquire
来尝试获取一个资源。如果当前的并发数已经达到了最大值(即信号量的计数器为0),那么 Acquire
会阻塞,直到有其他的 goroutine
调用 Release
释放一个资源。这样就可以确保任何时候运行的 goroutine
数量不会超过 maxGoroutines
|
|
2. 部分站点登录接口为/base/login
- 解决方案:如果 HTTP 响应的状态码为 404,更改 URL 重新尝试请求
|
|
3.站点不安全、ssl证书过期导致请求问题
- 解决方案:创建新的 HTTP 客户端,禁用 SSL 证书验证
|
|