gin-vue-admin底层任意代码覆盖CVE-2024-31457
0x01 框架描述
gin-vue-admin是基于vite+vue3+gin搭建的开发基础平台(支持TS,JS混用),集成jwt鉴权,权限管理,动态路由,显隐可控组件,分页封装,多点登录拦截,资源权限,上传下载,代码生成器,表单生成器,chatGPT自动查表等开发必备功能,目前大概19.8k stars。
0x02 环境部署
为了方便各类工具的使用等,golang的环境直接采用了g管理工具管理与安装
0x03 CVE:CVE-2024-31457
权限要求:X-Token配置代码生成权限
gin-vue-admin<=v2.6.1后台任意代码覆盖漏洞,在插件系统->插件模板功能中,攻击者可通过操控plugName参数进行目录穿越,并在指定穿越目录下创建指定文件夹api、config、global、model、router、service以及main.go主函数,并且文件夹中的go文件可根据特别的Poc参数自由插入代码。
受影响代码:https://github.com/flipped-aurora/gin-vue-admin/blob/746af378990ebf3367f8bb3d4e9684936df152e7/server/api/v1/system/sys_auto_code.go:239
先来看AutoCodeApi 结构体的方法 AutoPlug
|
|
var a system.AutoPlugReq
:声明一个system.AutoPlugReq类型的变量aerr := c.ShouldBindJSON(&a)
:c.ShouldBindJSON,Gin框架特有的方法,将JSON解析绑定指定的结构体上,这边是绑定在a变量上,如果解析过程中报错则赋值给err变量response.FailWithMessage(err.Error(), c)
gin-vue-admin框架的统一报错处理
a.Snake = strings.ToLower(a.PlugName)
:将 a.PlugName 字段的值转换为小写,并赋值给 a.Snake 字段。strings.ToLower 是 Go 语言中的字符串函数,用于将字符串转换为小写形式a.NeedModel = a.HasRequest || a.HasResponse
:判断AutoPlugReq结构体中的HasRequest与HasResponse,这里的主要作用是判断在插件模板中是否使用Request与使用Response- 最后,将变量a作为传参,接下来就是func (autoCodeService *AutoCodeService) CreatePlug(plug system.AutoPlugReq) error,CreatePlug方法部分
其中https://pkg.go.dev/github.com/flipped-aurora/gin-vue-admin/server/model/system#AutoPlugReq
结构体定义了我们可操控的参数,在实际覆盖代码攻击或配合其它利用链的时候,可根据该结构体构造代码,而结构体中PlugName
的可控是导致该漏洞存在的主要原因
|
|
根据a.Snake = strings.ToLower(a.PlugName)
->err = autoCodeService.CreatePlug(a)
,最后传给https://github.com/flipped-aurora/gin-vue-admin/blob/0c141cc6f74b42593fda6077dd86b24fd89463c0/server/service/system/sys_auto_code.go:719
CreatePlug方法进行创建模板
|
|
plug.CheckList()
:调用CheckList()方法列表参数中的Global、Request 和 Response 字段,并且在CheckList方法中适用bing函数遍历传入的列表参数 req 中的每个元素 info。对于每个元素,调用 Effective 方法进行有效性检查
漏洞复现:任意代码覆盖/代码污染
如目录穿越到gin-vue-admin/server目录下创建api、config、global、model、router、service即可污染源始代码与main.go,如覆盖/污染 C:\代码审计\server
目录下的go源码
POC:
|
|
查看main.go函数,成功根据我们的请求与global中的key值写入到代码中,造成代码覆盖与代码污染危害,后续可通过沟通特定的POC污染api、config、global、model、router、service中的go文件达到配置覆盖、命令执行等危害 污染config.go文件 目录如下:
文件污染
POC:
|
|
如POC如下:server_code_rce被成功创建在C盘根目录下,攻击者可通过构造特殊与特定的POC对服务器其它的go代码,其它文件目录进行代码污染。
0x03 gin-vue-admin<= v2.6.1底层任何代码写入02-漏洞描述
权限要求:普通权限即可
gin-vue-admin<=v2.6.1后台任意代码写入漏洞,Gin-vue-admin后台提供代码生成器功能,方便自动化生成代码,由于代码逻辑并没有对目录穿越漏洞进行限制,如strings.Index(fileName, "..") > -1
,导致攻击者可以通过目录穿越漏洞,在服务器任意位置生成指定名称文件夹,并可以在文件夹中生成指定名称的Go代码以及Go代码内容。
受影响代码:https://github.com/flipped-aurora/gin-vue-admin/blob/main/server/service/system/sys_auto_code.go:257
,在sys_auto_code.go
代码中定义了CreateTemp方法,如下:
|
|
makeDictTypes(&autoCode)
:调用makeDictTypes函数,为autoCode结构体中的字段设置字典类型- 遍历autoCode.Fields中的每个字段:
- 如果字段类型为"time.Time",则将autoCode.HasTimer设置为true,如果FieldSearchType不为空,则将autoCode.HasSearchTimer设置为true。
- 如果字段设置了Sort属性,将autoCode.NeedSort设置为true。
- ………
dataList, fileList, needMkdir, err := autoCodeService.getNeedList(&autoCode)
:调用了autoCodeService结构体的getNeedList方法,并传入了autoCode作为参数if err = utils.CreateDir(needMkdir...); err != nil {return err}
:生成写入文件前,先创建文件夹- 而目录穿越的漏洞点则在CreateDir方法:
if err := os.MkdirAll(v, os.ModePerm)
:
|
|
漏洞复现:
如目录穿越到C盘根目录下RCE文件夹,以及main.go代码文件 POC:
|
|
- package:为目录穿越路径
- humpPackageName:为生成go代码文件文件名
RCE目录被成功创建在C盘根目录下,攻击者可通过构造特殊与特定的POC对服务器其它的go代码,其它文件目录进行代码污染。