Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2023-39361 — Analisi passo-passo e configurazione del laboratorio per CVE-2023-39361, un'iniezione SQL non autenticata in Cacti v1.2.24, con procedura di sfruttamento e mitigazione. | Kitploit
Strumenti/GitHubGitHub/hpt-intern-task-submission/cve-2023-39361
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebApprendimento e FormazioneLab e Pratica
GitHubhpt-intern-task-submission/cve-2023-39361

CVE-2023-39361

Analisi passo-passo e configurazione del laboratorio per CVE-2023-39361, un'iniezione SQL non autenticata in Cacti v1.2.24, con procedura di sfruttamento e mitigazione.

Vedi Repository
102 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

[CVE-2023-39361] SQL injection non autenticata in Cacti v1.2.24

Panoramica

Cacti è uno strumento open-source di monitoraggio operativo scritto in PHP, MySQL/MariaDB, che fornisce un'interfaccia amichevole. La vulnerabilità è stata trovata nel 2023 e ha interessato tutte le versioni precedenti alla 1.2.24. Questo difetto di sicurezza risiede nell'implementazione impropria durante l'inserimento dei valori nella query SQL. Si tratta di una vulnerabilità critica di SQL injection che consente agli attaccanti di modificare il database e anche di eseguire codice in remoto.

Configurazione del laboratorio:

In questa analisi, eseguirò Cacti in Docker per semplicità. Per prima cosa, creeremo il file docker-compose.yml come di seguito ed eseguiremo il comando docker-compose up -d.

version: '3.5'

services:

  
  

cacti:

image: "smcline06/cacti"

container_name: CVE-2023-39361

domainname: example.com

hostname: cacti

ports:

- "80:80"

- "443:443"

environment:

- DB_NAME=cacti_master

- DB_USER=cactiuser

- DB_PASS=cactipassword

- DB_HOST=db

- DB_PORT=3306

- DB_ROOT_PASS=rootpassword

- INITIALIZE_DB=1

- TZ=America/Los_Angeles

volumes:

- cacti-data:/cacti

- cacti-spine:/spine

- cacti-backups:/backups

links:

- db

  
  

db:

image: "mariadb:10.3"

container_name: CVE-2023-39361_db

domainname: example.com

hostname: db

ports:

- "3306:3306"

command:

- mysqld

- --character-set-server=utf8mb4

- --collation-server=utf8mb4_unicode_ci

- --max_connections=200

- --max_heap_table_size=128M

- --max_allowed_packet=32M

- --tmp_table_size=128M

- --join_buffer_size=128M

- --innodb_buffer_pool_size=1G

- --innodb_doublewrite=ON

- --innodb_flush_log_at_timeout=3

- --innodb_read_io_threads=32

- --innodb_write_io_threads=16

- --innodb_buffer_pool_instances=9

- --innodb_file_format=Barracuda

- --innodb_large_prefix=1

- --innodb_io_capacity=5000

- --innodb_io_capacity_max=10000

environment:

- MYSQL_ROOT_PASSWORD=rootpassword

- TZ=America/Los_Angeles

volumes:

- cacti-db:/var/lib/mysql

  
  

volumes:

cacti-db:

cacti-data:

cacti-spine:

cacti-backups:

Dopo aver creato il container, possiamo accedere a Cacti visitando http://localhost:80. Il passo successivo è aggiornare Cacti alla versione 1.2.24. Puoi scaricare lo script di aggiornamento qui: https://pastebin.com/NfRiHLjR. Salva il file nella stessa directory del file docker-compose.yml e rinominalo in upgrade_cacti.sh. Quindi esegui questi 2 comandi:

docker cp upgrade_cacti.sh CVE-2023-39361:/tmp/upgrade_cacti.sh && docker exec -it CVE-2023-39361 bash -c "bash /tmp/upgrade_cacti.sh"

Ora siamo pronti, immergiamoci nel codice per vedere cosa ci permette di effettuare un attacco di SQL injection. Il file vulnerabile è graph_view.php e per accedervi è sufficiente l'utente guest, il che consente a chiunque di sfruttare questa vulnerabilità. In questo file, la funzione insicura è grow_right_pane_tree().

grow_right_pane_tree

Prima di addentrarci in questa funzione, dobbiamo rintracciare a ritroso come viene eseguita.

<?php
switch (get_nfilter_request_var('action')) {
//.... 
// Many other cases
case  'tree_content':
	//..... Some code here
	// ---------
	if (isset_request_var('node')) {
		$parts = explode('-', sanitize_search_string(get_request_var('node')));
		// Check for tree anchor
		if (strpos(get_nfilter_request_var('node'), 'tree_anchor') !== false) {
			$tree_id = $parts[1];
			$node_id = 0;
		} 
	//..... Some code here

	if ($tree_id > 0) {
		if (!is_tree_allowed($tree_id)) {
			header('Location: permission_denied.php');
			exit;
		}
		// Vulnerable function is called here
		grow_right_pane_tree($tree_id, $node_id, $hgdata);
	}

Dal frammento di codice qui sopra, possiamo vedere che la funzione viene eseguita se $tree_id > 0. Tutti i passaggi possono essere spiegati come segue:

  • In primo luogo, il programma prende il valore del parametro action dall'input dell'utente e entra in un'istruzione switch/case.

  • Nel caso tree_content, il codice prende il parametro di richiesta node dall'utente. Successivamente, divide l'input tramite il carattere -, lo salva in $part e infine controlla se tree_anchor appare in node. Se tutte le condizioni corrispondono, $tree_id verrà assegnato come secondo elemento di $part. Ad esempio, tree_content-1 o 1-2-tree_content saranno validi e il valore di $tree_id sarà rispettivamente assegnato.

Da questo punto, la nostra URL sarà simile a questa: http://localhost:80?action=tree_content&node=tree_anchor-1. Ora è il momento di analizzare la funzione grow_right_pane_tree() per sfruttare il bug.

grow_right_pane_tree_analyze

Il parametro vulnerabile è rfilter, che viene passato direttamente nell'operando RLIKE all'interno della clausola WHERE. Ciò che lo rende vulnerabile è che rfilter è racchiuso tra doppi apici ", ma il parametro viene controllato dalla funzione html_validate_tree_vars(), che si presenta così:

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');
	/* ================= input validation ================= */
	// ........
}

Il tipo di filtro di rfilter è impostato su FILTER_VALIDATE_IS_REGEX e salvato all'interno di $filters, poi $filter viene passato alla funzione validate_store_request_vars(). Immergiamoci in questa funzione, rivelerà il resto della nostra analisi:

function validate_store_request_vars($filters, $sess_prefix = '') {
	// .......
	if (cacti_sizeof($filters)) {
		foreach($filters as $variable => $options) {
		// ....
		elseif ($options['filter'] == FILTER_VALIDATE_IS_REGEX) {
					if (is_base64_encoded($_REQUEST[$variable])) {
						$_REQUEST[$variable] = base64_decode($_REQUEST[$variable]);
					}
					$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;
	}

La funzione validate_store_request_vars() è responsabile della validazione dell'input dell'utente. Quando il tipo di filter è FILTER_VALIDATE_IS_REGEX, la funzione chiama validate_is_regex() con la funzione preg_match per verificare se il nostro input è valido. Secondo la documentazione PHP:

preg_match() restituisce 1 se pattern corrisponde al subject dato, 0 se non corrisponde, o false in caso di errore.

Scarica lo strumento