[26-04-2007] XSS инъекция через прикрепляемые файлы

Уязвимость возникает из-за того что Invision Power Board позволяет пользователю загрузить изображение или PDF файл, содержащий JavaScript. Данный скрипт срабатывает при открытии прикрепления пользователем, так как это происходит в контексте браузерной сессии это позволяет злоумышленнику получить всю информацию о данной сессии.

Пример/Эксплоит: Нет

Исправление:
Открыть файл ./ips_kernel/class_upload.php, найти:

		if ( $this->make_script_safe )
		{
			if ( preg_match( "/\.(cgi|pl|js|asp|php|html|htm|jsp|jar)$/i", $FILE_NAME ) )
			{
				$FILE_TYPE				 = 'text/plain';
				$this->file_extension	  = 'txt';
			}
		}

Заменить на:

		$renamed = 0;
		
 		if ( $this->make_script_safe )
 		{
 			if ( preg_match( "/\.(cgi|pl|js|asp|php|html|htm|jsp|jar)/", $FILE_NAME ) )
 			{
 				$FILE_TYPE				 = 'text/plain';
 				$this->file_extension	  = 'txt';
				$this->parsed_file_name	   = preg_replace( "/\.(cgi|pl|js|asp|php|html|htm|jsp|jar)(\.|$)/i", "$2", $this->parsed_file_name );
				
				$renamed = 1;
 			}
 		}

Найти:

 	if ( ! @move_uploaded_file( $_FILES[ $this->upload_form_field ]['tmp_name'], $this->saved_upload_name) )
		{
			$this->error_no = 4;
			return;
		}
		else
		{
			@chmod( $this->saved_upload_name, 0777 );
		}

Добавить после:

		if( !$renamed )
		{
			$this->check_xss_infile();
			
			if( $this->error_no )
			{
				return;
			}
		}

Найти:

	/*-------------------------------------------------------------------------*/
	// INTERNAL: Get file extension
	/*-------------------------------------------------------------------------*/
	
	/**
	* Returns the file extension of the current filename
	*
	* @param string Filename
	*/
	
	function _get_file_extension($file)
	{
		return strtolower( str_replace( ".", "", substr( $file, strrpos( $file, '.' ) ) ) );
	}

Добавить перед:

	/*-------------------------------------------------------------------------*/
	// INTERNAL: Check for XSS inside file
	/*-------------------------------------------------------------------------*/
	
	/**
	* Checks for XSS inside file.  If found, sets error_no to 5 and returns
	*
	* @param void
	*/
	
	function check_xss_infile()
	{
		// HTML added inside an inline file is not good in IE...
		
		$fh = fopen( $this->saved_upload_name, 'rb' );
		
		$file_check = fread( $fh, 512 );
		
		fclose( $fh );
		
		if( !$file_check )
		{
			@unlink( $this->saved_upload_name );
			$this->error_no = 5;
			return;
		}
		
		# Thanks to Nicolas Grekas from comments at www.splitbrain.org for helping to identify all vulnerable HTML tags
		
		else if( preg_match( "#<script|<html|<head|<title|<body|<pre|<table|<a\s+href|<img|<plaintext#si", $file_check ) )
		{
			@unlink( $this->saved_upload_name );
			$this->error_no = 5;
			return;
		}
	}


Так же можно воспользоваться готовыми файлами. В архиве сохранена структура файлов для простоты использования. Делать это стоит только в том случае, если не было произведено никаких изменений в этих файлах.

 

security/2.2.x/lesscritical/26.04.2007.txt · Последние изменения: 2007/08/14 12:01 (внешнее изменение)

Работает на DokuWiki
© 2002—2006 ibresource
e-mail: wikiteam@iblink.ru