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