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

Безопасность LiveStreet CMS
Что ж… модуль сессий в ЛС оказался слегка дырявым всего-навсего в пределах одного метода. Первая часть по раскрытию путей находится здесь, все тесты и описание будут приводится на основе исправленного модуля сессий из предыдущего топика.
В данном топике будет рассмотрено и исправлено 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 + правки из предыдущего топика можно скачать здесь.
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.