ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15022|回复: 31

[原创] (MD5加密+验证码)网页登录的一个案例-(VBA联手JAVASCRIPT解决)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-20 17:19 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 chrisfang 于 2013-9-24 18:00 编辑

事先声明:本文适用于有一定抓包基础的新手。

一般网站为了安全起见,会想方设法限制客户端的自动登录和自动提交,于是就加密(Encode or Encrypt)一些提交的参数(比如密码)。以此阻碍自动登陆,保护客户信息和网站服务器(频繁访问网站,增加服务器负荷,比如最近的12306抢票助手)。

网站的安全性要求越高,这种情况越是是明显,比如http://web.qq.com (WEBQQ)。它复杂的客户端与服务器会话流程、参数加密和编码、时不时的随机码验证 ....

接下去,看一个案例。
一个典型的MD5加密和验证码双重限制自动登陆的网站:
哈票网
https://member.hipiao.com/

调试附件: DDAY.zip (27.7 KB, 下载次数: 261)
该附件sheet1被隐藏,里面有3个JS函数,是从网页调用的JS文件中拷贝过来的,参与VBA登录运算。你也可以修改成每次运行程序,自动从网页调用的JS文件中将3个函数截取过来,为VBA所用。而不需要放在SHEET1里面。

--------------------------  先谈一下验证码  ---------------------------------

首先理解客户端和网站服务器的的会话顺序

step 1,客户端向服务器发送请求(GET方式),服务器向客户端返回一张验证码图片;

step 2,你如果多次请求(重复step 1),服务器只认你最后一次请求所返回的那张图片对应的验证码;

step 3,将验证码图片显示出来(img控件也好,直接图片插入也好,只要能显示出来就行),通过人工识别(最智能的识别方式),输入验证码;

step 4,准备验证码在内的提交参数,发生给服务器(POST方式),服务器通过对参数的解读(账号、密码、验证码等,有时甚至还有MD5加密的随机参数限制自动登录),做出反应,向客户端返回登陆后的页面(如果登陆成功);


--------------------------  本案例向服务器提交的参数(某次登录的参数)  -----

以下是某一次post登陆时向服务器发送的参数。括号内为我的注解(结合JS代码分析)

hpId=5c9de9cea1 (该参数是服务器发送给客户端的随机字符串,和密码等字符一起用于MD5加密运算,容易获得)
mode=0 (一直为0,也是MD5加密计算前字符的一部分)
planId= (一直为'',也是MD5加密计算前字符的一部分)
rand= UHovoMkjh3kNO32eYiENAQ3U9SkCUXdru66QJfbUdBPWxLogS[lgRJumlhc7XTYJw4SlTTxoL1sdODknlajClCbXH6Tf9uysmaQVTgUZc]n9kRZVH3hrPinaijwQpnY2 (通过string.rand(128)计算获得,也是MD5加密计算前字符的一部分,容易获得)
rember=0 (一直为0,也是MD5加密计算前字符的一部分)
sign=11724fff383346ed8e2a9d6e90d2bc2c (关键部分,最终MD5加密计算的结果,登陆密码与所有参数放在一起被MD5加密,不知道加密机制的话,无法准确获得)
t=Thu Dec 27 15:28:07 UTC+0800 2012 (通过new Date().toString().substring(0,33)计算获得,也是MD5加密计算前字符的一部分)
user=ehuser (登陆账号,也是MD5加密计算前字符的一部分)
vcode=7683 (登陆验证码,也是MD5加密计算前字符的一部分,容易获得)


--------------------------  本案例MD5加密机制  ---------------------------

不同网站的加密机制千差万别 (正确的废话),分析其加密或转码机制才能在客户端生成正确的参数 (向服务器提交)。
MD5是不可逆加密,关于MD5的介绍,和MD5加密与登录的关系见附件: MD5 加密算法与用户登录信息的保护.zip (209.7 KB, 下载次数: 160)

本案例的MD5加密机制比较容易分析,因为该网站的JS代码写的比较清楚,加密过程简单。
加密的JS源码是:map['sign']=getSign(map,md5(md5(md5(member['pass']))+member['hpId']));
JS的getSign函数内部也有一次MD5加密。

由于每次登录参数都是随机生成的,所以需要有个可以控制的加密情形再现过程,这样才知道加密是否正确。

以下是某次登录提交的参数
hpId=5c9de9cea1   
mode=0   
planId=''        
rand=]Pi4h6S4K[SRdIPX48ne[HWyym7ZB5JGPGWnO7D1HCqePEEYNIOdmCk63kKQEphRT8xdCNRZ396BTjx8AH5HkVxO[or2clElqGYaaZwNlbjye1k1p4W41L[G8OMoKrmi
rember=0
sign=6ca37ee8d5b615a3c2c06b9ad5f6d37e
t=Wed Jan 2 15:47:33 UTC+0800 2013
user=ehuser   
vcode=5204

从JS代码中分析知道,上述蓝色参数值作为输入,一起参与MD5加密运算,生成红色参数sign值作为输出。现在就以上述参数为输入和输出,重现一下sign值的制作,以验证我当初所认为的加密机制是否正确。(打开HTML文件点"测试"按钮)
测试加密机制.zip (3.38 KB, 下载次数: 187)

-----------------------------END

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-21 12:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
实战实战实战实战实战实战>

TA的精华主题

TA的得分主题

发表于 2013-1-21 21:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-8 10:37 | 显示全部楼层
怎么也找不到那三个JS函数。。。。。。求大师给指点

TA的精华主题

TA的得分主题

发表于 2014-7-8 11:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-8 15:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
基础太弱,只能一点点弄,网站好像和之前不一样了,前面的不能正常登陆了。获取hpid字条串就过不去了,求大师给看看
  1.         '/获取hpId字符串 - start
  2.         .Open "POST", "https://member.hipiao.com/hpId.php", False
  3.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  4.         .send ("nickname=18753292305&rand=" & JS.CodeObject.String.rand(64, "18753292305"))  '这个为什么得不到正确结果
  5.         '.send ("nickname=18753292305&rand=820832eae6e5311b8cdfd2fd4e46f8eb4da7a1aee126ac241bcde808822f6c52")
  6.         hpid = .responsetext
  7.         'hpid = "37ffd71c57"   '正确的hpid
  8.         MsgBox hpid
  9.         '/获取hpId字符串 - end
复制代码
string.rand(length,nickname)函数我是在https://member.hipiao.com/res/js/mLogin20131218.js这个js里找到的,而且里面有这么一段
  1.                 if(hpIdMap[nickname]&&hpIdMap[nickname].length>8) return hpIdMap[nickname];
  2.                 $.ajax({
  3.                            type: "POST",
  4.                            url: "/hpId.php",
  5.                            data: "nickname=" + nickname + "&rand=" + String.rand(64,nickname),
  6.                            success: function(msg){       
  7.                                    hpIdMap[nickname]=$.trim(msg);       
  8.                            }
  9.                            ,async:sync });        // end ajax
  10.                 return hpIdMap[nickname];
  11.         };
复制代码
看起来很像我要用的post数据,为啥总是得不到正确结果?,直接用抓包得到的随机64位就能得到正确结果,用JS.CodeObject.String.rand(64, "18753292305")得到的64位随机数就得不到结果,求大师给指点 哈票网 DDAY - 副本.rar (33.65 KB, 下载次数: 22)

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-14 11:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 kangatang 于 2014-7-14 11:56 编辑
战战如疯 发表于 2014-7-8 15:29
基础太弱,只能一点点弄,网站好像和之前不一样了,前面的不能正常登陆了。获取hpid字条串就过不去了,求大 ...

string.rand函数已经改如下: 参数 hpId和rand的制作方式有改动。但是几重MD5的加密机制没有变。网站总是在改源码。。。你就跟他们玩吧。。。good luck

String.rand=function(length,member){
        var key = 'asdfsadferwerwerewrwerewrwe';
        if(length==128){
                var s1 = String.rand(32);
                var s2 = $.md5(s1);
                var s3 = $.md5($.md5(member['hpId'])+s2);
                var s4 = $.md5($.md5(member['vcode'])+s2+key);
                return s1+s2+s3+s4;
        }
        if(length==64){
                var username = $("#user").val();
                var s1 = String.rand(32);
                var s2 = $.md5(s1+$.md5(username)+$.md5($.md5(username))+key);
                return s1+s2;
        } else {
                        var s='fqw7abcdef1234567890abcdeffFwweyyaa1234567890abcdef1234567890abcdeffFGGGGG';
                        var r='';        
                        for(var i=0;i<length;i++){        
                                r+=s.charAt(Math.floor(Math.random()*s.length));
                                }
                        return r;
                }
        };

TA的精华主题

TA的得分主题

发表于 2014-7-15 10:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
kangatang 发表于 2014-7-14 11:54
string.rand函数已经改如下: 参数 hpId和rand的制作方式有改动。但是几重MD5的加密机制没有变。网站总是 ...

谢谢大师出手,压力山大,得慢慢研究。。。

TA的精华主题

TA的得分主题

发表于 2014-7-15 11:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大师的代码得慢慢学习,先记录一下。感谢分享

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-15 12:13 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hehex 发表于 2014-7-15 11:18
大师的代码得慢慢学习,先记录一下。感谢分享

这帖子刚开始一年半无人问津, 换我现在的脾气早就设定权限,敝帚自珍了。
管理人员对看不懂的东西,或者不感兴趣的东西置之不理。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 23:35 , Processed in 0.048028 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表