Уязвимость kl_album плагина EmLOG
2019-2-14 11:26
Мой сайт работает на движке EmLOG (китайской разработки), в котором для реализации хранения и интеграции в статьи фотографий используется плагин KL_Album (так же сделан в Китае). И пару дней назад я обнаружил статью об описании уязвимостей в движке плагина. Безопасность ресурса для меня играет не последнюю роль, поэтому я благодарствую Китайцам - сами сломали, сами и починили . Одним словом Молодцы!.
Ссылка на статью с описанием проблем (их там несколько):
https://www.leavesongs.com/PENETRATION/emlog-important-plugin-getshell.html
Я сохранил на память перевод статьи:
Старая версия плагина 3.0.1 с уязвимостями (для ознакомления):
Актуальную версию плагина можно скачать с оф.сайта:
Я адаптировал плагин под Русский язык и добавил несколько исправлений...
Первое исправление касается поддержки PHP 7.2+, в котором нет команды mysql_escape_string. Все эти команды нужно заменить на $DB->escape_string. Сам движок я уже переписал для поддержки PHP 7.2+, поэтому вызов функции escape_string не выдаст ошибок. Адаптация движка EmLOG сводится к замене вызовов функций mysql_*** на вызов функций myslqi_*** всё просто и понятно, да ещё и делается это в одном файле, где описаны функции для работы с mysql.
Второе исправление касается доработки ссылки на скачивание изображения из окна просмотра на странице Альбома. В оригинале при скачивании изображения, имя файла было таким, каким оно сохранилось на сервере, а на сервере оно сохранялось в нечеловеческом виде. Меня это сильно раздражало! ... думаю, не одного меня.
В файле kl_album/js/jquery.lightbox-0.5.js следующую функцию:
/** * Show the image information * */ function _show_image_data() { $('#lightbox-container-image-data-box').slideDown('fast'); $('#lightbox-image-details-caption').hide(); if ( settings.imageArray[settings.activeImage][1] ) { $('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show(); } // If we have a image set, display 'Image X of X' if ( settings.imageArray.length > 1 ) { $('#lightbox-image-details-currentNumber').html(settings.txtImage + ' ' + ( settings.activeImage + 1 ) + ' ' + settings.txtOf + ' ' + settings.imageArray.length + ' <a href="'+ settings.imageArray[settings.activeImage][0] +'" target="_blank">Скачать</a>').show(); } }
нужно немного доработать:
/** * Show the image information * */ function _show_image_data() { $('#lightbox-container-image-data-box').slideDown('fast'); $('#lightbox-image-details-caption').hide(); if ( settings.imageArray[settings.activeImage][1] ) { var photo_filename = settings.imageArray[settings.activeImage][1].replace("Фото: ", ""); photo_filename = photo_filename.substr(0, photo_filename.indexOf("|") - 1); $('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show(); } // If we have a image set, display 'Image X of X' if ( settings.imageArray.length > 1 ) { $('#lightbox-image-details-currentNumber').html(settings.txtImage + ' ' + ( settings.activeImage + 1 ) + ' ' + settings.txtOf + ' ' + settings.imageArray.length + ' <a href="'+ settings.imageArray[settings.activeImage][0] +'" target="_blank" download="' + photo_filename + '">Скачать</a>').show(); } }
После этого, файл изображения будет скачиваться с именем файла которое было при загрузке, а не открываться в новом окне, по прямой ссылке с сайта.
Третье - это открытие изображения, размеры которого больше чем окно браузера. В оригинале изображение открывалось в формате 1 к 1 и большие картинки смотреть было не реально. Это исправляется заменой функции:
function _set_image_to_view() { // show the loading // Show the loading $('#lightbox-loading').show(); if ( settings.fixedNavigation ) { $('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide(); } else { // Hide some elements $('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide(); } // Image preload process var objImagePreloader = new Image(); objImagePreloader.onload = function() { $('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]); // Perfomance an effect in the image container resizing it _resize_container_image_box(objImagePreloader.width,objImagePreloader.height); // clear onLoad, IE behaves irratically with animated gifs otherwise objImagePreloader.onload=function(){}; }; objImagePreloader.src = settings.imageArray[settings.activeImage][0]; };
На следующую:
function _set_image_to_view() { // show the loading // Show the loading $('#lightbox-loading').show(); if ( settings.fixedNavigation ) { $('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide(); } else { // Hide some elements $('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide(); } // Image preload process var objImagePreloader = new Image(); objImagePreloader.onload = function() { $('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]); // Perfomance an effect in the image container resizing it // задается размер рабочей области окна браузера windowWidth = $(window).width(); windowHeight = $(window).height(); // вычисление минимального размера изображения по ширине и высоте maxImageWidth = windowWidth - (settings.containerBorderSize * 2) - 20; maxImageHeight = windowHeight - (settings.containerBorderSize * 2) - 100; imageWidth = objImagePreloader.width; imageHeight = objImagePreloader.height; // вычисление больше ли картинка допустимого размера и нужно ли править ее размер if ((objImagePreloader.width > maxImageWidth) || (objImagePreloader.height > maxImageHeight)) { // определение подгонять под ширину или под высоту окна браузера if ((objImagePreloader.width / maxImageWidth) > (objImagePreloader.height / maxImageHeight)) { imageWidth = maxImageWidth; imageHeight = parseInt(objImagePreloader.height / (objImagePreloader.width / imageWidth), 10); } else { imageHeight = maxImageHeight; imageWidth = parseInt(objImagePreloader.width / (objImagePreloader.height / imageHeight), 10); } } var arrPageScroll = ___getPageScroll(); $('#jquery-lightbox').css({ top: arrPageScroll[1] + (windowHeight - imageHeight - 50) / 2, left: arrPageScroll[0] }); _resize_container_image_box(imageWidth,imageHeight); // clear onLoad, IE behaves irratically with animated gifs otherwise objImagePreloader.onload=function(){}; }; objImagePreloader.src = settings.imageArray[settings.activeImage][0]; };
Модифицированный и руссифицированный плагин версии 3.2.2 можно скачать ниже:
Теги: Emlog FIX Modification kl_album уязвимость дыра безопасность доработки фикс инъекции SQL injection vulnerability