过支付宝滑块验证

本文只做研究使用。(知乎首发)

过支付宝滑块验证_第1张图片
支付宝最近用上自己家的滑块验证的,以前使用的是图形验证码+json_ua,详情分析看之前的文章,改版后,使用的是自己的滑动验证。在刚开始换的时候,没有对滑动部分做验证,从上周后,开始对滑动部分做验证了。

分析:

首先抓包:

POST https://rds.alipay.com/captcha.htm HTTP/1.1
Connection: keep-alive
Accept-Encoding: gzip, deflate, br
Accept: text/javascript, text/html, application/xml, text/xml, */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3814.0 Safari/537.36
Content-Length: 508
Accept-Language: zh-CN,zh;q=0.9
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
X-Requested-With: XMLHttpRequest
Origin: 自助服务-支付宝
Host: rds.alipay.com
Referer: 重置登录密码
cache-control: no-cache
Content-Type: application/json
Cookie: umt=L4db6c8caea020305c8bef5ebf0b1c130; ALIPAYJSESSIONID=GZ00jASgSQSjkSCHzH6Jk5yixnRsPImembercenterGZ00; ctoken=6__Y9FxOoJKCX3U0; zone=GZ00C

{"type": "slide", "bizNo": "c51337a362ae4e4ebd369fd063acbf1457c98feb077a4396e08c5ee4ee825092", "containerId": "J_rdsCapChecker", "data": "mlyq5dvbrkQttuqcVdrf8rflWYL3uZY6aT1FIGenECO296YXGLAwI8fOFvOVDUoFcy6_PhMASXgTuapEjfiwR3gQVJaXaPnNWIwoUf2VtDpeEWMuPpEm_XOw8yAbk1Ky6wUV_G90BPK73qcjhzpfSrliGgyPpTmlP1dc1geLOlu2.DA3SkSBmL6CYsfDjNnB.iCcIAn6TCXAvw3864KGy6VxFTjhgfO4btLpRPAhD.fhFjrkdtY6iw9Y_2u52osfnHpjN.qvu_bzuVEz1G2ktN4U5inT8ebxXgXpeSL0s5a", "appid": "membercenter_logonIdInputReset", "scene": "STRIKE_BUTTON"}

主要的加密就是这个data,这一步获取成功的话会得到验证后的token,拿着token就可以进行下一步的操作了

下断点可以快速定位到生成data的数据地方,js收集了鼠标的轨迹,这个是毫无疑问的。

e.prototype.initEvents = function() {
            var t = this
              , e = f.default.isMobileClient()
              , n = {
                moveStart: function(s) {
                    return t.activeStatus(p.SLIDE_START, s),
                    f.default.addEvent(t.rdsWrap, e ? "touchmove" : "mousemove", n.preventDefault),
                    f.default.addEvent(t.body, e ? "touchmove" : "mousemove", n.moving),
                    f.default.addEvent(t.body, e ? "touchend" : "mouseup", n.moveEnd),
                    f.default.addEvent(t.body, "touchcancel", n.moveEnd),
                    !1
                },
                moving: function(e) {
                    e.stopPropagation(),
                    t.data.enableMove && (t.data.isSlideEnd ? t.activeStatus(p.SLIDE_END, e) : t.activeStatus(p.SLIDE_ING, e))
                },
                moveEnd: function(s) {
                    return t.isCurrectStatus(p.SLIDE_END) ? t.activeStatus(p.CHECK_START, s) : t.isCurrectStatus(p.SLIDE_ING) && t.activeStatus(p.SLIDE_CANCEL, s),
                    f.default.removeEvent(t.rdsWrap, e ? "touchmove" : "mousemove", n.preventDefault),
                    f.default.removeEvent(t.body, e ? "touchmove" : "mousemove", n.moving),
                    f.default.removeEvent(t.body, e ? "touchend" : "mouseup", n.moveEnd),
                    f.default.removeEvent(t.body, "touchcancel", n.moveEnd),
                    !1
                },
                retry: function(e) {
                    (t.isCurrectStatus(p.CHECK_FAIL) || t.isCurrectStatus(p.CHECK_TIMEOUT)) && t.activeStatus(p.DEFAULT, e)
                },
                preventDefault: function(t) {
                    t.preventDefault()
                }
            };
            f.default.addEvent(this.rdsBtn, e ? "touchstart" : "mousedown", n.moveStart),
            f.default.addEvent(this.rdsResetBtn, "click", n.retry)
        }

以上可以看到,js对鼠标事件进行的采集。至于他对采集的鼠标轨迹做了什么我们先不管。因为对轨迹的处理代码部分做了逻辑混淆,非常难分析。

我们需要找到关键的调用生成这一参数的地方:

var e = this;
            clearTimeout(this.timerReqTimeout);
            var n = this
              , s;
            try {
                s = antcap.fnGetRdsData()
            } catch (t) {}
            var r = o({}, n.cfg.params, {
                data: s
            }, t.params);
            r.appId && (r.appid = r.appId,
            delete r.appId),
            r.i18n && delete r.i18n,
            r.scene = {
                click: "CLICK_BUTTON",
                slide: "STRIKE_BUTTON",
                drag: "SHOOT",
                silence: "DO_NOTHING"
            }[t.type];

在这里,看到了一个全局的对象antcap,调用fnGetRdsData方法就可以会得到最终的加密参数

猜想antcap是在那一堆混淆的代码里产生的。那么他是如何生成的我们不管,我们只需要把所有的js代码全部扣出来即可。需要模拟的对象就去模拟。

把生成antcap对象看做一个黑盒,只管去调用就好了。

//只管调用
var s = antcap.fnGetRdsData()
return s

那么开始码代码:
过支付宝滑块验证_第2张图片
发包截图:

过支付宝滑块验证_第3张图片

舒服!

你可能感兴趣的:(过支付宝滑块验证)