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

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

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

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

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

Категории

Все категории
Loading categories
joomla-articles-catid — Joomla 6.1.3 - Высокий - Удалённый - ACL - POST /api/v1/content/articles игнорирует ACL для отдельных категорий | Kitploit
Инструменты/GitHubGitHub/abraxas/joomla-articles-catid
Аутентификация и авторизацияАнализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеБезопасность APIЛаборатории и Практика
GitHubabraxas/joomla-articles-catid

joomla-articles-catid

Joomla 6.1.3 - Высокий - Удалённый - ACL - POST /api/v1/content/articles игнорирует ACL для отдельных категорий

159 дней назадЕщё не проверено

Популярное

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

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

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

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

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

Abraxas Labs - joomla-articles-catid

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  joomla-articles-catid

Разбор: https://abraxaslabs.tech/research/joomla-articles-catid

joomla-articles-catid

Класс: Остаточные привилегии Доступ: Удалённый

Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters

Проверка ArticleController::allowAdd в административной части использует com_content.category.{catid}. В файле api/components/com_content/src/Controller/ArticlesController.php метод allowAdd отсутствует. Затем ApiController::add() вызывает allowAdd() без данных, поэтому JSON-поле catid никогда не попадает в проверку. Базовый allowAdd возвращает true, если пользователь может создавать материалы в любой категории.

Пользователь API класса Manager, которому выданы core.login.api и право создания в одной категории, может отправить POST-запрос с материалом в категорию, в которой ему отказано в интерфейсе.

IDCVE пока нет
КлассОстаточные привилегии / обход авторизации
ДоступУдалённый (API-токен с core.login.api)
CWECWE-863
CVSSСредний: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N
ПродуктJoomla CMS
Затронуто6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2), POST /api/index.php/v1/content/articles
АутентификацияAPI-токен для Manager (группа 6) с core.login.api, core.manage в com_content и core.create только в одной категории. Без Super User. По умолчанию core.login.api доступен только Super User.
ЛицензияGNU Affero GPL v3.0
Лабораториятолько 127.0.0.1

Что может сделать атакующий

Использовать API-токен не-Super-User, которому разрешено создание в одной категории, чтобы публиковать материалы в категориях, где ему это запрещено. Из-за этой остаточной привилегии он не становится Super User. Это несанкционированная публикация, а не захват сайта и не чтение скрытых материалов.

ПривилегияМетод / путьТипДоказано в лаборатории или выведено
Создание статьи в категории, к которой доступ запрещёнPOST /api/index.php/v1/content/articles JSON catid категории BцелостностьДоказано в лаборатории. HTTP 200, #__content id=1, catid=9 (Press), заголовок poc-art-JOOMLA-ARTICLES-CATID-WITNESS
Размещение опубликованной копии в Official notices / Press при разрешении только черновиковТот же POST, state=1целостностьДоказано в лаборатории создание в запрещённой Press. Выведено для любого другого ресурса категории с запрещённым core.create
Редактирование существующей статьи через APIPATCH /api/index.php/v1/content/articles/{id}н/дВыведено как закрыто для этого Manager. Базовый allowEdit требует core.edit компонента; правила com_content в лаборатории дают core.edit Author (4), а не Manager (6). В лаборатории PATCH не выполнялся
Удаление статьи через APIDELETE /api/index.php/v1/content/articles/{id}н/дВыведено как закрыто. Базовый allowDelete требует core.delete компонента. В лаборатории DELETE не выполнялся
Сохранение статьи в разрешённую категорию A из администратораPOST ... task=article.save jform[catid]=AпредполагаемоеДоказано в лаборатории открыто, как и задумано. HTTP 200, отказа нет
Сохранение статьи в запрещённую категорию B из администратораТот же task, jform[catid]=Bн/дДоказано в лаборатории закрыто. HTTP 200 с "not permitted" / create-not-permitted (UI allowAdd на com_content.category.B)
Обращение к API со стандартным Manager (без core.login.api)Bearer token / X-Joomla-Tokenн/дВыведено как закрыто. По умолчанию core.login.api доступен только Super User (группа 8). В этой лаборатории он сначала выдан группе 6
Та же брешь в contacts / banners / newsfeedsPOST /api/index.php/v1/contacts (и аналогичные) с чужим catidцелостностьВыведено. В этих API-контроллерах также отсутствует allowAdd. В лаборатории они не проверялись
RCE через Super User / installerн/дн/дЗакрыто. Manager остаётся Manager

Как я это нашёл

Я зафиксировал 6.1.3 после волны JSST 2026-07/08. Groups API уже требует core.admin. Media webservice уже требует core.edit для override. Articles API по-прежнему проходит через ApiController и считает "создание в любой категории" достаточным для любого catid.

public function add()
{
    if (!$this->allowAdd()) {
        throw new NotAllowed('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED', 403);
    }
    $recordId = $this->save();
    $this->displayItem($recordId);
}

Базовая проверка:

protected function allowAdd($data = [])
{
    $user = $this->app->getIdentity();

    if (!$user->authorise('core.manage', $this->option)) {
        return false;
    }

    return $user->authorise('core.create', $this->option)
        || \count($user->getAuthorisedCategories($this->option, 'core.create'));
}

Administrator UI уже ориентируется на catid:

protected function allowAdd($data = [])
{
    $categoryId = ArrayHelper::getValue(
        $data,
        'catid',
        $this->input->getInt('filter_category_id'),
        'int'
    );

    if ($categoryId) {
        return $this->app->getIdentity()->authorise(
            'core.create',
            'com_content.category.' . $categoryId
        );
    }

    return parent::allowAdd();
}

Уже зафиксированные ошибочные шаги: трактовка HTTP 200 от UI как разрешения (отказ для B — это тело «not permitted»); трактовка компонента core.create как дыры (в лабораторном Manager его нет; одного разрешения категории достаточно для подсчёта базового getAuthorisedCategories); стандартный Manager без core.login.api. Театральщина: reverse shell. Оракул — API 200 в Press плюс разрешение UI на Drafts плюс отказ UI на Press.

Остатки того же пина: levels API, menu items API, media override.

Лаборатория

python3 joomla-articles-catid-Abraxas-Labs.py

или

cd lab
./run.sh

Цель — только http://127.0.0.1:19550. Образ joomla:6.1.3-php8.3-apache плюс mariadb:11.4.

SUCCESS joomla-articles-catid api-http=200 article-id=1 catid=9 cat-a=8 cat-b=9 ui-a=200 ui-b=200 JOOMLA-ARTICLES-CATID-WITNESS

article-id — это следующий автоинкремент #__content (1 при чистой установке 6.1.3). ui-a / ui-b возвращают HTTP 200; отказ для B — это тело ответа UI «not permitted», а не статус 403.

Исправление

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