背景
最近接触到一个投票,怎么才能用技术的手段投票呢?这是我思考的问题。
Part 1
思考
- 直接通过抓包查看接口能不能通过直接访问接口达到目的?
步骤
- 通过分享的链接抓取到投票详情页的
url =http://h5.thepage.cn/economicVote/detail.htmlcid=5a3371b85ab34500e2302574&vid=5a41f55c308cc6063331c901&type=yxlrw
现在我们拿取到详情页面,更方便操作。(直接访问这个链接就可以进行投票)
- 通过抓包工具抓取到投票的接口
http://cloud.thepage.cn/vote?cid=5a3371b85ab34500e2302574&vid=5a41f55c308cc6063331c901&userid=89E08C9B639B0BE3A3D8D75378D0C798&userinfo=%7B%22origin%22%3A%22wx%22%2C%22token%22%3A%2289E08C9B639B0BE3A3D8D75378D0C798%22%2C%22headimgurl%22%3A%22http%3A%2F%2Fwx.qlogo.cn%2Fmmopen%2Fvi_32%2Fw1GXda9T4TUic2oKiab8xlWU69xAlHYU0XwGT3oX5AqYicbyjiarDYJvSFQvkMOuogoQw1KOuthdePrImQtiaDt0LzQ%2F0%22%2C%22nickname%22%3A%22%E5%94%A7%E5%94%A7%E5%8F%BD%22%2C%22sex%22%3A1%7D&aid=5a33710f0c83b900cf376354&nonceStr=2supuuyfte×tamp=1514447634411&sign=FA677FD78F3F611FC62E76787B8916DC&_=1514447634413&callback=Zepto1514447626658
现在我们已经拿到了投票的接口,试试我们能不能通过再次请求接口投票呢。
- 那么我关掉网页可以再次投票吗?答案是肯定的。(已修复)
结论
- 直接通过抓包查看接口不能通过直接访问接口达到目的,但是我们可以通过重新就让网页达到目的。
Part 2
思考
- 为什么直接访问不行,那么而重新访问页面后就成功了?
步骤
- 研究发现在关掉后再次请求的过程中其实变化的只是其中的token,nonceStr,timestamp,sign。那么token,nonceStr,timestamp,sign是从哪儿来的呢?
nonceStr和timestamp解密
- 拿取网页的js,查看页面逻辑。在小超的帮助下其中一段代码引起了我们的注意:
request: function(e, t, n) {
var i = Math.random().toString(36).substr(2, 10);
var r = (new Date).getTime();
a.nonceStr = i;
a.timestamp = r;
很容易能够看出来nonceStr 是 生成十位字母加数字随机数(所以可以猜想这个本生就是随机的,后台是不会做验证的)。
而timestamp就是现在的时间戳(后台也不会验证)。
可以发现这2个参数是可以按照规则随意修改的。
sign解密
- 继续解密js,在小超的帮助下这极端代码引起了我们的注意:
delete a.sign;
var o = this.asciiSort(a);
var s = md5(o).toUpperCase();
a.sign = s;
很明显sign在最后应用之前是有asciiSort方法生成,然后再做MD5转换,而带入方法的参数就是删除掉sign字段的a。
asciiSort: function(e) {
var t = Object.keys(e);
t = t.sort();
var n = {};
t.forEach(function(t) {
n[t] = e[t]
});
var i = "";
for (var r in n) {
i += "&" + r + "=" + n[r]
}
i = i.substr(1);
return i
},
-
Bingo!
所以sign的加密方式,就是把a的sign字段删除后,按照asciiSort方法排序后,MD加密并转换为大写。
现在就差token了
token解密
-
同样这次在小诗,小彰和小奇的帮助下,了解了token生成的原理。
2.png -
根据其判断逻辑,其实这个token是通过微信接口返的code(这个其实是微信的授权,类似返回的用户令牌),然后再通过本地请求后台接口/weixin/get,生成的。
-
从新打开页面能够投票,最关键是因为token变化了。(其他3个我们都可以自行修改,而token是无法自定义的,它包含微信的验证和本身后台的验证)
-
所以我们要完成投票,必须要获取到token。
Part 3
突发
-
本来在研究了几个小时的机制问题,突然发现在同一个账户的情况下token不再发生变化。已经不能够通过之前的方式进行投票。
-
猜想:我们了解到其实token是有时效性的,也就是说,如果设置的时效性有一段时间,那么在一定的时间内,token是不会变化的。那么我们将不能通过变化的token来发起投票。
-
问题:那么我们能够获取到其后台生成token的方法吗?
答案:暂时是不行的。
虽然暂时不能够通过其他方式投票,但是研究投票实践的整个过程是快乐的。花费少量的时间获得一些收获也是非常值得的。最后再次感谢:小彰,小奇,小超,小诗,小淼。
网友评论