美文网首页
研究投票实践

研究投票实践

作者: 淼淼淼很努力 | 来源:发表于2017-12-28 16:46 被阅读27次

    背景

    最近接触到一个投票,怎么才能用技术的手段投票呢?这是我思考的问题。

    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&timestamp=1514447634411&sign=FA677FD78F3F611FC62E76787B8916DC&_=1514447634413&callback=Zepto1514447626658
    

    现在我们已经拿到了投票的接口,试试我们能不能通过再次请求接口投票呢。

    答案是:不行的! 1.png
    • 那么我关掉网页可以再次投票吗?答案是肯定的。(已修复)

    结论

    • 直接通过抓包查看接口不能通过直接访问接口达到目的,但是我们可以通过重新就让网页达到目的。

    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的方法吗?

    答案:暂时是不行的。

    虽然暂时不能够通过其他方式投票,但是研究投票实践的整个过程是快乐的。花费少量的时间获得一些收获也是非常值得的。最后再次感谢:小彰,小奇,小超,小诗,小淼。

    相关文章

      网友评论

          本文标题:研究投票实践

          本文链接:https://www.haomeiwen.com/subject/zmkvgxtx.html