某高校校园卡网站模拟登陆(php)

来源:互联网 发布:php微交易源码 编辑:程序博客网 时间:2024/04/28 23:20
让我们先来看登陆界面,这里可以使用卡号或学号,这里我们使用卡号,其实是一样的


输入卡号后,点击密码输入框,弹出一个密码键盘



输入密码以后,点击验证码框出现验证码


输入验证码以后正常登陆

下面来看看这个登陆界面的几个特点
1,必须使用密码键盘输入密码才能登陆成功,关闭键盘,直接输入密码不可以登陆
2,验证码获取不随机

从图片可以看出,rand后面的数字与验证码上面的数字一样,说明只要我们改变数字求请求验证码,就可以得到相应数字的验证码
尝试如图


根据上面的分析,我们再尝试抓包
可以看出传递的地址与参数,分析其中passwd参数与我实际选择的密码不同


于是推测,密码实际是密码键盘上面生成的,也就是说你实际的密码并没有使用到
每次请求会得到一张密码键盘图,其实传送的密码,是根据你点击的键盘坐标生成的
例如下图,假设你的密码是123456,那么你在键盘上点击以后生成的实际密码是
284902,对应关系是1=>2,2=>8,3=>4,4=>9,5=>0,6=>2
可以看出实际是根据键盘坐标对应的,无论键盘上的图片是几,第一个代表的就是0,第二个是1,依次类推



根据上面的结论,我总结模拟登陆的思路:
首先获取密码键盘表,根据每个按钮的坐标,截取里面的数字,确定每个数字图片代表的是几,这里为了代码编写方便,使用md5把截取出来的二进制图片加密,生成32字符便于比较
首先保存一张密码键盘图片,使用切片工具确定坐标,把每个数字切出来,下面使用php实现切片
<?php                    //获取键盘图片    $imgsrc = "pan.png";    //创建键盘图片数据    $source = imagecreatefrompng($imgsrc);                    //设置新图片画布    $tagurl = "first.png";    //这里设置长宽为25px,因为根据切片工具看,每个数字图片的长宽为25px    $w = $h = 25;    //创建画布,为画数字图片做准备    $tag = imagecreatetruecolor($w,$h);        //根据具体坐标,截取键盘图片部分,生成数字图片    imagecopy($tag,$source,0,0,9,143,$w,$h);                imagepng($tag,$tagurl);    //读取数字图片,将二进制数据md5加密,获得唯一对应值    $zuobiao = md5(file_get_contents($tagurl));?>
附一张截取出来的数字图片

下面是总结的对应关系
9=>1c08ef360c36e3a85efb2ca279802461
0=>bfc4992573880df8e374807c443e8401
1=>eb24abcd7028ac9d03848d35ca4376f2
3=>486d19dccda9cae742bb376f257c7eb9
2=>da4c60c456ba8d60001da697ecd65a7d
5=>34d28f6f4f6638cecf8e01df5f8c1cf9
6=>40333b61dea66ec76af47efc467d7722
8=>4ed3428507225abf5dc1f0b0624fbbdc
4=>c230847e76231e5efad5c558544ceb56
7=>353519ea4fb442c8d23244e66d3bd4bd

下面的步骤是:
获取键盘图片,根据上面的方法,确定原密码对应的新密码
获取验证码图片,这个可以构造自己的验证码,所以基本就是绕过
根据新密码,验证码等信息,提交表单给登陆地址,模拟登陆

直接贴代码说明
<?php            /*    *根据你原来的密码与密码键盘生成新密码    */    function getpwd($imgsrc = "pan.png",$pwd){            //数字图片横纵坐标        $width = array(9,45,81);        $height = array(35,71,107);        //数字图片对应的数字        $old = array(            "1c08ef360c36e3a85efb2ca279802461" => 9,            "bfc4992573880df8e374807c443e8401" => 0,            "eb24abcd7028ac9d03848d35ca4376f2" => 1,            "486d19dccda9cae742bb376f257c7eb9" => 3,            "da4c60c456ba8d60001da697ecd65a7d" => 2,            "34d28f6f4f6638cecf8e01df5f8c1cf9" => 5,            "40333b61dea66ec76af47efc467d7722" => 6,            "4ed3428507225abf5dc1f0b0624fbbdc" => 8,            "c230847e76231e5efad5c558544ceb56" => 4,            "353519ea4fb442c8d23244e66d3bd4bd" => 7,        );                //获取原图片        $source = imagecreatefrompng($imgsrc);                $arr = array();        //设置新图片画布        $tagurl = "first.png";        $w = $h = 25;        $k = 0;        //根据你请求到的键盘图片,生成新密码        for($i = 0; $i < count($height); $i++){            for($j = 0; $j < count($width); $j++){                                $tag = imagecreatetruecolor($w,$h);                                imagecopy($tag,$source,0,0,$width[$j],$height[$i],$w,$h);                            imagepng($tag,$tagurl);                $zuobiao = md5(file_get_contents($tagurl));                                $arr[$old[$zuobiao]] = $k;                $k++;                            }        }                            //这里是最后一个,因为后两个不是数字,是删除键,关闭键,所以对于最后一个数字单独提取                $tag = imagecreatetruecolor($w,$h);                        imagecopy($tag,$source,0,0,9,143,$w,$h);                    imagepng($tag,$tagurl);        $zuobiao = md5(file_get_contents($tagurl));                        $arr[$old[$zuobiao]] = $k;                        //连接出新密码                        $realpwd = "";                for($i = 0; $i < strlen($pwd); $i++){            $realpwd .= $arr[$pwd{$i}];            }        return $realpwd;    }        function login(){        //cookie保存位置        $cookie_jar = dirname(__FILE__)."/pic.cookie";                //获取键盘图片,记得携带cookie        $ch = curl_init();        $panurl = "http://card.jnu.edu.cn:8080/getpasswdPhoto.action";        curl_setopt($ch,CURLOPT_URL,$panurl);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);        $pan = curl_exec($ch);        file_put_contents("pan.png",$pan);                //根据密码图片与原密码,获取新密码        $pwd = getpwd("pan.png","原密码");                    //获取验证码图片,记得带上cookie                $imgurl = "http://card.jnu.edu.cn:8080/getCheckpic.action?rand=8080.";        curl_setopt($ch,CURLOPT_URL,$imgurl);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);        $img = curl_exec($ch);        file_put_contents("a.jpg",$img);                //模拟登陆            $url = "http://card.jnu.edu.cn:8080/loginstudent.action";        $post = array('name'=>'你的卡号','loginType'=>'1','passwd'=>$pwd,'rand'=>'8080','userType'=>'1');                curl_setopt($ch,CURLOPT_URL,$url);            curl_setopt($ch,CURLOPT_HEADER, 0);            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_POST, 1);        curl_setopt($ch, CURLOPT_POSTFIELDS,  http_build_query($post));        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);        $res = curl_exec($ch);                if (curl_errno($ch)) {           print curl_error($ch);           }                       //模拟登陆成功以后,携带cookie登陆校园卡信息界面       $url = "http://card.jnu.edu.cn:8080/accountcardUser.action";       curl_setopt($ch,CURLOPT_HEADER,0);       curl_setopt($ch,CURLOPT_URL,$url);       curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);       curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);       curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);       $res = curl_exec($ch);              echo $res;       if (curl_errno($ch)) {           print curl_error($ch);       }             curl_close($ch);    }        login();            ?>




0 0
原创粉丝点击