Старый 04.07.2012, 10:41   #1
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию Race condition для угадывания значений microtime()

Часто встречаются конструкции создания какого-либо случайного числа, или просто данных от microtime()
Частый пример:
Код:
mt_srand((double)microtime()*1000000);
Задача сократить перебор.

Полезная идея http://raz0r.name/articles/predskazyvaem-sluchajnye-chisla-v-php/ с Keep-alive имеет некоторые ограничения:
1. Не работает, если srand() перетряхивается сразу перед важной операцией, такой, например, как смена пароля. То есть если у вас есть вывод значения
Код:
mt_srand((double)microtime()*1000000);
$pass = md5(mt_rand());
и вы в keep-alive выше уже узнали значение сида, оно тут уже никак не поможет.
2. Требует keep-alive соединения, которое может быть закрыто на веб-сервере
3. Требует еще какого-то вывода данных

Придумалось сокращение перебора методом интервалов.
Смысл в том, что значение (double)microtime()*1000000 итеративно в пределах одной секунды серверного времени.
Таким образом, зная значения microtime() до и после события, мы существенно отрезаем диапазон для перебора.
Узнать, были ли наши запросы выполнены сервером в рамках одной секунды помогает заголовок Date HTTP-ответа.

Пример

Например, у нас есть возможность сбрасывать пароль любому пользователю (не самая частая уязвимость, но встречается).
Мы видим исходники или докадываемся как генерится пароль, пусть mt_srand((double)microtime()*1000000), и md5(mt_rand())
Отправляем последовательно, но быстро три запроса серверу:
1. Сбросить пароль от своего аккаунта №1
2. Сбросить пароль администратора
3. Сбросить пароль от своего аккаунта №2
4. Получаем HTTP ответы и смотрим в них заголовок Date, если он везде одинаковый, то двигаемся дальше.
Если в двух случаях одинаковый - тоже ничего, если разный везде - то повторяем операцию.
5. Получаем на почту два md5 хэша и брутим (или по таблицам) их на локальной машине, с целью узнать microtime(), который там был. Брутить там нечего, особо, поэтому быстро получаем два значения T1 и T3.
6. Понимаем, что искомое T2 значение microtime() - удовлетворяет условию:
T3>T2>T1.
7. Зная T1 и T3 брутим T2 уже в маленьком интервале.

В локальных сетях это работает сильно надежнее, чем по Интернет, в связи с более высокой скоростью соединения.

Если есть вывод значения microtime(), то брутить T1 и T3 уже не понадобится.

Не всегда работает, когда код на бэкэнд прикрыт фронтом. Там может и время сбится и все что хотите. Фронт может перемешать запросы как угодно. Но после брута T1 и T3 все становится понятно, этот факт может быть использован для детекта фронтэндов ^_^
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 04.07.2012, 11:37   #2
nikp
Banned
 
Регистрация: 05.07.2010
Сообщений: 201
Репутация: 183
По умолчанию

Похоже, слегка загнался.

Если можем сбрутить хеш, зачем его брутить три раза?
Чтобы в третий раз сбрутить быстрее, чем первые два?

Т.е. смысл всех действий в том, чтобы времени на брут потратить значительно больше,
чем если просто брутить админский хеш.

Или часть задачи не описана и осталась в голове?
=====
UPD, понял, админского хеша мы не получили, и не брутим хеш, а подбираем пароль.

Эх, надо было открыть задание, не было подобного, потом уже раскрыть тему.

Последний раз редактировалось nikp; 04.07.2012 в 12:30..
nikp вне форума   Ответить с цитированием
Старый 04.07.2012, 11:42   #3
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Цитата:
Сообщение от nikp Посмотреть сообщение
Похоже, слегка загнался.

Если можем сбрутить хеш, зачем его брутить три раза?
Чтобы в третий раз сбрутить быстрее, чем первые два?

Т.е. смысл всех действий в том, чтобы времени на брут потратить значительно больше,
чем если просто брутить админский хеш.

Или часть задачи не описана и осталась в голове?
Не, все нормально вроде написано.
Ты брутишь на локальной машине два хэша, что быстрее, чем отправлять 1млн запросов на сервер с попыткой угадать пасс админа сразу.
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 04.07.2012, 13:53   #4
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Да, если что это из жизни кейс, я так CSRF токен "угадывал" с 1000 попыток всего
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 04.07.2012, 22:37   #5
Qwazar
 
Регистрация: 09.07.2010
Сообщений: 376
Репутация: 154
По умолчанию

А можешь плз кусок примера для наглядности?
__________________
Мой блог: http://qwazar.ru/.
Qwazar вне форума   Ответить с цитированием
Старый 04.07.2012, 22:53   #6
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Код:
<?php
function resetPassword($email){
	if(userExists($email)){
		mt_srand((double)microtime()*1000000);
		$new_pass = md5(mt_rand());
		if (sendPassByEmail($email,$new_pass)){ 
			updateUserPass($email,$new_pass);
		}else return false;
	}else return false;
}
?>
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 09.07.2012, 10:57   #7
Beched
 
Регистрация: 06.07.2010
Сообщений: 400
Репутация: 118
По умолчанию

На самом деле разрабы тупят конечно, используя свой сид, по дефолту у mt_rand куда более стойкий сид, который генерится алгоритмом LCG, сид которого, в свою очередь, генерится на основе дважды вызванного gettimeofday, а также getpid или tsrm_thread_id (отсюда, энтропия возрастает на несколько порядков).

Поэтому, сбрутить токен, если используется mt_rand() без mt_srand() -- весьма проблематично.
Beched вне форума   Ответить с цитированием
Старый 24.07.2012, 21:17   #8
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

UPDATE.
Вектор применяется также, когда Keep-Alive невозможен из-за фронтэнда.
Привет, амазон
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Старый 09.01.2013, 18:46   #9
d0znpp
 
Аватар для d0znpp
 
Регистрация: 09.09.2010
Сообщений: 484
Репутация: 252
По умолчанию

Пора спускать, уже опубликовано в Хакере в статье про случайные числа
__________________
The Sucks Origin Policy
d0znpp вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot