Для начала я сразу же помянул "плохим" словом разработчиков phpBB,это прибавило боегого духа так сказать =)
Первое что надо сделать,из активных телодвижений это просмотреть исходник.Так как раньше я не имел дела с phpBB,структура форума мне не была знакома(что куда обращается и прочее)
Определимся с названиями файлов,так ключевые слова будут "шифрование","сессия(session)","cookie","serialize","unserialize".Многие наверняка зададут вопрос "Откуда взялись последнии ключевые слова?!?" Ответ: да оттуда =)
Если вы знакомы с веб програмиированием хотябы отдаленно,то наверняка должны знать,что в куках нельзя хранить объекты,массивы и тп.Поэтому разработчики пхп придумали эти две функции,преобразующие
объект(а в данном случае это будет массив) в строку,определенного формата,вторая функция осуществляет обратные преобразования.Ну вопщем тут все понятно.Что бы не использовать поиск по файлам в любимом PSPad'e (txt редактор,имеющий широкие возможности,написан на Delphi)
Я решил презадуматься,развить мышление так сказать.
Наш алгоритм действий будет такой:
1)Пройдемся по файлам лежащим в папке,но не по всем а только по тем,которые для нас интересны
2)Пройдемся по поддиректориям.(заходим в папку идем на пункт 1.)
Вот вы подумайте,сессия должна ставится при login'e значит возможно будет в файле login.php, или index.php Ничего похожего я не нашел в этих файлах,
зашел в папочку "/includes/" под мой запрос подошли файлы auth.php,functions.php("наверняка тут основные функции"-,подумал я тогда),sessions.php.В первых двух мало чего интересного, а в sessions.php находилось именно то что я ожидал...
[Глава вторая:Засада]
Несмотря на то ,что я нашел файл отвечающий за сессии,мне не хватало информации.Пришлось готовится к засаде...
Для начала я поискал в других исходниках значение непонятных мне переменных(это мы уже научились делать в главе 1)
После того как этот "клубок" связей между файлов,начал раскручиваться,мы должны собрать больше информации.
Поставив форум на локалхост,я зашел залогинелся.
Смотрим что мне удалось подсмотреть.
При заходе и автологине:
URL:
(http://localhost/phpbb2/index.php?s...d64b86326f89812)
Tables:
Код:
+-------Содержание_таблицы_"phpbb_sessions_keys"-------------+ |key_id |user_id|last_ip |last_login| |47890667360dafa661c2c001881fcd8c| 2|7f000001|1133880510| +------------------------------------------------------------+ +-----Содержание_таблицы_"phpbb_sessions"-------------------------------------------------------------------------------------------+ |session_id |session_user_id|session_start|session_time|sessio n_ip|session_page|session_logged_in|session_admin| |8b65afab026290d77d64b86326f89812| 2| 1133880510| 1133880510| 7f000001| 0| 1| 0| +-----------------------------------------------------------------------------------------------------------------------------------+
Cookie:
Код:
+----------phpbb2mysql_data-------------------------------------------------------------+ |a:2:{s:11:"autologinid";s:33:"11328591534395a4beaa2249.79604364";s:6:"userid";s:1:"2";}| +---------------------------------------------------------------------------------------+ +--------phpbb2mysql_sid---------+ |8b65afab026290d77d64b86326f89812| +--------------------------------+
То есть cookie phpbb2mysql_data содержит строку, в которой "свернут"
массив.Для тех кто не понял напишу:
ключ массива: autologinid значение: 11328591534395a4beaa2249.79604364
ключ массива: userid значение:2
[Глава 3: Наш ход]
Теперь когда у нас есть все что бы анализировать ситуацию,мы можем глянуть опять в исходник.
Незнаю почему, но я все время сначала гляжу на функции удаления(session_clean),мне это помогает сначала,представить что выполняет функция добавления(session_begin)
Подчерпнул кое-что о автологине,и о назначении таблиц.Далее я поглядел конечто на функцию session_begin,посмотря на sql запрос многое понимаешь...
[Глава 4: Родственные связи...]
"Вот оно!",-так и хотелось закричать мне когда моя теория подтвердилась.
Смотрим главу вторую,а именно сведения которые мы подчерпнули:
autologinid=11328591534395a4beaa2249.79604364
Из исходника следует что key_id=md5(autologinid)!
Проверил,и вправду все верно! Вот тебе и первая связь!
Связь конечно это хорошо,даже очень хорошо. Но вот что не вписывалось:
mt_srand((float) $sec + ((float) $usec * 100000));
$session_id = md5(uniqid(mt_rand(), true));
/*Далее*/
list($sec, $usec) = explode(' ', microtime());
mt_srand(hexdec(substr($session_id, 0, 8)) + (float) $sec + ((float) $usec * 1000000));
$auto_login_key = uniqid(mt_rand(), true);
В этой строке индификатору сессии,которая будет записана в таблицу phpbb_sessions,присваевается неповторяющийся md5 хеш,никак не связанный с key_id.
Но постойте,этот хеш равен куке phpbb2mysql_sid и равен переменной sid в урле после процедуры логина! Но как бы это связать с хешем пароля??
[Глава 5: Исход битвы]
Ответ-никак =)
Вопщем этой "статьёй" я хотел показать пример анализирования алгоритма работы большого веб приложения,
думаю это мне удалось,остальное не главное для этой "статьи".