Уязвимость kl_album плагина EmLOG

2019-2-14 11:26

    Мой сайт работает на движке EmLOG (китайской разработки), в котором для реализации хранения и интеграции в статьи фотографий используется плагин KL_Album (так же сделан в Китае). И пару дней назад я обнаружил статью об описании уязвимостей в движке плагина. Безопасность ресурса для меня играет не последнюю роль, поэтому я благодарствую Китайцам - сами сломали, сами и починили . Одним словом Молодцы!.

    Ссылка на статью с описанием проблем (их там несколько):

https://www.leavesongs.com/PENETRATION/emlog-important-plugin-getshell.html

    Я сохранил на память перевод статьи:

kl_album sql injection.docx

    Старая версия плагина 3.0.1 с уязвимостями (для ознакомления):

kl_album_3.0.1.zip

    Актуальную версию плагина можно скачать с оф.сайта:

http://www.emlog.net/plugin/6

    Я адаптировал плагин под Русский язык и добавил несколько исправлений...

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

kl_album_3.2.3_vfiuchcikicshuusrch.ddns.net.rar

Внимание! Копирование, в том числе частичное, запрещено!

Теги: Emlog FIX Modification kl_album уязвимость дыра безопасность доработки фикс инъекции SQL injection vulnerability

vfiuchcikicshuusrch.ddns.net
Карта Сайта