Программа совершенствуется до тех пор, пока она не превысит возможностей программиста..

+--------------------------------------------------------------------------------------------------------------------------[release: 01.04.05]----+
|
|
|
|
|
|
|
  _|_|  _|_|_|  _|  _|    _|  _|_|_|      _|_|    _|  _|  _|   _|  _|    _|_|             _|  _|    _|_|_|
_|      _|  _|      _|_|_|_|  _|          _|  _|  _|  _|  _|_| _|      _|      m        _|_|_|_|_|  _|  _|
_|      _|_|    _|  _| _| _|  _|_|    &   _|_|    _|  _|  _| _|_|  _|  _|_|_|    e        _|  _|    _|  _|
_|      _| _|   _|  _|    _|  _|          _|      _|_|_|  _|   _|  _|      _|      n    _|_|_|_|_|  _|  _|
  _|_|  _|  _|  _|  _|    _|  _|_|_|      _|        _|_|  _|   _|  _|  _|_|  h       t    _|  _|    _|_|_|
|
|
|
|
|
|
|
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
+--------------------------------------------[0x05: PHPBB старые баги в новой упаковке]---------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

Все наверняка слышали об уязвимости в популярном форуме phpBB. Масса серверов была взломана через дыру в этом скрипте версии <=2.0.10. Суть уязвимости заключалась в том, что после фильтрации кавычек значение переменной highlight прогонялось через функцию urldecode и передавалось для вставки в интересную конструкцию:
$message = str_replace('\"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se',
 "preg_replace('#\b(" . $highlight_match . ")\b#i',
 '<span style=\"color:#" . $theme['fontcolor3'] . "\"><b>\\\\1</b></span>', '\\0')",
 . $message . 1, -1));
Вот тут и появлялась проблема: кавычку можно было передать в двойном урл кодировании – проверка при фильтрации проходит нормально, а потом перекодировка и вставка позволяют выполнить произвольный PHP код на уязвимой системе. Если кто не понял, поясняю:
зачем нужна кавычка? - Закрыть условие проверки preg_replace;
дальше делаем .пхпкод. и получаем его вывод непосредственно;
второй кавычкой открываем для нового условия.

Это известно многим. Но не все знают как этот баг “залатали” авторы phpBB :)
Они просто убрали функцию urldecode, думая, что нет двойного декодирования – нет и проблемы.

Экранирование кавычки производится для всех элементов глобальных массивов в common.php:
if( !get_magic_quotes_gpc() )
{
        if( is_array($HTTP_GET_VARS) )
        {
                while( list($k, $v) = each($HTTP_GET_VARS) )
                {
                        if( is_array($HTTP_GET_VARS[$k]) )
Но есть одно но: помещаясь в базу SQL, экранированные кавычки становятся неэкранированными! Т.о., если мы сделаем пост на форуме с темой приблизительного следующего содержания:
'.passthru($cmd).'

то именно в таком виде это все и сохранится в таблице HYPERLINK "http://localhost:80/Tools/phpMyAdmin/tbl_properties_structure.php?lang=ru-win1251& server=1&collation_connection=cp1251_general_ci&db=phpbb&table=phpbb_posts_text"
phpbb_posts_text
в поле post_subject c post_id соответствующим номеру нашего.
Что нам это дает? Пока ничего %) но не спешите, у нас все впереди.

В скором времени, обнаружили, что сам код с preg_replace() еще бажен тем, что можно вызвать раскрытие пути, что пофиксили в 13-й версии пхпББ:
Find:
Code:
$message = str_replace('\"', substr(preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se',
 "preg_replace('#\b(" . $highlight_match . ")\b#i',
 '<span style=\"color:#" . $theme['fontcolor3'] . "\"><b>\\\\1</b></span>', '\\0')",
 . $message . 1, -1));
Replace with:
Code:
$message = str_replace('\"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se',
 "@preg_replace('#\b(" . $highlight_match . ")\b#i',
 '<span style=\"color:#" . $theme['fontcolor3'] . "\"><b>\\\\1</b></span>',
 '\\0')", . $message . 1, -1)); 
Это не очень, но важно. Почему – увидим позже.

Рассмотрим пока еще одну интересную часть кода:
$tracking_topics = ( isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . ) 
? unserialize($HTTP_COOKIE_VARS[$board_config['cookie_name'] . : array();
Предварительно зашифрованная функцией serialize наша куки „рассериализируется” – т.е. дешифруется. При этом, естественно, ничего не фильтруется, несмотря на «прогонку» массива COOKIE через функцию addslashes, т.к. она делается до «рассериализации».

Все это вместе дает нам возможность проэксплоитить наш пхпББ:
регистрируемся и создаем тему на форуме с нужным контекстом – php кодом, запоминаем номер темы;
узнаем полный путь к форуму от корня, через баг раскрытия пути в коде с preg_replace();
делаем стандартную инъекцию через куки.

На сем прощаюсь, оставляя для пытливых скрипткидди возможность поэксперементировать с sql инъекцией в куки. Нужно ведь и что-то самому попытаться сделать, а не пользоваться готовыми эксплоитами.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+-----[content]-----------------------------------------------------------------------------------------------------------------------[mail us]-----+