远程代码执行漏洞
漏洞描述
攻击者可以向 batch-requests 插件发送请求来绕过管理 API 的 IP 限制。Apache APISIX 的默认配置(带有默认的 API 密钥)容易受到远程代码执行的攻击。当管理密钥更改或管理 API 端口更改为与数据面板不同的端口时,影响较小。但是,绕过 Apache APISIX 数据面板的 IP 限制仍然存在风险。在 batch-requests 插件中有一个检查,它用真实的远程 IP 覆盖客户端 IP。但是由于代码中的一个 bug,这个检查可以被绕过。
batch-requests 插件介绍
batch-requests 插件可以一次接受多个请求并以 http pipeline 的方式在网关发起多个 http 请求,合并结果后再返回客户端,这在客户端需要访问多个接口时可以显著地提升请求性能。
在漏洞版本中、默认是启用状态。
https://apisix.apache.org/zh/docs/apisix/2.12/plugins/batch-requests/
复现思路:
1、搭建漏洞环境。(注意需要修改:conf.yaml/allow_admin)
2、查看 diff 记录、进行简单调试,漏洞分析。
3、漏洞测试。
漏洞版本
环境搭建
①网络安全学习路线
②20 份渗透测试电子书
③安全攻防 357 页笔记
④50 份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100 个漏洞实战案例
⑧安全大厂内部视频资源

将 allow_admin 修改为 127.0.0.0/24,此处修改的实际为 nginx.conf。
使用 docker-compose 创建 docker 容器。
在服务启动阶段、会读取 config.yaml、生成 nginx.conf 。
1、会基于 Lua 模板 apisix/cli/ngx_tpl.lua 文件生成 nginx.conf。
2、调用 ngx_http_access_module 模块。该模块限制客户端对某些地址的访问。

进入到容器中查看,conf/nginx.conf。allow/deny 是设置允许与拒绝访问的地址。只允许 127.0.0.1/24 访问 /apisix/admin 接口。

Admin api 接口如下:


漏洞分析
diff :


查看 diff 记录后、修复方式是将 real_ip_hdr 转化为小写。
1、查看插件 batch-requests 代码,问题是出现在 set_common_header() 函数中

函数参数为 data 是我们传入的请求体经过 json.decode()后的数据、类型为"table"。

查看代码,real_ip_hdr 为调用 try_read_attr()函数获取到的返回值。通过遍历表结构、获取到 real_ip_header 的值然后再赋值给 real_ip_hdr 。
select('#', ...) 获取输入参数的数量,
select(i, ...) 获取第 n 个参数,


注意:此时的 real_ip_hdr 为 X-Real-IP 为大写。该值为在系统启动后、给定的默认值。

2、通过遍历 data.pipeline 和 data.headers 、将 data.headers 出现的头信息赋值给 data.pipline。发现 data.headers 中出现了 x-real-ip:127.0.0.1 ,这是我们调用 batch-requests 插件传递的头信息,而此时系统默认的 X-Real-IP 为大写。

在请求头覆盖中、因为 real_ip_hdr 为 X-Real-IP , 函数 core.request.get_remote_clinte_ip()获取远程客户端 ip、不能将 x-real-ip 给覆盖。

查看此时的栈数据。在 data.headers 中出现了 x-real-ip 与 X-Real-IP。

最后经由 batch-requests 插件、使用 PUT 方法将请求发送到 /apisix/admin/xxxx 注册新的路由。通过 filter_func 参数可写入一段 lua 代码、造成远程代码执行。

漏洞测试

利用条件
batch-requests 插件默认开启状态。
用户使用了 Apache APISIX 默认配置(启用 Admin API ,使用默认 Admin Key 且没有额外分配管理端口),攻击者可以通过 batch-requests 插件调用 Admin API 。
攻击思路
1、利用 batch-requests 插件漏洞、绕过请求头检测;
2、通过伪造请求头、向 Admin API 注册路由;
3、注册路由时、携带参数 filter_func 传递 lua 代码、造成远程代码执行漏洞。
修复意见
更新至最新版本
禁用 batch-requests 插件
评论