记一次Js-Forward绕双重签名校验
背景: 某客户系统,数据包存在header和body的双重签名校验,并且参数为乱序,即使还原了签名算法也可能使得签名的结果不一致,此时用到了Js-forward工具以转发明文参数和参数值,而此系统请求和响应调用不在一个函数中,如果还原加密的请求和响应需要插入两处,一个负责转发请求,一个转发响应,可实现绕过签名的同时抓取明文的请求和响应包(此处系统请求响应的数据包均为明文,即只需要抓取请求即可,不需要抓明文响应,但为了深入学习研究也一并实现了)
工具链接: https://github.com/G-Security-Team/JS-Forward
数据包:

数据包的header和body均存在签名校验
断点:
此处为乱序跟数据包排序不一致:

如果还原算法,但排序为混乱,拼接生成的结果会不一致
此处改用JS转发的思路(本质上是修改作用域,但转发更方便直观):
找一个还没生成nonce和timestamp和sign的地方(因为如果生成了以上三个,再去改参数值将会报签名错误,所以要在还没生成之前拦截才有意义):

此处有个beforesign

此处使用js-forward工具插入转发代码,只取e中的data,所以参数为e.data

得到payload后插入上方:


此处触发功能,成功捕获到明文,但返回包还没捕获,这里这个网站请求和返回写到两个不同的地方去了所以不能直接拿到返回数据
继续断点找到出现返回包的地方:

此处也是e.data,再插入一个转发代码:

标识为RESPONSE

此时返回包也捕获了:

由于是先前端传入到服务器得到返回数据,然后再继续把返回数据传回给前端,所以第二个为代理抓的真实发送到服务器的数据包:

至此只要修改第一个request的包第二个数据包的内容就会相应改变,并且会自动生成签名
此处拿密码修改功能举例,拦截修改第一个包:

将此处password改为123321
第二个包:

此处已经发生了变化
第三个包:

此时并不会提示签名错误,证明签名成功绕过,至此后续可拦截修改数据包以渗透测试(此方法只适用于直接拦截修改数据包,无法使用repeater进行重复发包,因为其不能调用前端JS代码去生成相应的签名并发包且获取返回包)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 做 讓 人 远 远 聽 見 的 風!
评论