Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
andaril

XSS инъекция через прикрепляемые файлы

Recommended Posts

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

 

Скачать измененный файл для версий 2.1.x: http://forums.invisionpower.com/index.php?...st&id=11582

Скачать измененный файл для версий 2.2.x: http://forums.invisionpower.com/index.php?...st&id=11583

 

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

 

Исправление 2.1.7:

Открыть файл ./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';

			$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;
	}
}

 

Исправление 2.2.2:

Открыть файл ./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;
	}
}

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...