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 для отдельных категорий

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

Популярное

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

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

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

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

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

Abraxas Labs - joomla-articles-catid

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  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-запросом в категорию, в которой ему отказано в UI.

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, com_content core.manage и 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, имея право только на DraftsТот же 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-токен / 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'));
}

Административный 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 — это тело "not permitted" в UI, а не статус 403.

Исправление

Переопределите allowAdd (и allowEdit) в api/components/com_content/src/Controller/ArticlesController.php так же, как в административном ArticleController: проверяйте core.create для com_content.category.{catid}. Передавайте JSON запроса в ApiController::add(), чтобы catid действительно доходил до этой проверки. Примените тот же подход к contacts, banners и newsfeeds, если эти контроллеры остаются на стандартном allowAdd.

Ссылки

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