今天分析的是中国移动的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邮箱的所有的登陆提交的加密数据都已经被解密了