上一篇文章讲解了监控场地的思路,这篇文章进一步讲解如何破解验证码。

从点击提交按钮、弹出验证码,到最终付款之前发生了什么?

其实只有上面三个请求,只要我们模拟出这三个请求,那么不就通过验证码了?

先看看最后的submit请求需要什么参数

关键的参数就是红圈的三个,至于像`reservationOrderJson`这种参数,仔细看看上篇文章,spaceId就是某一块场地,timeId对应某一个时间。红圈的三个参数,我们一个一个地看怎么构造的。

captchaToken

这个最简单先说,这个字段就是第一个请求获取验证码接口get?captcha...的返回的token字段

orderPin

这个字段比较奇怪,我找了好久,最后发现在点击提交的时候就生成这个字段了

submitData: function(e) {
                    var t = this
                      , s = this.commonMethods.keySetPassword("".concat(e.clientX, ",").concat(e.clientY));

this.commonMethods.keySetPassword()函数如下

var V = 'c1h2i5n6g2o2k4a7';
var Y = 'C2H3I4N5G2O3K1E4';
function ee(e) {//e的格式如下 '231,622'
            if (["undefined", "null"].indexOf(ie(e)) >= 0)
                return !1;
            var n = d.a.enc.Utf8.parse(V)
              , t = d.a.enc.Utf8.parse(Y)
              , a = "object" === Object(o["a"])(e) ? JSON.stringify(e) : e.toString()//o["a"](e)  'string'

              , c = d.a.enc.Utf8.parse(a);
            return d.a.AES.encrypt(c, n, {
                iv: t,
                mode: d.a.mode.CBC,
                padding: d.a.pad.Pkcs7
            }).ciphertext.toString()
        }

e是一个pointerEvent,就是你点击提交按钮时鼠标的坐标,根据坐标生成一个orderPin,代码里的s就是orderPin

capchaVerification

这个最难,先看下面的代码

canvasClick: function(e) {
                    var t = this;
                    this.checkPosArr.push(this.getMousePos(this.$refs.canvas, e)),
                    this.num == this.checkNum && (this.num = this.createPoint(this.getMousePos(this.$refs.canvas, e)),
                    this.checkPosArr = this.pointTransfrom(this.checkPosArr, this.setSize),
                    setTimeout((function() {
                        var e = t.secretKey ? d(t.backToken + "---" + JSON.stringify(t.checkPosArr), t.secretKey) : t.backToken + "---" + JSON.stringify(t.checkPosArr);
                        t.$store.commit("setLoading", !0),
                        .....

JavaScript 函数的参数处理具有灵活性,上面d传入了两个参数,但是下面d函数的定义入参只有一个,所以入参就是t.backToken + "---" + JSON.stringify(t.checkPosArr)

e就是capchaVerification,看看它怎么生成的,t.backToken现成的好搞,t.checkPosArr就是点击点选验证码的坐标数组[{'x':100,'y':100},...].怎么通过验证码的图片得到点选验证码的坐标数组?可以google一下打码平台。然后调用d函数,是一个加密函数,定义如下

function d(e) {
            var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "XwKsGlMcdPMEhR1B"
              , s = c.a.enc.Utf8.parse(t)
              , i = c.a.enc.Utf8.parse(e)
              , a = c.a.AES.encrypt(i, s, {
                mode: c.a.mode.ECB,
                padding: c.a.pad.Pkcs7
            });
            return a.toString()
        }

至此抢票的最关键的三个参数就被我们破解了,只要模拟一下这三个接口,就可以快速锁定场地,然后在10分钟内慢悠悠地付款就可以了