Исправление для IPB 2.1.x

Discussion in 'Песочница' started by _GaLs_, 11 Jun 2007.

  1. _GaLs_

    _GaLs_ Elder - Старейшина

    Joined:
    21 Apr 2006
    Messages:
    431
    Likes Received:
    252
    Reputations:
    48
    2 сентября 2005 - уязвимы версии 2.1.0 и ниже
    Открыть файл ./sources/lib/post_parser.php
    найти: (строчка 520)
    Code:
     if ( is_array( $ibforums->cache['bbcode'] ) and count( $ibforums->cache['bbcode'] ) )
      {
    Добавить после:
    Code:
        # XSS Clean
          $t = preg_replace( "#javascript\:#is", "java script:", $t );
          $t = str_replace(  "`"               , "& #96;"       , $t );
    Убрать пробел между & и # !

    Скачать файл и загрузить его на сервер. Файл

    Изменение MIME-типов:
    Так же изменить MIME-типы некоторых опасных файлов, которые разрешены на форуме для прикрепления.
    Сделать следующее:

    1)Войти в Админцентр
    2)Воспользоваться группой настроек Прикрепляемые файлы -> Типы прикрепляемых файлов
    3)Отредактировать опции для файлов ".htm", ".html", ".txt", ".rtf", выставив в поле "MIME-тип файла" значение "unknown/unknown" (без ковычек)

    5 января 2006 - уязвимы версии 2.1.4 и ниже
    Открыть файл ./sources/ipsclass.php
    найти:
    Code:
    $this->forum_read[$id] = $stamp;
    заменить на:
    Code:
    $this->forum_read[ intval($id) ] = intval($stamp);
    найти код:
    Code:
    /*-------------------------------------------------------------------------*/
        // Makes incoming info "safe"              
        /*-------------------------------------------------------------------------*/
    заменить на:
    Code:
    /*-------------------------------------------------------------------------*/
        // Makes topics read or forum read cookie safe         
        /*-------------------------------------------------------------------------*/
        /**
        * Makes int based arrays safe
        * XSS Fix: Ticket: 243603
        * Problem with cookies allowing SQL code in keys
        *
        * @param    array    Array
        * @return    array    Array (Cleaned)
        * @since    2.1.4(A)
        */
        function clean_int_array( $array=array() )
        {
            $return = array();
            
            if ( is_array( $array ) and count( $array ) )
            {
                foreach( $array as $k => $v )
                {
                    $return[ intval($k) ] = intval($v);
                }
            }
            
            return $return;
        }
            
        /*-------------------------------------------------------------------------*/
        // Makes incoming info "safe"              
        /*-------------------------------------------------------------------------*/
       
    Открыть файл ./sources/action_public/forums.php
    найти код:
    Code:
    $this->read_array = unserialize(stripslashes($read));
    заменить на:
    Code:
    $this->read_array = $this->ipsclass->clean_int_array( unserialize(stripslashes($read)) );
    Открыть файл ./sources/action_public/search.php
    найти код:
    Code:
    $this->read_array = unserialize(stripslashes($read));
    заменить на:
    Code:
    $this->read_array = $this->ipsclass->clean_int_array( unserialize(stripslashes($read)) );
    Открыть файл ./sources/action_public/topics.php
    найти код:
    Code:
    $this->read_array = unserialize(stripslashes($read));
    заменить на:
    Code:
    $this->read_array = $this->ipsclass->clean_int_array( unserialize(stripslashes($read)) );
    31 Января 2006 - Уязвимы версии 2.1.4 и ниже
    Открыть файл ./sources/action_public/usercp.php
    найти код:
    Code:
    $topic_array = array_slice( array_keys( $topics ), 0, 5 );
    добавить после:
    Code:
    $topic_array = $this->ipsclass->clean_int_array( $topic_array );

    Файл /sources/classes/bbcode/class_bbcode.php
    найти код:
    Code:
    $txt = preg_replace( "#javascript\:#is", "java script:", $txt );
            $txt = str_replace(  "`"               , "`"       , $txt );
    заменить на:
    Code:
    $txt = preg_replace( "#javascript\:#is", "java script:", $txt );
    $txt = preg_replace( "#vb script:", $txt );
    $txt = str_replace(  "`"               , "`"       , $txt );
    $txt = preg_replace( "#moz\-binding:#is", "moz binding:", $txt );
    25 апреля 2006 - Уязвимы версии 2.1.5 и ниже
    Открыть файл ./ips_kernel/class_upload.php
    найти код:
    Code:
      else if ( ! $img_attributes[2] )
                    {
                        // Unlink the file first
                        @unlink( $this->saved_upload_name );
                        $this->error_no = 5;
                        return;
                    }
    заменить на:
    Code:
    else if ( ! $img_attributes[2] )
                          {
                        // Unlink the file first
                        @unlink( $this->saved_upload_name );
                        $this->error_no = 5;
                        return;
                    }
                    else if ( $img_attributes[2] == 1 AND ( $this->file_extension == 'jpg' OR $this->file_extension == 'jpeg' ) )
                    {
                        // Potential XSS attack with a fake GIF header in a JPEG
                        @unlink( $this->saved_upload_name );
                        $this->error_no = 5;
                        return;
                    }
    
    Открыть файл ./sources/action_public/search.php

    найти код:
    Code:
       $this->output = preg_replace( "#(value=[\"']{$this->ipsclass->input['lastdate']}[\"'])#i", "\\1 selected='selected'", $this->output );
    заменить на:
    Code:
    $this->output = preg_replace( "#(value=[\"']".intval($this->ipsclass->input['lastdate'])."[\"'])#i", "\\1 selected='selected'", $this->output );
    
    Открыть файл ./sources/action_public/messenger.php
    найти код:
    Code:
    $this->msglib->to_by_id = $this->ipsclass->input['from_contact'];
    заменить на:
    Code:
    $this->msglib->to_by_id = intval( $this->ipsclass->input['from_contact'] );

    Открыть файл ./sources/lib/func_taskmanager.php

    найти код:
    Code:
       $this->cron_key = substr( trim(stripslashes($_REQUEST['ck'])), 0, 32 );
    заменить на:
    Code:
      $this->cron_key = addslashes( substr( trim(stripslashes($this->ipsclass->txt_alphanumerical_clean($_REQUEST['ck']))), 0, 32 ) );
    16 мая 2006 - Уязвимы версии 2.1.6 и ниже
    Открыть файл ./sources/ipsclass.php

    найти код
    Code:
     var $acpversion   = '21012.60504.u';
    заменить на:
    Code:
    var $acpversion   = '21012.060516.s';
    Открыть файл ./sources/classes/post/class_post.php
    найти код:
    Code:
    $html = preg_replace( "/name=[\"']iconid[\"']\s*value=[\"']$post_icon\s?[\"']/", "name='iconid' value='$post_icon' checked", $html );
    заменить на:
    Code:
    $html = preg_replace( "/name=[\"']iconid[\"']\s*value=[\"']".intval($post_icon)."\s?[\"']/", "name='iconid' value='$post_icon' checked", $html );
    
    Открыть файл ./sources/action_public/moderate.php
    найти код:
    Code:
    $html_forums = preg_replace( "/<option value=\"".$this->ipsclass->input['df']."\"/", "<option value=\"".$this->ipsclass->input['df']."\" selected", $html_forums );
    
    заменить на:
    Code:
    $html_forums = preg_replace( "/<option value=\"".intval($this->ipsclass->input['df'])."\"/", "<option value=\"".$this->ipsclass->input['df']."\" selected", $html_forums );
    
    Открыть файл ./sources/classes/post/class_post_edit.php
    найти в нем код:
    Code:
      $this->orig_post = $this->ipsclass->DB->fetch_row();
            
            if (! $this->orig_post['pid'])
            {
                $this->ipsclass->Error( array( LEVEL => 1, MSG => 'missing_files') );
            }
    
    заменить на:
    Code:
    $this->orig_post = $this->ipsclass->DB->fetch_row();
            
            if (! $this->orig_post['pid'])
            {
                $this->ipsclass->Error( array( LEVEL => 1, MSG => 'missing_files') );
            }
            
            //-----------------------------------------
            // Same topic?
            //-----------------------------------------
            
            if ( $this->orig_post['topic_id'] != $this->topic['tid'] )
            {
                $this->ipsclass->Error( array( LEVEL => 1, MSG => 'missing_files') );
    19 июня 2006 - Уязвимы версии 2.1.6 и ниже
    Открыть файл ./sources/classes/bbcode/class_bbcode.php

    найти код:
    Code:
    # XSS Clean
                if( $this->strip_hex_entity )
                {
                            while( preg_match( "/[&|&amp\;]#x(\w+?);/i", $txt ) )
                            {
                                        $txt = preg_replace( "/[&|&amp\;]#x(\w+?);/ies" , "\$this->regex_bash_hex( '\\1' )" , $txt );
                            }
                            $txt = preg_replace( "#&amp(?!\;)#", "", $txt );
                }
    заменить на:
    Code:
    # XSS Clean
                /*if( $this->strip_hex_entity )
                {
                            while( preg_match( "/[&|&amp\;]#x(\w+?);/i", $txt ) )
                            {
                                        $txt = preg_replace( "/[&|&amp\;]#x(\w+?);/ies" , "\$this->regex_bash_hex( '\\1' )" , $txt );
                            }
                            $txt = preg_replace( "#&amp(?!\;)#", "", $txt );
                }*/
    Открыть файл ./sources/classes/bbcode/class_bbcode_core.php
    найти код:
    Code:
    for ($i=0; $i < count($match[0]); $i++)
                {
                            $tmp = $row['bbcode_replace'];
                            $tmp = str_replace( '{content}', $match[2][$i], $tmp );
                            $t = str_replace( $match[0][$i], $tmp, $t );
                }
    заменить на:
    Code:
     for ($i=0; $i < count($match[0]); $i++)
                {
                            # XSS Check: Bug ID: 980
                            if ( $row['bbcode_tag'] == 'post' OR $row['bbcode_tag'] == 'topic' )
                            {
                                        $match[2][$i] = intval( $match[2][$i] );
                            }
    
                            $tmp = $row['bbcode_replace'];
                            $tmp = str_replace( '{content}', $match[2][$i], $tmp );
                            $t = str_replace( $match[0][$i], $tmp, $t );
    
                }
    Открыть файл ./sources/classes/bbcode/class_bbcode_core.php
    найти код:
    Code:
     $url['html'] = str_replace( "&" , "&" , $url['html'] );
    заменить на:
    Code:
      $url['html'] = str_replace( "&amp;" , "&" , $url['html'] );

    Открыть файл ./sources/classes/bbcode/class_bbcode_core.php
    найти код:
    Code:
    $url['show'] = preg_replace( "/&/" , "&" , $url['show'] );
    заменить на:
    Code:
    $url['show'] = str_replace( "&amp;" , "&" , $url['show'] );
    29 июня 2006 - Уязвимы версии 2.1.6 и ниже

    Открыть файл ./sources/ipsclass.php
    найти код:
    Code:
     /*-------------------------------------------------------------------------*/
                // Convert string between char-sets
                /*-------------------------------------------------------------------------*/
    Добавить перед:
    Code:
    /*-------------------------------------------------------------------------*/
                // XSS Clean: URLs
                /*-------------------------------------------------------------------------*/
    
                /**
                * Check URL validity
                *
                * @param string Input String
                * @return boolean
                * @since 2.1.0
                */
    
                function xss_check_url( $url )
                {
                            $url = trim( urldecode( $url ) );
    
                            if ( ! preg_match( "#^https?://(?:[^<>*\"]+|[a-z0-9/\._\- !]+)$#iU", $url ) )
                            {
                                        return FALSE;
                            }
    
                            return TRUE;
                 }
    Открыть файл ./sources/lib/func_usercp.php
    найти код:
    Code:
     if ( preg_match( "/^http:\/\/$/i", $this->ipsclass->input['url_photo'] ) )
                {
                            $this->ipsclass->input['url_photo'] = "";
                }
    
    Добавить после:
    Code:
    if ( $this->ipsclass->xss_check_url( $this->ipsclass->input['url_photo'] ) !== TRUE )
                {
                            $this->ipsclass->input['url_photo'] = '';
                }
    Открыть файл ./sources/lib/func_usercp.php
    найти код:
    Code:
    if ( preg_match( "/^http:\/\/$/i", $this->ipsclass->input['url_avatar'] ) )
                {
                            $this->ipsclass->input['url_avatar'] = "";
                }

    Добавить после :
    Code:
     if ( $this->ipsclass->xss_check_url( $this->ipsclass->input['url_avatar'] ) !== TRUE )
                {
                            $this->ipsclass->input['url_avatar'] = '';
                }

    Открыть файл ./sources/classes/bbcode/class_bbcode_core.php
    найти код:
    Code:
     if ( preg_match( "/java(\s+?)?script(\:|\s)/is", $url ) )
    Заменить на:
    Code:
     if ( preg_match( "/javascript\:/is", preg_replace( "#/\s{1,}#s", "", $url ) ) )

    Открыть файл ./sources/classes/bbcode/class_bbcode_core.php
    найти код:
    Code:
    //-----------------------------------------
                // Is the img extension allowed to be posted?
                //-----------------------------------------
    
                if ( $this->ipsclass->vars['img_ext'] )
                {
    Добавить перед :
    Code:
    //-----------------------------------------
                // Check...
                //-----------------------------------------
    
                if ( $this->ipsclass->xss_check_url( $url ) !== TRUE )
                {
                            return '';
                }

    Открыть файл ./sources/action_public/moderate.php
    найти код:
    Code:
     $this->topic = $this->ipsclass->DB->fetch_row();
    
                if (empty($this->topic['tid']))
                {
                            $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'missing_files') );
                }
    Добавить после :
    Code:
     if ( $this->ipsclass->input['f'] AND ( $this->topic['forum_id'] != $this->ipsclass->input['f'] ) )
                {
                            $this->ipsclass->Error( array( 'LEVEL' => 1, 'MSG' => 'missing_files') );
                }
    10 августа 2006 - Уязвимы версии 2.1.7 и ниже
    Открыть файл ./sources/lib/func_topic_threaded.php
    найти:
    Code:
    //-----------------------------------------
            // Are we viewing Posts?
            //-----------------------------------------
            
            $post_id = intval($this->ipsclass->input['pid']);
    заменить на:
    Code:
    //-----------------------------------------
            // Are we viewing Posts?
            //-----------------------------------------
            
            $post_id = intval($this->ipsclass->input['pid']);
            
            if($post_id && !in_array($post_id, $this->pids))
            {
                $this->ipsclass->Error( array( LEVEL => 1, MSG => 'missing_files') );
            }
    

    5 октября 2006 - Уязвимы версии 2.1.7 и ниже
    Открыть файл ./sources/action_admin/member.php
    найти:
    Code:
    //-----------------------------------------
                // Avatar?
                //-----------------------------------------
    
                if ( $r['avatar_location'] and $r['avatar_type'] )
                {
                    $avatar = $this->ipsclass->get_avatar( $r['avatar_location'], 1, '25x25', $r['avatar_type'] );
    
                    if ( ! strstr( $avatar, 'width=' ) )
                    {
                        $avatar = str_replace( '<img', "<img width='25' height='25'", $avatar );
                    }
                }
                else
                {
                    $avatar = "<img src='{$this->ipsclass->skin_url}/images/memsearch_head.gif' border='0' />";
                }
    заменить на:
    Code:
    //-----------------------------------------
                // Avatar?
                //-----------------------------------------
    
                //-----------------------------------------
                // SECURITY UPDATE: Removing  user avatar
                //-----------------------------------------
    
                $avatar = "<img src='{$this->ipsclass->skin_url}/images/memsearch_head.gif' border='0' />";

    17 октября 2006 - Уязвимы версии 2.1.7 и ниже
    Открыть файл ./sources/classes/bbcode/class_bbcode_core.php
    найти: (строка ~ 924)
    Code:
    $default = "[img]".$url."[/img]";
    
    Заменить на:

    Code:
    $default = "[img]".str_replace( '[', '&# 091;', $url )."[/img]";

    Найти:
    Code:
    if ( preg_match( "/[?&;]/", $url) )
    Заменить на:
    Code:
    if ( preg_match( "/[?&;\<\[]/", $url) )
    найти (строка ~ 486)
    Code:
    preg_match_all( "#(\[$preg_tag\])((?!\[/$preg_tag\]).+?)?(\[/$preg_tag\])#si", $t, $match );
    Заменить на:
    Code:
    preg_match_all( "#(\[$preg_tag\])((?!\[/$preg_tag\]).+?)?(\[/$preg_tag\])#si", $t, $match );
    
    if ( $row['bbcode_tag'] == 'snapback' )
    {
        $match[2][$i] = intval( $match[2][$i] );
    }
    P.S В принципи можно было прикрипить эту тему.
     
    #1 _GaLs_, 11 Jun 2007
    Last edited: 12 Jun 2007
    6 people like this.
  2. REDsaratov

    REDsaratov Elder - Старейшина

    Joined:
    17 Dec 2006
    Messages:
    123
    Likes Received:
    41
    Reputations:
    -8
    жаль что не написано от какой баги заплатки
     
  3. _GaLs_

    _GaLs_ Elder - Старейшина

    Joined:
    21 Apr 2006
    Messages:
    431
    Likes Received:
    252
    Reputations:
    48
    Ну в большинстве случаях разрабодчики не пишут от чего эти исправление. Но знаю точьно что первая заплатка от XSS, а так встречаются и от SQL инъекций.
     
  4. nec

    nec Elder - Старейшина

    Joined:
    6 Jul 2005
    Messages:
    98
    Likes Received:
    20
    Reputations:
    1
    да и по коду можно догадаться что за уязвимость.
     
  5. Solide Snake

    Solide Snake Banned

    Joined:
    28 Apr 2007
    Messages:
    382
    Likes Received:
    820
    Reputations:
    69
    _GaLs_
    Пасиб:)Свой 2.1.7 зашытил:) Кстати темку реально можно было бы поднять. Только переименовать в Исправления для IPB, и будет гуд:)
     
    #5 Solide Snake, 13 Jun 2007
    Last edited: 13 Jun 2007
  6. _GaLs_

    _GaLs_ Elder - Старейшина

    Joined:
    21 Apr 2006
    Messages:
    431
    Likes Received:
    252
    Reputations:
    48
    XSS уязвимость IP.Board

    Обращено внимание на уязвимость через браузер Internet Explorer 6 и 7 версии XSS (межсайтовое выполнение сценариев). Атака может осуществляться через загруженные изображения и PDF файлы после запуска как HTML браузером конечного пользователя. Следует отметить, что XSS опасность не действует при включенных «HttpOnly(безопасных) cookies», которые были введены в IP.Board 2.2.0. Это означает, что такие cookies будет невозможно будет получить в IP.Board 2.2.0 и последующих версиях, используя этот баг.

    Хотя это является существенным недостатком Internet Explorer, была сделана небольшая работы, чтобы устранить баг при просмотре файлов с вредоносным кодом для конечного пользователя. Если файл будет содержать вредоносный код, то в загрузке файла будет отказано.

    Для устранения бага в IP.Board скачайте файл ниже, для нужной версии:

    Версия 2.1.x: class_upload.php

    Версия 2.2.x: class_upload.php

    Загрузите файл class_upload.php в папку форума ips_kernel заменяя существующий файл.
     
  7. _GaLs_

    _GaLs_ Elder - Старейшина

    Joined:
    21 Apr 2006
    Messages:
    431
    Likes Received:
    252
    Reputations:
    48
    Обновление безопасности в Ipb 2.2.х (30.05.2007)

    Обновление безопасности в IPB 2.2.х (30.05.2007)

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


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

    Исправление:
    Открыть файл ./jscripts/folder_rte_files/module_bbcodeloader.php
    найти:
    Code:
    var editor_id         = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
    	var bbcode_id         = <?php print '"'.trim($_REQUEST['id']).'";'; ?>
    
    Заменить на:
    Code:
    var editor_id         = <?php print '"'.trim( htmlspecialchars( substr( $_REQUEST['editorid'], 0, 30 ) ) ).'";'; ?>
    	var bbcode_id         = <?php print '"'.trim( htmlspecialchars( substr( $_REQUEST['id'], 0, 30 ) ) ).'";'; ?>
    Открыть файл ./jscripts/folder_rte_files/module_div.php
    найти:
    Code:
    var editor_id         = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
    
    Заменить на:
    Code:
    var editor_id         = <?php print '"'.trim( htmlspecialchars( substr( $_REQUEST['editorid'], 0, 30 ) ) ).'";'; ?>
    
    Открыть файл ./jscripts/folder_rte_files/module_email.php
    найти:
    Code:
    var editor_id         = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
    Заменить на:
    Code:
    var editor_id         = <?php print '"'.trim( htmlspecialchars( substr( $_REQUEST['editorid'], 0, 30 ) ) ).'";'; ?>
    Открыть файл ./jscripts/folder_rte_files/module_image.php
    найти:
    Code:
    var editor_id         = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
    Заменить на:
    Code:
    var editor_id         = <?php print '"'.trim( htmlspecialchars( substr( $_REQUEST['editorid'], 0, 30 ) ) ).'";'; ?>
    Открыть файл ./jscripts/folder_rte_files/module_link.php
    найти:
    Code:
    var editor_id         = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
    Заменить на:
    Code:
    var editor_id         = <?php print '"'.trim( htmlspecialchars( substr( $_REQUEST['editorid'], 0, 30 ) ) ).'";'; ?>
    
    Открыть файл ./jscripts/folder_rte_files/module_table.php
    найти:
    Code:
    var editor_id         = <?php print '"'.trim($_REQUEST['editorid']).'";'; ?>
    
    Заменить на:
    Code:
    var editor_id         = <?php print '"'.trim( htmlspecialchars( substr( $_REQUEST['editorid'], 0, 30 ) ) ).'"