Раскрытие директории в модуле сессий, часть 2

Что ж… модуль сессий в ЛС оказался слегка дырявым всего-навсего в пределах одного метода. Первая часть по раскрытию путей находится здесь, все тесты и описание будут приводится на основе исправленного модуля сессий из предыдущего топика.
В данном топике будет рассмотрено и исправлено 2 способа раскрытия путей на сайте под управлением ливстрит последней доступной версии (1.0.2).

  • Уровень опасности: средний
  • Тип: раскрытие имени пользователя (аккаунта) на сервере
  • Версии движка, которые подвержены данной опасности: все версии без исключения

Метод № 1: отключение кук в браузере


Описание

Если на сервере в php.ini опция session.use_only_cookies установлена в 0, то злоумышленник может выключить куки в браузере и тогда появляется возможность установки сессии через метод GET, а передача этого параметра как массива:

http://site.com/?PHPSESSID[]=any_value


приведет к ошибке:
Notice: Array to string conversion in /home/webmaster/www/site.com/www/engine/modules/session/Session.class.php on line 88

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/webmaster/www/site.com/www/engine/modules/session/Session.class.php:92) in /home/webmaster/www/site.com/www/engine/modules/session/Session.class.php on line 92


Решение
Для устранения данной возможности нужно после 78 строки в /engine/modules/session/Session.class.php вставить код:

if (@ini_get ('session.use_only_cookies') === "0" and getRequest (Config::Get ('sys.session.name')) and is_array (getRequest (Config::Get ('sys.session.name')))) {
  //die ('Have you done your homework?');
  session_name ($this -> GenerateId ());    // block manual session setup replacing it with new one
  $this -> Message_AddError ('Your session name is broken (set as array by request)', 'Error');
}


Метод № 2: редактирование кук в браузере


Описание

Если отредактировать имя куки с названием сессии (по-умолчанию в ЛС это обычное PHPSESSID), добавив к имени этой печеньки скобки (PHPSESSID[], можно как с указанием ключа так и без), то при конвертации такой записи php автоматически превратит ёё в массив, внутри которого — нужный айдишник сессии.

Более подробно:

В php в session.name записано имя куки, которая хранит идентификатор сессии, но php'ный массив $_COOKIE автоматически конвертирует куки с именем "some_name[some_key]" в "$_COOKIE ['some_name']['some_key']", поэтому когда обработчик сессии пытается прочитать куку чтобы извлечь айдишник сессии — он падает в обморок т.к. вместо ожидаемой строки получает массив при вызове метода:

session_start ();


и генерирует ошибку конвертации:

Notice: Array to string conversion in /home/webmaster/www/site.com/www/engine/modules/session/Session.class.php on line 99

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/webmaster/www/site.com/www/engine/modules/session/Session.class.php:99) in /home/webmaster/www/site.com/www/engine/modules/session/Session.class.php on line 99


Решение
Для устранения данной возможности нужно после 78 строки в /engine/modules/session/Session.class.php вставить код:

if (isset ($_COOKIE [Config::Get ('sys.session.name')]) and is_array ($_COOKIE [Config::Get ('sys.session.name')])) {
  //die ('Have you done your homework?');
  session_name ($this -> GenerateId ());    // block manual session setup replacing it with new one
  $this -> Message_AddError ('Your session name is broken (set as array in cookies)', 'Error');
}


Лирическое отступление:

Подобная ошибка уже была когда-то найдена для ключа авторизации пользователя (кука «key») и исправлена, но про сессию, видимо, никто не вспомнил.
Для нестандартного режима сессий я не делал исправления (по-умолчанию отключен и не рекомендован к использованию).

Резюме

Все вышеописанные исправления безопасности в файле сессий для лайвстрита 1.0.2 + правки из предыдущего топика можно скачать здесь.

Это кросспост из гида по livestreet cms. Хотите быть в курсе последних новостей о безопасности ЛС? Подписывайтесь на соответствующий блог.

P.S. Максим нещадно минусует мои топики о проблемах с безопасностью, аргументируя это тем, что вначале нужно было сообщить разработчикам и что ему не нравится что я рекламирую свой сайт. Хочу заметить, что в топике я сразу даю заплатку. Поэтому это мой последний пост о проблемах с безопасностью на данном сайте. Больше сообщать здесь о таких проблемах я не буду, если ort это не угодно. Хотите быть в курсе событий? Вы знаете где можно об этом почитать.
Если для вас актуальна тема безопасности, то рекомендуем обратить внимание на оборудование для систем безопасности. Здесь представлен довольное широкий спектр различных security систем.

17 комментариев

avatar
Спасибо, хорошая работа +
avatar
так чего не запулили на гит?
avatar
как говорил avadim :
Макс всегда делает по-своему

заплатка есть в топике.
avatar
Я не помню поставил я "-" или «0» за топик, но "+" поставить не мог, ибо согласен с ort . Об ошибках безопасности пользователи должны узнавать из change-логов свеже вышедшей версии, а не на публичных сайтах. В такой форме как это преподносит PSNet вреда больше чем пользы.
avatar
Я не помню поставил я "-" или «0» за топик,
минус, я внимательно проверил.
Об ошибках безопасности пользователи должны узнавать из change-логов свеже вышедшей версии, а не на публичных сайтах.
я не согласен: половина пользователей тогда не позакрывает баги у себя на сайтах до выхода оф. версии. Я в «публичном», как вы выразились, топике сразу даю решение, а не бросаю на произвол судьбы.

В такой форме как это преподносит PSNet вреда больше чем пользы.
Почему? О каком именно вреде идет речь?
avatar
*я не согласен: половина пользователей тогда не позакрывает баги у себя на сайтах до выхода оф. версии, а злоумышленники могут смотреть коммиты на гитхабе и до выхода оф. версии пользоваться этим. Т.е. так лучше?
avatar
Они итак не позакрывают :)
Как показывают мои наблюдения, человек всегда верит, что-бы не случилось — это случится не с ним.

Ну 10 человек закроет у себя уязвимость после публикации на оффсайте движка. Уверен, что большинство недохакеров врядли созреет мозгами пасти репозиторий на гитхабе и уж тем более анализировать его. А вот когда тебе дают эксплоит на блюдечке с голубой каемочкой, почему бы не поэксперементировать, благо список сайтов на LS тут в соседнем топике.

Так что общемировая практика по публикации сообщений об уязвимостях после выпуска корректирующего релиза не просто так возникла. Оперативность выпуска релиза и своевременного информирования пользователя об уязвимостях — это уже на совести мейнтенера.
avatar
Это не эксплоит
avatar
про недохакеров мы не говорим. им с этим делать нечего.
avatar
Я помню как это происходило с подобными фиксами перед выходом 1.0.2 я сам тогда их накатывать не стал. Поленился. С обновлением версии пришли. А я еще не самый плохой админ, честно. Подавляющее большинство и не станет. Неужели вы думаете что 4000+ установок LS версии 1.0+ тут же по этому посту фикс поставят? — дай бог чтоб 1% сделал. С моей точки зрения от такой подачи потенциальные злоумышленники выигрывают намного больше, вот и всё.
avatar
Бред, комедию разгрываете, раскрытие дирректории особо ничего не даст, ну знает он как юзера зовут, что полезет шаред хостинг ломать, шелл лить, так ведь не зальет.
А что касается обладателей своих серваков, так ведь у них вообще все по другому будет.

Тут скорее нужно чтобы совпало несколько вещей, например раскрытие дирректории и скажем неправильный .htaccess который позволял бы листать в браузере ту же uploads.

А PSNet просто акцентирует внимание, на этом недочете, чтобы его не забыли включить в следующей версии, ничего плохого тут нет.
avatar
Pull реквесты никто на гитхабе не отменял. Сомневаюсь, что ort их игнорирует.

И мы вроде не обсуждаем конкретно данную уязвимость, а говорим о подходе в принципе. Сначала фикс, потом препарация уязвимости. Иначе это выглядит как простое тщеславие.
avatar
P.S. Максим нещадно минусует мои топики о проблемах с безопасностью, аргументируя это тем, что вначале нужно было сообщить разработчикам и что ему не нравится что я рекламирую свой сайт. Хочу заметить, что в топике я сразу даю заплатку. Поэтому это мой последний пост о проблемах с безопасностью на данном сайте. Больше сообщать здесь о таких проблемах я не буду, если ort это не
угодно. Хотите быть в курсе событий? Вы знаете где можно об этом почитать.

Вот из-за таких вещей у ЛС никогда и не будет вменяемого сообщества. Что печально.
avatar
Я солидарен с Максимом
avatar
мотивируйте.
avatar
Сначало фикс, потом пост. Наоборот делают только те кто наплевательски относяться к своей работе или тому с чем имеют дело.

В этом случае не поступает фиксов в виде коммитов в саму систему, это лишь поверхностная, но показуха. Как можно заметить Максиму пришлось оформить коммит самому github.com/livestreet/livestreet/commits/master
Ни кто о безопасности как таковой не заботиться, исправил для себя, сообщил, что будет дальше пусть сами разбираются. Меня такой подход не устраивает.
avatar
Вот в таком случае вам бы стоило в первом посте уточнить — в чём именно вы солидарны с пресловутым Максимом.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.