• 远程代码执行漏洞


    漏洞描述

    攻击者可以向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、漏洞测试。

    漏洞版本

    Apache APISIX 1.3 ~ 2.12.1 之间的所有版本(不包含 2.12.1 )
    
    Apache APISIX 2.10.0 ~ 2.10.4 LTS 之间的所有版本(不包含 2.10.4)
    
    • 1
    • 2
    • 3

    环境搭建

    【一一帮助安全学习,所有资源获取处一一】
    ①网络安全学习路线
    ②20份渗透测试电子书
    ③安全攻防357页笔记
    ④50份安全攻防面试指南
    ⑤安全红队渗透工具包
    ⑥网络安全必备书籍
    ⑦100个漏洞实战案例
    ⑧安全大厂内部视频资源

    image.png

    cd CVE-2022-24112-main/apisix-docker/example/
    
    vi apisix_conf/config.yaml
    
    • 1
    • 2
    • 3

    将 allow_admin 修改为 127.0.0.0/24,此处修改的实际为nginx.conf。

    使用 docker-compose 创建docker容器。

    docker-compose -p apisixCveTest up -d
    
    • 1

    在服务启动阶段、会读取config.yaml、生成nginx.conf 。

    1、会基于 Lua 模板 apisix/cli/ngx_tpl.lua 文件生成 nginx.conf。

    2、调用 ngx_http_access_module 模块。该模块限制客户端对某些地址的访问。
    1664431618_6335360254f19ba744f11.jpeg

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

    Admin api 接口如下:
    1664431653_633536252b39a1fd9a66b.png

    1664431666_63353632836eac361239d.png

    漏洞分析

    diff :
    image.png

    image.png

    查看diff记录后、修复方式是将real_ip_hdr 转化为小写。

    1、查看插件batch-requests 代码,问题是出现在 set_common_header() 函数中
    1664431727_6335366f48ce307b5065f.jpeg

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

    查看代码,real_ip_hdr 为调用 try_read_attr()函数获取到的返回值。通过遍历表结构、获取到 real_ip_header 的值然后再赋值给real_ip_hdr 。

    select(‘#’, …) 获取输入参数的数量,

    select(i, …) 获取第 n 个参数,
    1664431801_633536b9e0bea5d06ec2d.jpeg

    1664431814_633536c651f7af1237553.jpeg

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

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

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

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

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

    漏洞测试

    image.png

    利用条件

    • batch-requests插件默认开启状态。

    • 用户使用了 Apache APISIX 默认配置(启用 Admin API ,使用默认 Admin Key 且没有额外分配管理端口),攻击者可以通过 batch-requests 插件调用 Admin API 。

    攻击思路

    1、利用batch-requests 插件漏洞、绕过请求头检测;

    2、通过伪造请求头、向Admin API 注册路由;

    3、注册路由时、携带参数filter_func 传递 lua代码、造成远程代码执行漏洞。

    修复意见

    • 更新至最新版本

    • 禁用batch-requests 插件

  • 相关阅读:
    React中的路由基础知识(一级路由),5版本的!!!
    代码随想录算法训练营Day35 | 贪心算法(4/6) LeetCode 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
    Golang swagger :missing required param comment parameters
    <TypeScript系列>:常量断言 as const
    有向图、无向图相关数据结构
    触摸屏实验(触摸屏介绍+硬件设计+软件设计。注:软件部分代码过长,理解即可)
    Godot4实现游戏的多语言版本
    springmvc-day01
    c语言练习72:关于截断和整形提升
    在HbuilderX中,@tap和@click的含义 与 区别 及 使用方式
  • 原文地址:https://blog.csdn.net/kali_Ma/article/details/127604884