Показать сообщение отдельно

  #22  
Старый 07.01.2010, 14:07
Root-access
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме:
2223440

Репутация: 648
Отправить сообщение для Root-access с помощью ICQ
По умолчанию

Использование sleep() вместо benchmark() (32 запроса на md5)

Зачастую встречаются sql-инъекции, в которых нет ни вывода полей, ни вывода ошибок.
В таких случаях применяют find_in_set() и ей подобные.
Я предлагаю ввести новую альтернативу для пятой ветки mysql - sleep().

Рассмотрим следующий запрос:

Код:
SELECT SLEEP((SELECT substring(version(),1,1)))
Здесь будет задержка 5 секунд (работаем с пятой веткой) + уйдёт время на выполнение самого запроса.
Если сначала посмотреть, сколько уходит времени на получение ответа от сервера на запрос без задержки, можно точно узнать первый символ одним запросом.
А учитывая то, что обычно сервер выполняет запрос меньше, чем за одну секунду, можно брать просто целую часть от времени ответа сервера.

Теперь посмотрим, как вытаскивать символы. Предлагаю делать это с помощью ASCII-кодов:

Код:
SELECT SLEEP((SELECT ascii(substring((SELECT password FROM users LIMIT 1,1),1,1)))/50)
В данном запросе задержка будет равна одной пятидесятой от кода символа в секундах.
В зависимости от того, как быстро сервер возвращает ответы без задержки, можно варьировать это число во избежание ошибки.

Таким образом, на 1 md5() хеш потребуется ровно столько запросов, сколько в нём символов - 32.

Теперь о плюсах и минусах:

+ Рекордные 32 запроса на md5()
+ Не требует вывода ошибок
- Работает лишь начиная с MySQL 5
- Возможны погрешности, если сервер перегружен

Надо отметить, что минусы не так существены, как плюсы - старые ветки MySQL уже отмирают, а погрешностей можно избежать, меняя знаменатель в функции SLEEP().

P.S. PoC-эксплойта пока не имеется, надеюсь скоро будет.

Последний раз редактировалось Root-access; 07.01.2010 в 14:09..