js逆向实战-天翼云登录


声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!

前言

今天有点忙,来个简单点的练习,重要的是训练思路。
之所以说它简单,是因为今天这个项目要逆向 的js代码没有混淆,关键位置也比较容易找到。

目标

用户登录能够通过向登录接口发送数据,收到正常的回复
地址:
aHR0cHMlM0EvL20uY3R5dW4uY24vd2FwL21haW4vYXV0aC9sb2dpbiUzRnJlZGlyZWN0JTNEJTI1MkZteQ==

操作步骤

分析登录接口请求参数

1

通过接口的请求参数可以看出这个接口的参数包含两部分,一部分是在URL上的参数,一部分是form表单提交的数据。
可以看出来,我们的目标是password、comParam_seqCode、comParam_signature

password加密过程

先全局搜索password

2

发现实在是太多了,不方便定位
那还是通过接口的调用栈进行跟栈
3

最终跟踪到如下位置
4

确定password就是这一行加密得到的,a.value是密码,r.value是用户名。

下面跟进去查看

先查看Object(w["c"])
5
6

这个方法已经很明显了,TripleDES嘛!
再看看对r.value都做了什么处理

  1. Object(w[“g”])
    7
    8

这一步就是去掉空白字符
2. Object(w[“f”])
9
10

这个其实就是对字符串先判断长度是否够24,如果不够在字符串后边补"0"不够24个字符,如果长度大于24,就只截取24个字符。
那么这个password伪代码就是如下这样的:
password = TripleDES(password,取24个字符(去处空白(username)))

password加密实现

经过上边的分析,可以发现,这个js还是挺好抠的,毕竟没有做混淆。
直接把相应的代码抠下来,至于TripleDES,那就直接用crypto-js库里的方法即可。
没有安装crypto-js库的,需要先安装:

npm install crypto-js
var CryptoJS = require("crypto-js");

var M = function(e) {
    var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : ""
        , t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}
        , r = t.enc
        , a = void 0 === r ? "Utf8" : r
        , o = t.mode
        , c = void 0 === o ? "ECB" : o
        , i = t.padding
        , u = void 0 === i ? "Pkcs7" : i
        , d = CryptoJS.enc[a].parse(n)
        , s = {
        mode: CryptoJS.mode[c],
        padding: CryptoJS.pad[u]
    }
        , l = CryptoJS.TripleDES.encrypt(e, d, s);
    return l.toString()
}
    , _ = function(e) {
    var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
    if (e && "string" === typeof e) {
        var t = n.text || "0"
            , r = n.length || 24;
        if (e.length < r)
            for (var a = e.length; a < r; a++)
                e += t;
        else
            e = e.substring(0, r);
        return e
    }
},Q = function() {
    var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "";
    return e.replace(/\s+/g, "")
};
function get_password(e){
   return  encodeURI(M(e.password, _(Q(e.userName))))
};

运行结果:
11

这个结果和浏览器中的就一致了。
password逆向就到此为止了。

comParam_seqCode和comParam_signature

其实目前来说,发送请求时不带着comParam_seqCodecomParam_signature也能正常返回
12

但是保不齐什么时候就会校验这两个值,所以还是先将它搞出来。
还是先全局搜索
13

这个好,一搜就定位到了生成位置。
comParam_curTime: 是个时间戳,
comParam_seqCode: r = Object(u[“k”])()生成的,
comParam_signature: a = i()(n + r + i()(r + t + n))生成的。
那还是老样子,涉及到的方法都抠下来
调试一下
可以输出comParam_seqCode和comParam_signature
14

整合js代码

现在的目的是传给js代码用户名和密码,js代码给返回用户名,加密后的密码,comParam_curTime,comParam_seqCode和comParam_signature
整合后代码:

var CryptoJS = require("crypto-js");

var M = function(e) {
    var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : ""
        , t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}
        , r = t.enc
        , a = void 0 === r ? "Utf8" : r
        , o = t.mode
        , c = void 0 === o ? "ECB" : o
        , i = t.padding
        , u = void 0 === i ? "Pkcs7" : i
        , d = CryptoJS.enc[a].parse(n)
        , s = {
        mode: CryptoJS.mode[c],
        padding: CryptoJS.pad[u]
    }
        , l = CryptoJS.TripleDES.encrypt(e, d, s);
    return l.toString()
}
    , _ = function(e) {
    var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
    if (e && "string" === typeof e) {
        var t = n.text || "0"
            , r = n.length || 24;
        if (e.length < r)
            for (var a = e.length; a < r; a++)
                e += t;
        else
            e = e.substring(0, r);
        return e
    }
},Q = function() {
    var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "";
    return e.replace(/\s+/g, "")
};
function getPassword(e){
   return  encodeURI(M(e.password, _(Q(e.userName))))
};

var H = function() {
    var e, n, t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 32, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 16, a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""), o = [];
    if (r = r || a.length,
        t)
        for (e = 0; e < t; e++)
            o[e] = a[0 | Math.random() * r];
    else
        for (o[8] = o[13] = o[18] = o[23] = "-",
                 o[14] = "4",
                 e = 0; e < 36; e++)
            o[e] || (n = 0 | 16 * Math.random(),
                o[e] = a[19 === e ? 3 & n | 8 : n]);
    return o.join("")
}

function i(t, e) {
    var n = (65535 & t) + (65535 & e)
        , r = (t >> 16) + (e >> 16) + (n >> 16);
    return r << 16 | 65535 & n
}
function a(t, e) {
    return t << e | t >>> 32 - e
}
function c(t, e, n, r, o, c) {
    return i(a(i(i(e, t), i(r, c)), o), n)
}
function u(t, e, n, r, o, i, a) {
    return c(e & n | ~e & r, t, e, o, i, a)
}
function s(t, e, n, r, o, i, a) {
    return c(e & r | n & ~r, t, e, o, i, a)
}
function f(t, e, n, r, o, i, a) {
    return c(e ^ n ^ r, t, e, o, i, a)
}
function l(t, e, n, r, o, i, a) {
    return c(n ^ (e | ~r), t, e, o, i, a)
}
function p(t, e) {
    var n, r, o, a, c;
    t[e >> 5] |= 128 << e % 32,
        t[14 + (e + 64 >>> 9 << 4)] = e;
    var p = 1732584193
        , h = -271733879
        , d = -1732584194
        , v = 271733878;
    for (n = 0; n < t.length; n += 16)
        r = p,
            o = h,
            a = d,
            c = v,
            p = u(p, h, d, v, t[n], 7, -680876936),
            v = u(v, p, h, d, t[n + 1], 12, -389564586),
            d = u(d, v, p, h, t[n + 2], 17, 606105819),
            h = u(h, d, v, p, t[n + 3], 22, -1044525330),
            p = u(p, h, d, v, t[n + 4], 7, -176418897),
            v = u(v, p, h, d, t[n + 5], 12, 1200080426),
            d = u(d, v, p, h, t[n + 6], 17, -1473231341),
            h = u(h, d, v, p, t[n + 7], 22, -45705983),
            p = u(p, h, d, v, t[n + 8], 7, 1770035416),
            v = u(v, p, h, d, t[n + 9], 12, -1958414417),
            d = u(d, v, p, h, t[n + 10], 17, -42063),
            h = u(h, d, v, p, t[n + 11], 22, -1990404162),
            p = u(p, h, d, v, t[n + 12], 7, 1804603682),
            v = u(v, p, h, d, t[n + 13], 12, -40341101),
            d = u(d, v, p, h, t[n + 14], 17, -1502002290),
            h = u(h, d, v, p, t[n + 15], 22, 1236535329),
            p = s(p, h, d, v, t[n + 1], 5, -165796510),
            v = s(v, p, h, d, t[n + 6], 9, -1069501632),
            d = s(d, v, p, h, t[n + 11], 14, 643717713),
            h = s(h, d, v, p, t[n], 20, -373897302),
            p = s(p, h, d, v, t[n + 5], 5, -701558691),
            v = s(v, p, h, d, t[n + 10], 9, 38016083),
            d = s(d, v, p, h, t[n + 15], 14, -660478335),
            h = s(h, d, v, p, t[n + 4], 20, -405537848),
            p = s(p, h, d, v, t[n + 9], 5, 568446438),
            v = s(v, p, h, d, t[n + 14], 9, -1019803690),
            d = s(d, v, p, h, t[n + 3], 14, -187363961),
            h = s(h, d, v, p, t[n + 8], 20, 1163531501),
            p = s(p, h, d, v, t[n + 13], 5, -1444681467),
            v = s(v, p, h, d, t[n + 2], 9, -51403784),
            d = s(d, v, p, h, t[n + 7], 14, 1735328473),
            h = s(h, d, v, p, t[n + 12], 20, -1926607734),
            p = f(p, h, d, v, t[n + 5], 4, -378558),
            v = f(v, p, h, d, t[n + 8], 11, -2022574463),
            d = f(d, v, p, h, t[n + 11], 16, 1839030562),
            h = f(h, d, v, p, t[n + 14], 23, -35309556),
            p = f(p, h, d, v, t[n + 1], 4, -1530992060),
            v = f(v, p, h, d, t[n + 4], 11, 1272893353),
            d = f(d, v, p, h, t[n + 7], 16, -155497632),
            h = f(h, d, v, p, t[n + 10], 23, -1094730640),
            p = f(p, h, d, v, t[n + 13], 4, 681279174),
            v = f(v, p, h, d, t[n], 11, -358537222),
            d = f(d, v, p, h, t[n + 3], 16, -722521979),
            h = f(h, d, v, p, t[n + 6], 23, 76029189),
            p = f(p, h, d, v, t[n + 9], 4, -640364487),
            v = f(v, p, h, d, t[n + 12], 11, -421815835),
            d = f(d, v, p, h, t[n + 15], 16, 530742520),
            h = f(h, d, v, p, t[n + 2], 23, -995338651),
            p = l(p, h, d, v, t[n], 6, -198630844),
            v = l(v, p, h, d, t[n + 7], 10, 1126891415),
            d = l(d, v, p, h, t[n + 14], 15, -1416354905),
            h = l(h, d, v, p, t[n + 5], 21, -57434055),
            p = l(p, h, d, v, t[n + 12], 6, 1700485571),
            v = l(v, p, h, d, t[n + 3], 10, -1894986606),
            d = l(d, v, p, h, t[n + 10], 15, -1051523),
            h = l(h, d, v, p, t[n + 1], 21, -2054922799),
            p = l(p, h, d, v, t[n + 8], 6, 1873313359),
            v = l(v, p, h, d, t[n + 15], 10, -30611744),
            d = l(d, v, p, h, t[n + 6], 15, -1560198380),
            h = l(h, d, v, p, t[n + 13], 21, 1309151649),
            p = l(p, h, d, v, t[n + 4], 6, -145523070),
            v = l(v, p, h, d, t[n + 11], 10, -1120210379),
            d = l(d, v, p, h, t[n + 2], 15, 718787259),
            h = l(h, d, v, p, t[n + 9], 21, -343485551),
            p = i(p, r),
            h = i(h, o),
            d = i(d, a),
            v = i(v, c);
    return [p, h, d, v]
}
function h(t) {
    var e, n = "", r = 32 * t.length;
    for (e = 0; e < r; e += 8)
        n += String.fromCharCode(t[e >> 5] >>> e % 32 & 255);
    return n
}
function d(t) {
    var e, n = [];
    for (n[(t.length >> 2) - 1] = void 0,
             e = 0; e < n.length; e += 1)
        n[e] = 0;
    var r = 8 * t.length;
    for (e = 0; e < r; e += 8)
        n[e >> 5] |= (255 & t.charCodeAt(e / 8)) << e % 32;
    return n
}

function v(t) {
    return h(p(d(t), 8 * t.length))
}
function y(t, e) {
    var n, r, o = d(t), i = [], a = [];
    for (i[15] = a[15] = void 0,
         o.length > 16 && (o = p(o, 8 * t.length)),
             n = 0; n < 16; n += 1)
        i[n] = 909522486 ^ o[n],
            a[n] = 1549556828 ^ o[n];
    return r = p(i.concat(d(e)), 512 + 8 * e.length),
        h(p(a.concat(r), 640))
}
function g(t) {
    var e, n, r = "0123456789abcdef", o = "";
    for (n = 0; n < t.length; n += 1)
        e = t.charCodeAt(n),
            o += r.charAt(e >>> 4 & 15) + r.charAt(15 & e);
    return o
}
function b(t) {
    return unescape(encodeURIComponent(t))
}
function m(t) {
    return v(b(t))
}

function S(t, e, n) {
    return g(m(t))
}
function getParams(m) {
    var e={}
        ,random1 = Math.floor(Math.random()*10)
        , random2 = Math.floor(Math.random()*(650-500+1))+500
        , random3 = -(Math.floor(Math.random()*(650-500+1))+500)
        , random4 = random1>5?random3:random2;

    e.data = Object.assign(e.data||{},{
        "userName": m.userName,
        "password": getPassword(m)
    })

    var n = (new Date).getTime() - random4
        , t = "s54zv9bm1vd5czfujy6nnuxj1l4g2ny6"
        , r = H()
        , a = S(n + r + S(r + t + n));
    return e.params = Object.assign(e.params || {}, {
        comParam_curTime: n,
        comParam_seqCode: r,
        comParam_signature: a,
    }),
        e
}
console.log(getParams({
        "userName": "qtoc1231@163.com",
        "password": "qaz1234561"
    }))

js代码输出结果:
15

发送登录请求

步骤

1.使用python的execjs调用js代码执行来获取js的方法的返回值,没有的需要先安装

pip install PyExecJS

2.更新python代码中的data和params
3.使用requests库发送登录请求
最终结果:

16

因为这个python代码很简单,这里我就不贴代码了,各位可以自己先试一试。

但是发现个问题,就是这个密码不论发送明文还是密文都能登录成功,搞了半天就当练手了。
密文请求:

17

明文请求:
18

  • 29
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值