
Уязвимость межсайтового скриптинга на основе DOM (XSS) в novel V3.5.0 (CWE-79)
novel (V3.5.0) — платформа для чтения романов на базе Spring Boot 3 и Vue 3 — содержит уязвимость межсайтового скриптинга на основе DOM в модуле комментариев к книгам. Проблема заключается в недостаточной проверке/кодировании пользовательского контента комментариев: Бэкенд: поле commentContent (в сущности/DTO BookComment) сохраняется в базе данных и возвращается через API без фильтрации вредоносного HTML/JS-кода; Фронтенд: платформа получает незакодированные комментарии, сохраняет их в window.localStorage (ключ: book_comment_{bookId}) и отображает данные непосредственно в DOM через директиву v-html Vue 3 (без санитизации). Злоумышленники могут отправлять вредоносные комментарии (после входа в систему), заставлять пользователей переходить на затронутые страницы и вызывать выполнение кода, чтобы украсть сессионные cookie, подменить личность или изменить содержимое страницы.
Целевая версия: novel V3.5.0 Окружение: Chrome/Firefox, учетная запись легитимного пользователя (требуется вход) Затронутые URL: Страница деталей романа (http://117.72.165.13:8888/book/detail.html?id={bookId}) и страница списка комментариев (http://117.72.165.13:8888/book/comment-{bookId}.html)
Уязвимость срабатывает в модуле комментариев к книгам (основная бизнес-логика):
Бэкенд: поле commentContent в сущности/DTO BookComment сохраняется в таблице book_comment и возвращается через API списка комментариев (/api/book/comment/list?bookId={bookId}) без фильтрации вредоносного HTML/JS-кода.
Фронтенд: страница получает незакодированный контент комментария из API, сохраняет его в window.localStorage (ключ: book_comment_{bookId}, например book_comment_37 для ID книги 37) и отображает данные непосредственно в DOM через директиву v-html Vue 3 (вставляется в тег <li class="dec">) без санитизации.
http://117.72.165.13:8888/book/1935650139770011648/1984484631582167040.html?switch=on&wvstest=<svg onload="alert('DOM-XSS-Test')">
(Страница сохранит значение параметра wvstest в window.localStorage)
localStorage.setItem('book_comment_37', '');


Откройте http://117.72.165.13:8888/user/login.html, войдите с легитимной учетной записью и перейдите на страницу деталей романа.
Найдите текстовое поле комментария (id="txtComment") на странице, введите вредоносную нагрузку (). Нажмите кнопку «Submit», чтобы запустить метод BookDetail.SaveComment(37, 0, payload) (37 — это bookId).
Обновите страницу деталей романа; фронтенд вызывает /api/book/comment/list?bookId=37 для получения вредоносного комментария и сохраняет его в window.localStorage (ключ: book_comment_37).
Наблюдайте, как на странице появляется всплывающее окно с отображением сессионной cookie пользователя (подтверждение выполнения вредоносного кода).
Нажмите F12, чтобы открыть инструменты разработчика. Переключитесь на панель «Elements», найдите в DOM-структуре (подтверждение, что нагрузка вставлена в тег <li class="dec">).
