输入密码以后,点击验证码框出现验证码
输入验证码以后正常登陆
下面来看看这个登陆界面的几个特点
1,必须使用密码键盘输入密码才能登陆成功,关闭键盘,直接输入密码不可以登陆
2,验证码获取不随机
从图片可以看出,rand后面的数字与验证码上面的数字一样,说明只要我们改变数字求请求验证码,就可以得到相应数字的验证码
尝试如图
根据上面的分析,我们再尝试抓包
可以看出传递的地址与参数,分析其中passwd参数与我实际选择的密码不同
于是推测,密码实际是密码键盘上面生成的,也就是说你实际的密码并没有使用到
每次请求会得到一张密码键盘图,其实传送的密码,是根据你点击的键盘坐标生成的
例如下图,假设你的密码是123456,那么你在键盘上点击以后生成的实际密码是
284902,对应关系是1=>2,2=>8,3=>4,4=>9,5=>0,6=>2
可以看出实际是根据键盘坐标对应的,无论键盘上的图片是几,第一个代表的就是0,第二个是1,依次类推
根据上面的结论,我总结模拟登陆的思路:
首先获取密码键盘表,根据每个按钮的坐标,截取里面的数字,确定每个数字图片代表的是几,这里为了代码编写方便,使用md5把截取出来的二进制图片加密,生成32字符便于比较
首先保存一张密码键盘图片,使用切片工具确定坐标,把每个数字切出来,下面使用php实现切片
附一张截取出来的数字图片
下面是总结的对应关系
9=>1c08ef360c36e3a85efb2ca279802461
0=>bfc4992573880df8e374807c443e8401
1=>eb24abcd7028ac9d03848d35ca4376f2
3=>486d19dccda9cae742bb376f257c7eb9
2=>da4c60c456ba8d60001da697ecd65a7d
5=>34d28f6f4f6638cecf8e01df5f8c1cf9
6=>40333b61dea66ec76af47efc467d7722
8=>4ed3428507225abf5dc1f0b0624fbbdc
4=>c230847e76231e5efad5c558544ceb56
7=>353519ea4fb442c8d23244e66d3bd4bd
下面的步骤是:
获取键盘图片,根据上面的方法,确定原密码对应的新密码
获取验证码图片,这个可以构造自己的验证码,所以基本就是绕过
根据新密码,验证码等信息,提交表单给登陆地址,模拟登陆
直接贴代码说明
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();
?>