2、139邮箱手机验证码登陆Post登陆分析【Post/Js逆向笔记】

今天分析的是中国移动的139的邮箱,使用的是手机验证码登陆分析

主要瞅一眼,登陆请求时,是由哪些参数加密请求的。

笔记只是作为Js逆向学习而已


1、分析登陆请求的网站

https://mail.10086.cn/

 

2、使用到的工具

1、Chrome浏览器

2、鬼鬼Js调试工具V7.5

 

3、开始分析

测试使用的手机号码为:13188888888

测试使用的验证码为:123456

 打开Chrome浏览器的开发者工具,输入以上的测试手机号码和验证码,在开发者工具上可以获取到数据,注意,需要勾选 log日志留存。因为这个登陆是302跳转的。

 

 

在headers中我们就可以得到Post请求提交的数据。其中在URL提交的参数中也有一些动态的参数数据。通过多次抓包就可以发现。


 通过多次抓包后,不难发现,其中有部分参数是固定值,不会更改

post提交URL中的参数

_fv: 4

cguid: 1505342361157

_: 90414702c39283a6a96cbe4f3ab3e3d1764f8e84

resource: indexLogin


formdata

UserName: 13188888888

passOld: 

webVersion: 25

loginFailureUrl: https://mail.10086.cn/default.html?smsLogin=1

Password: 871d0a9e95aba22b4604224cfba24e605fabbc34

authType: 2

 

会更改的参数为以下几个

post提交URL中的参数

cguid: 1505342361157

_: 90414702c39283a6a96cbe4f3ab3e3d1764f8e84



formdata 表单数据

UserName: 13188888888

Password: 871d0a9e95aba22b4604224cfba24e605fabbc34

 

那么我们首先可以从Password密码算法加密开始进行解密


4、Password解密

在开发者工具中,Ctrl+Shift+F  打开全局搜索。输入 关键词 : Password 

发现了一下搜索到的数据

排除 一些 源码中存在的关键词,css中存在的关键词,我们直接查看由js编写存在的关键词。

在逐个排查后,在570中找到一个可疑的数据点,

 

在这里可以看到,在网页表单中的ID,txtpass  和  txtsms  ,那么大差不差的就应该是在这里进行加密的。

所以在这里进行下断点进行调试查看。

 

开始重新点击登陆调试

 

这个和我们的表单数据一模一样了Password: 871d0a9e95aba22b4604224cfba24e605fabbc34

那么说明,这个就是验证码加密的方法 ,我们就可以移动到这个clacDigest函数上,点击进入

然后把这个函数给“扣”下来,放入鬼鬼调试工具中测试

        (function() {
            function a(a, c) {
                var d = (a & 65535) + (c & 65535);
                return (a >> 16) + (c >> 16) + (d >> 16) << 16 | d & 65535
            }
            window.calcDigest = function(b) {
                for (var c = (b.length + 8 >> 6) + 1, d = Array(16 * c), e = 0; e < 16 * c; e++)
                    d[e] = 0;
                for (e = 0; e < b.length; e++)
                    d[e >> 2] |= b.charCodeAt(e) << 24 - 8 * (e & 3);
                d[e >> 2] |= 128 << 24 - 8 * (e & 3);
                d[16 * c - 1] = 8 * b.length;
                b = Array(80);
                for (var c = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < d.length; h += 16) {
                    for (var l = c, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {
                        b[j] = 16 > j ? d[h + j] : (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) << 1 | (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) >>> 31;
                        var r = a(a(c << 5 | c >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), a(a(k, b[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514))
                          , k = g
                          , g = f
                          , f = e << 30 | e >>> 2
                          , e = c
                          , c = r
                    }
                    c = a(c, l);
                    e = a(e, m);
                    f = a(f, n);
                    g = a(g, p);
                    k = a(k, q)
                }
                d = [c, e, f, g, k];
                b = "";
                for (c = 0; c < 4 * d.length; c++)
                    b += "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) + 4 & 15) + "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) & 15);
                return b
            }
        }
        )();

这个应该是一个匿名函数,删除不需要的东西


            function a(a, c) {
                var d = (a & 65535) + (c & 65535);
                return (a >> 16) + (c >> 16) + (d >> 16) << 16 | d & 65535
            }
            calcDigest = function(b) {
                for (var c = (b.length + 8 >> 6) + 1, d = Array(16 * c), e = 0; e < 16 * c; e++)
                    d[e] = 0;
                for (e = 0; e < b.length; e++)
                    d[e >> 2] |= b.charCodeAt(e) << 24 - 8 * (e & 3);
                d[e >> 2] |= 128 << 24 - 8 * (e & 3);
                d[16 * c - 1] = 8 * b.length;
                b = Array(80);
                for (var c = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < d.length; h += 16) {
                    for (var l = c, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {
                        b[j] = 16 > j ? d[h + j] : (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) << 1 | (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) >>> 31;
                        var r = a(a(c << 5 | c >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), a(a(k, b[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514))
                          , k = g
                          , g = f
                          , f = e << 30 | e >>> 2
                          , e = c
                          , c = r
                    }
                    c = a(c, l);
                    e = a(e, m);
                    f = a(f, n);
                    g = a(g, p);
                    k = a(k, q)
                }
                d = [c, e, f, g, k];
                b = "";
                for (c = 0; c < 4 * d.length; c++)
                    b += "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) + 4 & 15) + "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) & 15);
                return b
            }

在鬼鬼调试工具中测试一下,测试成功

 

然后我们看一下,验证码的的整体的算法加密的是怎么样的

a.value = c.calcDigest("fetion.com.cn:" + $E("txtSms").value),

也就是说  验证码最终的算法是     字符串 "fetion.com.cn:" + 验证码 “123456” 的拼接,然后去通过 函数 clacDigest 计算得到的

我们在鬼鬼调试工具中 加上  字符串 "fetion.com.cn:" 

这个时候 就和我们的 Password 一样了。那么至此,Password 的解密就完成了


5、cguid的解密

一样的道理,在全局搜索中 关键词搜索 cguid    得到一堆的 搜索数据

 其中 这个红框圈中的 尤为显眼,点击进入查看一下 

https://mail.10086.cn/Login/Login.ashx?smsLogin=1&s=0&v=0&u=MTMxODg4ODg4ODg=&m=35&ec=S035&resource=indexLogin&cguid=1533448729729&mtime=19&_fv=4&_=90414702c39283a6a96cbe4f3ab3e3d1764f8e84&resource=indexLogin

其实看一下,其中的 红框这一段,就很像 post请求 构造的 请求 URL ,但是我们是验证码登陆的,这个明显不是,继续找全局搜索的 发现了一个

 

这里有一个 sms 的验证码的关键词,那么可以点击进入看一下  ,还是这个 getCGUID 函数在做事情,那么我们就可以尝试的试一下。

进入函数中查看,貌似就是一个时间戳生成加上4位的随机数生成。

在console面板中测试一下啊,果然就是,那么可以在python中,直接取时间戳就行,麻烦一点就是扣一下代码放入鬼鬼调试工具里面测试

效果也是一样的。那么至此,cguid 的参数问题 也解决了


6、_:参数的解密

 

其实在一般情况下,加密的一些参数,写的代码往往都是非常的相近的。这个是刚才找password加密的地方,上面这个 FormAction就是 提交的URL参数

其中里面有一个非常显眼的关键词  Sha1  算法。

那么还是一样,猜测一下,_:可能就是 通过sha1 算法进行加密的。

那么我们就首先需要知道  sha1里面 这个 a.value是什么值

重新断点调试后,定位到 sha1 里面的值

就是我们的手机号码,那么就简单了。sha1 目前直接有现成的算法库的,直接可以调用。当然也是跟上面一样扣代码

            sha1: function(a) {
                function b(a, b) {
                    var c = (a & 65535) + (b & 65535);
                    return (a >> 16) + (b >> 16) + (c >> 16) << 16 | c & 65535
                }
                for (var c = [], d = 0; d < 8 * a.length; d += 8)
                    c[d >> 5] |= (a.charCodeAt(d / 8) & 255) << 24 - d % 32;
                a = 8 * a.length;
                c[a >> 5] |= 128 << 24 - a % 32;
                c[(a + 64 >> 9 << 4) + 15] = a;
                a = Array(80);
                for (var d = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < c.length; h += 16) {
                    for (var l = d, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {
                        a[j] = 16 > j ? c[h + j] : (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^ a[j - 16]) << 1 | (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^ a[j - 16]) >>> 31;
                        var r = b(b(d << 5 | d >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), b(b(k, a[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514))
                          , k = g
                          , g = f
                          , f = e << 30 | e >>> 2
                          , e = d
                          , d = r
                    }
                    d = b(d, l);
                    e = b(e, m);
                    f = b(f, n);
                    g = b(g, p);
                    k = b(k, q)
                }
                c = [d, e, f, g, k];
                a = "";
                for (d = 0; d < 4 * c.length; d++)
                    a += "0123456789abcdef".charAt(c[d >> 2] >> 8 * (3 - d % 4) + 4 & 15) + "0123456789abcdef".charAt(c[d >> 2] >> 8 * (3 - d % 4) & 15);
                return a
            }

扣完代码,放入鬼鬼调试工具里面测试,和headers 请求的数据一模一样


当然你可以用一些工具提供的sha1 现成函数就行。

得到的加密数据也是一样的。

 


至此 139邮箱的所有的登陆提交的加密数据都已经被解密了

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Kotlin/JS中,可以使用JavaScript的原生XMLHttpRequest对象来发送GET和POST请求。以下是一个简单的示例: 首先,需要在Gradle中添加以下依赖: ```groovy implementation 'org.jetbrains.kotlin:kotlin-stdlib-js' ``` 然后,可以编写一个包含发送GET和POST请求的类: ```kotlin import org.w3c.xhr.XMLHttpRequest import kotlin.js.json class Http { companion object { fun get(url: String, callback: (String) -> Unit) { val xhr = XMLHttpRequest() xhr.open("GET", url) xhr.onload = { if (xhr.status == 200.toShort()) { callback(xhr.responseText) } else { // handle error } } xhr.send() } fun post(url: String, data: Map<String, String>, callback: (String) -> Unit) { val xhr = XMLHttpRequest() xhr.open("POST", url) xhr.setRequestHeader("Content-Type", "application/json") xhr.onload = { if (xhr.status == 200.toShort()) { callback(xhr.responseText) } else { // handle error } } xhr.send(JSON.stringify(data)) } } } ``` 这个类包含两个静态方法:`get`和`post`。这些方法接受一个URL和一个回调函数。在回调函数中,可以处理服务器响应。 要发送GET请求,可以使用以下代码: ```kotlin Http.get("https://example.com/api/data", { response -> console.log(response) }) ``` 要发送POST请求,可以使用以下代码: ```kotlin val data = mapOf("name" to "John", "age" to "30") Http.post("https://example.com/api/data", data, { response -> console.log(response) }) ``` 在这个示例中,POST请求发送了一个包含"name"和"age"字段的JSON对象。服务器可以使用这些值来处理请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值