| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 对飞猪H5端API接口sign签名逆向实验 -> 正文阅读 |
|
[系统运维]对飞猪H5端API接口sign签名逆向实验 |
0x01 前言研究飞猪旅行HTML5端sign签名过程,以复刻sign签名过程为手段,以查询酒店价格为目标,以学习技术要点、思路以及如何防范为宗旨,展开对飞猪H5端API接口sign签名的研究。 0x02 寻突破口捕获目标API请求数据包使用浏览器 使用 分析数据包Payload除了sign签名的一串看似md5密文但实际上又不是md5密文的字段以外,其他字段都很好理解。但如果除了sign签名字段以外的其他字段修改后,sign签名也必须跟着改动,并且是以一个
定位sign签名位置需要找到sign签名的运算函数,首先得找到sign签名字符串在哪里赋的值。定位某个请求参数赋值的方法有很多种,有做hook的、有Ctrl+Shift+F的、有用XHR断点的,等等非常多的方法,而且有一些复杂的网站往往需要将这些方法组合使用才能找到某个参数的赋值位置,而在本项目,直接使用
现在,尝试使用全局搜索 可以看到有三条疑似给sign签名赋值的三个js文件,这时候需要根据逆向经验去猜测源码应该会使用哪个去进行sign签名的赋值和加密。但如果没有逆向经验的判断,也可以对搜索出来的三个js文件可疑的代码段进行同时断点,逐个查看分析。 其实可以在 在8548行做一个断点,重新刷新页面,让前端重新请求一个数据包并把它断点截获。 0x03 顺藤摸瓜寻加密入口断点被捕获后,在 显然,这里的变量 分析方法
|
参数名 | 值 | 解释 |
---|---|---|
n | af5ea7aa071afc99d96745743d3634d0 | _m_h5_tk 值的左边 |
t | 1641959319288 | 时间戳 |
r | 12574478 | appKey |
e | {"_fli_newpage":"1","hid":"0","adultNum":2,"shid":1002342 ...... | 真正要传的请求数据文本 |
使用.join("&")
将四个变量的值用"&"
连接在一起,传送给方法d()
使用单步执行进入方法d()
内部,发现其传参变量为e
,其内容为:
“af5ea7aa071afc99d96745743d3634d0&1641959319288&12574478&{”_fli_newpage":“1”,“hid”:“0”,“adultNum”:2,“shid”:1002342 …
由于篇幅问题,不将变量e
的值全部展开查看,但可以发现,确实是由以上表格的四个值用"&"
拼接起来的。
// 方法d()的内部
d = (r = function(e, t) {
return e << t | e >>> 32 - t
}
,
i = function(e, t) {
var n, r, i, o, a;
return i = 2147483648 & e,
o = 2147483648 & t,
a = (1073741823 & e) + (1073741823 & t),
(n = 1073741824 & e) & (r = 1073741824 & t) ? 2147483648 ^ a ^ i ^ o : n | r ? 1073741824 & a ? 3221225472 ^ a ^ i ^ o : 1073741824 ^ a ^ i ^ o : a ^ i ^ o
}
,
o = function(e, t, n, o, a, s, c) {
return e = i(e, i(i(function(e, t, n) {
return e & t | ~e & n
}(t, n, o), a), c)),
i(r(e, s), t)
}
,
a = function(e, t, n, o, a, s, c) {
return e = i(e, i(i(function(e, t, n) {
return e & n | t & ~n
}(t, n, o), a), c)),
i(r(e, s), t)
}
,
s = function(e, t, n, o, a, s, c) {
return e = i(e, i(i(function(e, t, n) {
return e ^ t ^ n
}(t, n, o), a), c)),
i(r(e, s), t)
}
,
c = function(e, t, n, o, a, s, c) {
return e = i(e, i(i(function(e, t, n) {
return t ^ (e | ~n)
}(t, n, o), a), c)),
i(r(e, s), t)
}
,
u = function(e) {
var t, n = "", r = "";
for (t = 0; t <= 3; t++)
n += (r = "0" + (e >>> 8 * t & 255).toString(16)).substr(r.length - 2, 2);
return n
}
,
function(e) {
var t, n, r, l, p, f, d, h, g, m;
for (e = function(e) {
e = e.replace(/\r\n/g, "\n");
for (var t = "", n = 0; n < e.length; n++) {
var r = e.charCodeAt(n);
r < 128 ? t += String.fromCharCode(r) : r > 127 && r < 2048 ? (t += String.fromCharCode(r >> 6 | 192),
t += String.fromCharCode(63 & r | 128)) : (t += String.fromCharCode(r >> 12 | 224),
t += String.fromCharCode(r >> 6 & 63 | 128),
t += String.fromCharCode(63 & r | 128))
}
return t
}(e),
t = function(e) {
for (var t, n = e.length, r = n + 8, i = 16 * ((r - r % 64) / 64 + 1), o = new Array(i - 1), a = 0, s = 0; s < n; )
a = s % 4 * 8,
o[t = (s - s % 4) / 4] = o[t] | e.charCodeAt(s) << a,
s++;
return a = s % 4 * 8,
o[t = (s - s % 4) / 4] = o[t] | 128 << a,
o[i - 2] = n << 3,
o[i - 1] = n >>> 29,
o
}(e),
d = 1732584193,
h = 4023233417,
g = 2562383102,
m = 271733878,
n = 0; n < t.length; n += 16)
r = d,
l = h,
p = g,
f = m,
d = o(d, h, g, m, t[n + 0], 7, 3614090360),
m = o(m, d, h, g, t[n + 1], 12, 3905402710),
g = o(g, m, d, h, t[n + 2], 17, 606105819),
h = o(h, g, m, d, t[n + 3], 22, 3250441966),
d = o(d, h, g, m, t[n + 4], 7, 4118548399),
m = o(m, d, h, g, t[n + 5], 12, 1200080426),
g = o(g, m, d, h, t[n + 6], 17, 2821735955),
h = o(h, g, m, d, t[n + 7], 22, 4249261313),
d = o(d, h, g, m, t[n + 8], 7, 1770035416),
m = o(m, d, h, g, t[n + 9], 12, 2336552879),
g = o(g, m, d, h, t[n + 10], 17, 4294925233),
h = o(h, g, m, d, t[n + 11], 22, 2304563134),
d = o(d, h, g, m, t[n + 12], 7, 1804603682),
m = o(m, d, h, g, t[n + 13], 12, 4254626195),
g = o(g, m, d, h, t[n + 14], 17, 2792965006),
h = o(h, g, m, d, t[n + 15], 22, 1236535329),
d = a(d, h, g, m, t[n + 1], 5, 4129170786),
m = a(m, d, h, g, t[n + 6], 9, 3225465664),
g = a(g, m, d, h, t[n + 11], 14, 643717713),
h = a(h, g, m, d, t[n + 0], 20, 3921069994),
d = a(d, h, g, m, t[n + 5], 5, 3593408605),
m = a(m, d, h, g, t[n + 10], 9, 38016083),
g = a(g, m, d, h, t[n + 15], 14, 3634488961),
h = a(h, g, m, d, t[n + 4], 20, 3889429448),
d = a(d, h, g, m, t[n + 9], 5, 568446438),
m = a(m, d, h, g, t[n + 14], 9, 3275163606),
g = a(g, m, d, h, t[n + 3], 14, 4107603335),
h = a(h, g, m, d, t[n + 8], 20, 1163531501),
d = a(d, h, g, m, t[n + 13], 5, 2850285829),
m = a(m, d, h, g, t[n + 2], 9, 4243563512),
g = a(g, m, d, h, t[n + 7], 14, 1735328473),
h = a(h, g, m, d, t[n + 12], 20, 2368359562),
d = s(d, h, g, m, t[n + 5], 4, 4294588738),
m = s(m, d, h, g, t[n + 8], 11, 2272392833),
g = s(g, m, d, h, t[n + 11], 16, 1839030562),
h = s(h, g, m, d, t[n + 14], 23, 4259657740),
d = s(d, h, g, m, t[n + 1], 4, 2763975236),
m = s(m, d, h, g, t[n + 4], 11, 1272893353),
g = s(g, m, d, h, t[n + 7], 16, 4139469664),
h = s(h, g, m, d, t[n + 10], 23, 3200236656),
d = s(d, h, g, m, t[n + 13], 4, 681279174),
m = s(m, d, h, g, t[n + 0], 11, 3936430074),
g = s(g, m, d, h, t[n + 3], 16, 3572445317),
h = s(h, g, m, d, t[n + 6], 23, 76029189),
d = s(d, h, g, m, t[n + 9], 4, 3654602809),
m = s(m, d, h, g, t[n + 12], 11, 3873151461),
g = s(g, m, d, h, t[n + 15], 16, 530742520),
h = s(h, g, m, d, t[n + 2], 23, 3299628645),
d = c(d, h, g, m, t[n + 0], 6, 4096336452),
m = c(m, d, h, g, t[n + 7], 10, 1126891415),
g = c(g, m, d, h, t[n + 14], 15, 2878612391),
h = c(h, g, m, d, t[n + 5], 21, 4237533241),
d = c(d, h, g, m, t[n + 12], 6, 1700485571),
m = c(m, d, h, g, t[n + 3], 10, 2399980690),
g = c(g, m, d, h, t[n + 10], 15, 4293915773),
h = c(h, g, m, d, t[n + 1], 21, 2240044497),
d = c(d, h, g, m, t[n + 8], 6, 1873313359),
m = c(m, d, h, g, t[n + 15], 10, 4264355552),
g = c(g, m, d, h, t[n + 6], 15, 2734768916),
h = c(h, g, m, d, t[n + 13], 21, 1309151649),
d = c(d, h, g, m, t[n + 4], 6, 4149444226),
m = c(m, d, h, g, t[n + 11], 10, 3174756917),
g = c(g, m, d, h, t[n + 2], 15, 718787259),
h = c(h, g, m, d, t[n + 9], 21, 3951481745),
d = i(d, r),
h = i(h, l),
g = i(g, p),
m = i(m, f);
return (u(d) + u(h) + u(g) + u(m)).toLowerCase()
})
至此,加密入口已暴露出来了,即方法d
。
sign签名方法已经拿到手,接下来当然是要验证它是否可用。
在Sources(源代码)
选项卡左侧的Snippets(代码片段)
Tab页中新增一个代码片段,将sign签名方法复制到里面将其保存,并且复制将4个关键参数传入到方法中,然后点击运行(Ctrl+Enter)
。
重新发送一个请求,然后将H5端真实发送的四个参数的值分别复制到自定义参数中,查看H5端生成的sign值是否与自己新建的代码片段运行的值是一致的,若是一致的则表示该sign签名函数可被使用。
可以看见飞猪H5端产生的sign值与自定义产生的sign值是一致的,都是fd232f8836d8713c277215d71f43820c
,说明我们找到的sign签名加密函数是正确的。
该篇讲述如何使用浏览器F12开发者工具
对一个加密函数的定位与寻找思路,作者强烈反对大家使用该技术进行实质性地爬虫以及其他形式的利用。
请时刻牢记:谁把法律当儿戏,谁就必然亡于法律。
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 6:24:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |