/726.jpg

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 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 func (autoApi *AutoCodeApi) AutoPlug(c *gin.Context) { var a system.AutoPlugReq err := c.ShouldBindJSON(&a) if err != nil { response.FailWithMessage(err.Error(), c) return } a.Snake = strings.ToLower(a.PlugName) a.NeedModel = a.HasRequest || a.HasResponse err = autoCodeService.CreatePlug(a) if err != nil { global.GVA_LOG.Error("预览失败!", zap.

API渗透测试

API渗透测试 0x00 前言 在昨天阅读国外的文章的时候,翻到了一篇 Microsoft Regional Director DANA的文章,我个人是很喜欢去测试API接口的,比如面试官常问的,“给你个登录框你有什么思路 ”,在很久以前面QAX的时候,有梳理过一个思路,如下: 大多数情况下,特别是最近吧,发现自己漏洞挖掘越来越没有耐心了,所以我觉得应该让测试流程化,而流程化的第一个步骤,我觉得就是梳理站点的API文档。 0x01 API文档梳理 回到Microsoft Regional Director DANA的文章里,DANA详细的教学了为什么要梳理一份API文档(当然源站点自带api-docs最好)以及如何去梳理一份API文档,具体为什么要梳理以及一些Swagger, and the OpenAPI specification原理等,可以去原文看DANA文章 How to craft rogue API docs for a target when they don’t exist,这里只简单记录一下如何操作。 首先需要用到的工具有: mitmproxy2swagger 1 pip install mitmproxy2swagger 使用谷歌浏览器利用开发者工具捕获流量,首先打开F12,设置保留日志与禁用缓存 尽可能的把所有的功能点触发一遍,包括不限于,修改头像、评论、举报等等 生成 HTTP 存档 (HAR) 利用前面提到的工具mitmproxy2swagger将HAR转换为简单的openai规范文档 1 mitmproxy2swagger -i ***.***.com.har -o crapi.yaml -p http://***.***.com -e -f har -i:用谷歌浏览器保存下来的HAR源文件 -o:输出要生成的yaml文件 -p:调用API的前缀,通常为 target.domain 或 target.domain/v1 等 -e:在文档中提供示例数据,这些数据为刚刚我们浏览器捕获的真实数据,如不想泄露或者需要将文档分享给他人,建议不加这个参数 -f:这告诉工具输入文件是 HAR 捕获,而不是典型的 mitmproxy流文件 文档生成后,在x-path-templates 下有大量以"-ignore:/“开头的行,我们需要打开文件并删除任何看似 API 调用的请求上的"ignore:"。并且忽略/删除图像、图标、HTML、Javascript 等内容,使文档看起来变成如下:

2021 CISP-PTE 笔记

SQL注入 联合查询注入 : union all语句,联合查询语句用于操作符用于合并两个或多个 SELECT 语句的结果集,all的意思允许存在重复的结果集。 考点 联合查询注入技巧就是注意语句的闭合以及WAF的绕过。 1 id=-1’ union all select 1,2,3,4,5 -- - 基于报错注入 : updatexml函数是一个更新xml文档的函数,由于updatexml的第二个参数需要Xpath格式的字符串,以0x7e开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,最终会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了 考点 报错注入技巧就是靠背格式,0x7e可以替换为1也可以替换成~,但是推荐使用0x7e,不然会出现显示不全的情况。 1 id=-1' or updatexml(1,concat(0x7e,(select version()),0x7e),1)-- - 二次注入 : 当我们注册一个admin'#账户并用这个账户修改密码时 环境:/sqli-labs-master/Less-24/ 二次注入SQL语句: 1 use `security`; UPDATE users SET PASSWORD='123456789' where username='admin'#' and password='12345678' 简单理解一下。最终实际的SQL语句: 1 UPDATE users SET PASSWORD='123456789' where username='admin' 基于时间的盲注 : benchmark函数与sleep函数,benchmark函数是Mysql的一个内置函数,其作用是来测试一些函数的执行速度,而sleep函数就是一个延迟函数,时间盲注的特点就是根据服务端的响应时间来判断,所以实际做题中最好把浏览器中的F12开启,方面对照,下面演示两种方法的语法 第一种方式:执行1000000000000次md5加L1917,实战中可以用于SQL DDOS 1 select benchmark (1000000000000,md5("L1917")) 利用benchmark延时函数判断数据库版本 1 id=1' and if (substring(@@version,1,1)=5,benchmark(1000000,md5("L1917")),null)-- - 第二种方式: 1 id=1' and if (substring(@@version,1,1)=5,sleep(5),null)-- - 基于布尔的盲注 :ascii与if两种方式,ascii是一个加密函数,用于加密文本为成ascii码,if则是一个判断函数

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刷新验证码 当系统管理员在二开接入单点登录或注册接口时,会出现配置不当的情况存在,可以尝试绕过 绕过思路1 只判断captchaId与captcha是否为空,不校验验证码是否正确,captcha与captchaId无论为多少都会回显 {"code":7,"data":{},"msg":"用户名不存在或者密码错误"} 绕过思路2 校验验证码是否正确但不判断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如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 POST /api/user/admin_register HTTP/1.1 Host: X-Token: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.

2023 年终

很难的一年,心态很差的一年,酗酒成瘾,但总得来说,每年都希望自己能向上走一个台阶,今年,也勉强做到了吧。