Эксплуация уязвимостей Extjs 4.2 на стороне сервера JavaScript / Хранение кода через инъекцию

Вопросы и ответы

Компания моего клиента провела проверку на уязвимости с помощью какого-то инструмента и (среди прочего) обнаружила уязвимость “JavaScript_Server_Side_Vulnerabilities/Stored_Code_Injection” в исходном коде extjs. В частности: с /extjs/ext-debug.js с 16894 по 21070 строку

        selectNode : function(path, root){
            return Ext.DomQuery.select(path, root, null, true)[0]; //<- строка 16894
        },
        update : function(html, loadScripts, callback) {
            var me = this,
                id,
                dom,
                interval;

            if (!me.dom) {
                return me;
            }
            html = html || '';
            dom = me.dom;

            if (loadScripts !== true) {
                dom.innerHTML = html;
                Ext.callback(callback, me);
                return me;
            }

            id  = Ext.id();
            html += '<span id="' + id + '"></span>';

            interval = setInterval(function() {
                var hd,
                    match,
                    attrs,
                    srcMatch,
                    typeMatch,
                    el,
                    s;
                if (!(el = DOC.getElementById(id))) {
                    return false;
                }
                clearInterval(interval);
                Ext.removeNode(el);
                hd = Ext.getHead().dom;

                while ((match = scriptTagRe.exec(html))) {
                    attrs = match[1];
                    srcMatch = attrs ? attrs.match(srcRe) : false;
                    if (srcMatch && srcMatch[2]) {
                       s = DOC.createElement("script");
                       s.src = srcMatch[2];
                       typeMatch = attrs.match(typeRe);
                       if (typeMatch && typeMatch[2]) {
                           s.type = typeMatch[2];
                       }
                       hd.appendChild(s);
                    } else if (match[2] && match[2].length > 0) {
                        if (window.execScript) {
                           window.execScript(match[2]);
                        } else {
                           window.eval(match[2]); //<- строка 21070
                        }
                    }
                }
                Ext.callback(callback, me);
            }, 20);
            dom.innerHTML = html.replace(replaceScriptTagRe, '');
            return me;
        },

Кто-нибудь сталкивался с аналогичной проблемой и знает, как ее исправить? Большое спасибо

Не нашел ничего на форумах

Ответ

Ответ на вопрос о уязвимости "JavaScript_Server_Side_Vulnerabilities/Stored_Code_Injection в ExtJS 4.2"

Уважаемый пользователь,

Проблема, с которой вы столкнулись, связана с уязвимостями, которые могут возникнуть при манипуляции с содержимым HTML и выполнении JavaScript в клиентской части с использованием библиотеки ExtJS 4.2. Уязвимости типа "Stored Code Injection" могут позволить злоумышленнику выполнять произвольный код JavaScript на стороне клиента, если данные не очищены должным образом.

Объяснение проблемы

В вашем коде, вызов window.eval(match[2]); (строка 21070) может быть опасным, так как, если содержимое match[2] неэкранировано, в него может быть вставлен вредоносный код. Аналогично, механизм обновления DOM с использованием innerHTML может привести к инъекции скриптов, если HTML вводится без предварительной проверки.

Как исправить уязвимость

  1. Избегайте использования eval и innerHTML для вставки динамического контента: Вместо этого, используйте безопасные методы, такие как textContent или подобные методы. Эти методы не выполняют HTML-содержимое как код.

  2. Очистка данных: Используйте библиотеки или утилиты, которые помогут вам очищать входные данные. Например, вы можете использовать DOMPurify для удаления потенциально вредоносного кода из HTML.

  3. Шаблонизация: Если вам нужно создать HTML из данных, используйте безопасные шаблонизаторы, которые автоматически экранируют данные.

  4. Контроль источника данных: Убедитесь, что все входные данные, которые могут повлиять на innerHTML или другие методы, проходят строгую проверку. Это может включать удаление любых разрешенных тегов или атрибутов, если они не являются необходимыми.

Пример исправленного кода

Ниже приведен пример того, как можно переписать часть кода, избегая использования eval:

update: function(html, loadScripts, callback) {
    var me = this,
        id,
        dom,
        interval;

    if (!me.dom) {
        return me;
    }
    html = html || '';
    dom = me.dom;

    if (loadScripts !== true) {
        dom.innerHTML = html; // Будьте осторожны, используйте очистку данных
        Ext.callback(callback, me);
        return me;
    }

    id  = Ext.id();
    html += '<span id="' + id + '"></span>';

    interval = setInterval(function() {
        var el;
        if (!(el = DOC.getElementById(id))) {
            return false;
        }
        clearInterval(interval);
        Ext.removeNode(el);
        hd = Ext.getHead().dom;

        // Безопасная обработка скриптов
        while ((match = scriptTagRe.exec(html))) {
            attrs = match[1];
            srcMatch = attrs ? attrs.match(srcRe) : false;
            if (srcMatch && srcMatch[2]) {
                s = DOC.createElement("script");
                s.src = srcMatch[2];
                typeMatch = attrs.match(typeRe);
                if (typeMatch && typeMatch[2]) {
                    s.type = typeMatch[2];
                }
                hd.appendChild(s);
            } else if (match[2] && match[2].length > 0) {
                // Удалите eval и вместо этого создайте функцию для безопасного выполнения
                // Имейте в виду, что выполнение скриптов может требовать другой логики
            }
        }
        Ext.callback(callback, me);
    }, 20);

    dom.innerHTML = html.replace(replaceScriptTagRe, '');
    return me;
},

Заключение

Пожалуйста, принимайте во внимание вышеуказанные рекомендации и применяйте их в вашем коде, чтобы устранить уязвимость. Обратите внимание на безопасность при обработке и отображении данных от пользователя, так как это наиболее часто встречаемый вектор атак. Если вам нужна дополнительная помощь или у вас есть другие вопросы, не стесняйтесь задавать их.

Спасибо и удачи!

Оцените материал
Добавить комментарий

Капча загружается...