PVS-Studio.com logo
>
>
>
V5330. OWASP. Possible XSS injection. P…


V5330. OWASP. Possible XSS injection. Potentially tainted data might be used to execute a malicious script.

Анализатор обнаружил ситуацию, при которой данные, полученные из внешнего источника, могут быть использованы для запуска вредоносного скрипта. Подобный код может быть уязвим к XSS.

Уязвимости такого типа относятся к категории рисков OWASP Top 10 Application Security Risks 2021:

XSS (Cross-Site Scripting) — это уязвимость, которая позволяет злоумышленнику вставлять вредоносный JavaScript-код на веб-страницу, которую видит другой пользователь. В результате этого злоумышленник может украсть данные пользователя, провести фишинг-атаку или выполнить другие злонамеренные действия.

К XSS чаще всего уязвимы параметры URL, тело HTTP-запроса и поля ввода HTML-страниц.

Примером кода, подверженного XSS-инъекции, может быть такая обработка запроса в Servlet:

protected void doPost(HttpServletRequest req, HttpServletResponse res) {
  String comment = req.getParameter("comment");
  res.setContentType("text/html");
  res.getWriter().write("<html><body>");
  res.getWriter().write("<h3>User Comment:</h3>");
  res.getWriter().write("<p>" + comment + "</p>");
  res.getWriter().write("</body></html>");
}

Данный метод принимает комментарий от пользователя и возвращает ответ, который затем будет отображён на странице. Но так как сообщение будет отправлено без предварительной фильтрации, злоумышленник может указать следующие значение для параметра comment:

<script>alert("XSS Injection")</script>

Когда страница открывается, браузер пользователя выполняет этот вредоносный код, что приводит к всплывающему окну с сообщением "XSS Injection". В реальном случае злоумышленник может использовать более сложные и вредоносные скрипты для кражи cookies или выполнения других атак.

Исправить уязвимость можно с помощью методов, экранирующих ввод пользователя. В данном случае воспользуемся методом escapeHtml из библиотеки Apache Commons Lang:

protected void doPost(HttpServletRequest req, HttpServletResponse res) {
  String comment = req.getParameter("comment");
  res.setContentType("text/html");
  res.getWriter().write("<html><body>");
  res.getWriter().write("<h3>User Comment:</h3>");
  res.getWriter().write("<p>" + 
                        StringEscapeUtils.escapeHtml4(comment) 
                        + "</p>");
  res.getWriter().write("</body></html>");
}

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки непроверенного использования чувствительных данных (ввода пользователя, файлов, сети и пр.).

Данная диагностика классифицируется как: