声明:本文只作学习研究,禁止用于非法用途,否则后果自负。如果侵权到了您的权益,请立即联系我删除!
前言
这次来分析一下某物得志的请求头参数加密。
目标网站:aHR0cHM6Ly9oNS53YW53dWRlemhpLmNvbQ==
抓包分析
打开主页不断往下翻页,可以看到接口详情中有有几个kl
开头的参数,如图所示。
其中需要重点关注的是kl_sign
,这一看就是加密过的🤔。
加密分析
全局搜索kl_sign
,进到这个位置,_
这个对象里就有请求头里的一些参数。
既然这里定义了_
,那肯定有用到的地方,先在这个switch case
里用到_
的地方都打上断点。
重新进一下页面,程序先断在了上面打的第一个断点位置,然后跳到下一个断点:
不断按F10
向下运行,并观察变量的值,然后发现D
就是kl_sign
的值。
所以只需要分析D
是如何生成的就OK了😋。
28279行代码进行了处理,不好直接看出来,还原出来是这样的:
D = pn['a']['sign'](w, U, N)
这里的w
是时间戳,U
是请求时发送的payload
,而N
就是一个包含kl_path
、kl_trace_id
、kl_device_id
的一个Map
,暂时先不用管怎么弄。
我们进到pn['a']['sign']
方法里看看。
发现它是生成了几个值,然后再传到oe
方法里,我们继续跟到oe
方法里面看看。
最终生成kl_sign
的地方在这里:
将其还原一下,再看就简洁多了。
return ee['SignParamEnums']['AUTHORIZATIONHEADER_ALGORITHM'] + "=" + ee['SignParamEnums'].ALGORITHM + '/' + ee['SignParamEnums']['AUTHORIZATIONHEADER_SIGNEDHEADERS'] + "=" + m['toString']() + '/' + ee['SignParamEnums']['AUTHORIZATIONHEADER_CREDENTIAL'] + '=' + O + "/" + ee['SignParamEnums']['AUTHORIZATIONHEADER_SIGNATURE'] + '=' + _
几个未知的变量,分别是ee
、m
、O
、_
,下面分别进行分析。
-
ee
有2种方法,一种是网上翻,找到定义
ee
的地方,然后下断点,单步进去找到ee
的具体值,另外也可以直接搜索ee
里的属性名。找到
ee
如下:
-
m
m
是在这里定义的,然后将之前传进来的Map
的key
拼接在一起。
-
_
_
是在这里生成的,
这里说起来比较麻烦,就不细说了,逻辑大概就是先将ee['SignParamEnums']['SIGNSECRETKEY'] + ee['SignParamEnums']['SIGNSALT'] + t['signVersion']
拼接起来做个MD5
加密,作为后续2次HMACSHA256
加密的密钥。然后将之前传进来的几个值放到Map
(也就是m
)里,再将之前传进来的payload
做一次HMACSHA256
加密,也放到m
里,然后将m
的键值对拼接起来整体做一次HMACSHA256
加密,得到最终的_
。 -
O
O
是在这里生成的,
还原一下就是:O = t['timestamp'] + "_" + ee['SignParamEnums']['SIGNEDPARAM_END'];
至此,kl_sign
的还原就完了,核心就是1次MD5
和2次HMACSHA256
加密。
还有一个kl_trace_id
,其实这个就是个uuid
,可以直接用网站给的,当然想自己生成也可以。
回到第一个断点的地方,也就是这里。
T
就是kl_trace_id
,将生成T
的代码简化一下,
T = dn['generateUUID']()
进到这个方法里看看,
要还原的话也很简单。
kl_sign
和kl_trace_id
都解决了,接下来就是扣代码或还原的事了。这里扣起来其实还挺麻烦的,还不如直接python
还原来得快🙃。
运行效果:
代码放在github(传送门)了,如果对你有帮助可以点个star🤗。