📚 Теория: XSS в Java Servlet (раскрыть)
Откуда берётся XSS?
Servlet выводит строку целиком в HTML. Если строка пришла из запроса, злоумышленник может передать <script> и браузер выполнит его.
🔎 Признак: конкатенация пользовательского ввода внутри out.println().
Почему фильтр не сработал?
В Servlet API нет автоматического экранирования. Нужно явно вызвать StringEscapeUtils, HtmlUtils или применять ESAPI.
🛡️ Подбираем экранирование под контекст (HTML, атрибут, JS).
Передаёт сообщение: ?message=<script>alert(1)</script>
Вставляет параметр в HTML без экранирования.
Выполняет скрипт, который крадёт cookie или сессию.
Быстрый фикс: out.println(HtmlEscapers.htmlEscaper().escape(message)); или использовать JSTL <c:out>. Главное — никогда не конкатенируй необработанный ввод в HTML.
Контекст
Команда реализовала гостевую книгу, где пользовательское сообщение выводится прямо в шаблон. Предполагается, что фронтенд сам присылает безопасные данные — но это неверно. Разработчик забывает экранировать вывод и получает XSS.
- Проверь, как формируется HTML-ответ в блоке с
PrintWriter. - Подскажи, какое API использовать для безопасного вывода.
- Отметь строку и добавь комментарий: он попадёт в итоговый отчёт.
Сниппет
Code Review
Референс-фигура
Нужно пропускать строку через экранирование перед выводом. Можно вынести логику в отдельный helper, чтобы не забывать про защиту.
Флаг ревью: FLAG{java-servlet-xss-review}
String raw = request.getParameter("message");
String safe = StringEscapeUtils.escapeHtml4(raw);
try (PrintWriter out = response.getWriter()) {
out.println("<p class=\\"card__body\\">" + safe + "</p>");
}
В Servlet всегда экранируй пользовательский ввод перед тем, как писать его в PrintWriter. Для JSON ответов используй ObjectMapper, а в JSP — теги <c:out> или fn:escapeXml.
Проверка флага
После ревью команда фиксирует флаг в отчёте. Введи его, чтобы зачесть лабораторию на дашборде.