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