一,前言
网站:aHR0cHM6Ly93d3cucWNjLmNvbS9tYXA/a2V5Tm89MmQ3NjUyOWY0ZDk5ODdiZjdiNDk2NzcwYWE5ZGRlZmM=
分析的加密接口:aHR0cHM6Ly93d3cucWNjLmNvbS9hcGkvY29tcGFueS9nZXRMb2NhdGlvbj9rZXlObz0yZDc2NTI5ZjRkOTk4N2JmN2I0OTY3NzBhYTlkZGVmYwo=
二,网站分析
使用chrome浏览器打开指定网站,打开检查,选择网络,搜索加密接口关键词getLocation可看到对应的接口信息,我们可以可以发现随着请求而变化的数据仅有 headers 里的一对键值,且后台也仅对该变动键值做了二次校验。由于其看起来很像 Hash,索性就叫 hashKey:hashValue。

通过网络请求调用堆栈并没有发现相关的赋值代码,于是便想从代码搜索入手。例如此场景在 js 中的赋值语句通常为 headers[key] = value,搜索 headers[ 即可。
遂查看其网页源代码,发现 JavaScript 脚本文件都集中在路径 //xxxx-static.xxxx.com/qcc/pc-web/prod-25.03.47/ 中
搜索后发现此处最为可疑:
在此断点调试看一下:
很明显可以发现,其临时变量 i 就是 hashKey,u则是 hashValue:
// 源代码
var i = (0,a.default)(t, e.data),
u = (0,r.default)(t, e.data, (0,s.default)());
e.headers[i] = u;
// 其中
t = '/api/company/getLocation?keyNo=xxxxxxxxxxxxxxxxxxx';
e.data = null
(0,s.default)() = window.tid;
由此,我们只需要查看 a.default 与 r.default 的函数即可知道其哈希值的生成方法。
首先是生成 hashKey 的函数 a.default,通过多次断点,发现其调用堆栈如下:
// 第一层 a.default
function() {
// t=请求URL,e=请求对象,n=请求对象json
var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
, t = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase()
, n = JSON.stringify(e).toLowerCase();
// o.default 加密函数在最后提到
return (0, o.default)(t + n, (0, a.default)(t))
.toLowerCase().substr(8, 20)
};
// 第二层 a.default
function() {
for (var e = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase(), t = e + e, n = "", i = 0; i < t.length; ++i) {
var a = t[i].charCodeAt() % o.default.n;
// 并非最后的加密函数 o.default
n += o.default.codes[a]
}
return n
};
// 第二层 a.default 中的 o.default
o.default = {
"n": 20,
"codes": {
"0": "W",
"1": "l",
"2": "k",
"3": "B",
"4": "Q",
"5": "g",
"6": "f",
"7": "i",
"8": "i",
"9": "r",
"10": "v",
"11": "6",
"12": "A",
"13": "K",
"14": "N",
"15": "k",
"16": "4",
"17": "L",
"18": "1",
"19": "8"
}
};
其次是 r.default:
function() {
// n=请求URL,e=请求对象,t=tid,i=请求对象json
var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}
, t = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : ""
, n = (arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "/").toLowerCase()
, i = JSON.stringify(e).toLowerCase();
// o.default 加密函数在最后提到
// a.default 即为刚提到的第二层函数
return (0, o.default)(n + "pathString" + i + t, (0, a.default)(n))
};
其中,两个函数都调用了同一个 o.default,其堆栈如下:
// 第一层 o.default
function(e, t) {
return (0, o.default)(e, t).toString()
};
// 第二层 o.default
return function(e, n) {
// h 对象就是一个库,使用的 HMAC SHA512 加密算法
// input:[e],key:[n]
// 在线加密:https://www.idcd.com/tool/encrypt/hmac
return new h.HMAC.init(t,n).finalize(e)
}
三,Ruby爬虫代码实现
使用代码成功获取正确IP信息


通过以上步骤,您可以顺利完成网站的测试过程。如果您在操作过程中遇到任何问题,或需要进一步的帮助,欢迎您在平台私信我,我会尽快为您解答。
4411

被折叠的 条评论
为什么被折叠?



