项目地址:aHR0cHM6Ly93d3cuemhpaHUuY29tL3NpZ25pbj9uZXh0PSUyRg==
观前提示:
本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除
1.参数定位
启动抓包,输出参数并点击登录找到 oauth/sign_in 关键字眼的包可以看到
POST的Form Data是被加密过的,那么我们可以通过全局搜索URL的oauth/sign_in 关键字眼找到
点击进去 在关键位置打上断点
到这里发现数据还是处于未加密状态
接着往下跟发现跟了很久也没跟到 那我们不能在一棵树上吊死是吧 得换一种思路 那回到最初断点的位置找找有没有特别的关键字 发现 zsEncrypt 这个就很可疑了 CTRL+F页面搜索一下 出现了几十个结果 一个一个往下看 如果你不清楚哪个是你需要的就在可疑的位置打上断点 然后在调试
到了这里就非常可疑 断点打上 然后再进行一次发包操作
进行了一次操作后断了下来了 明文也肉眼可见了 就证明我们断的位置正确了
那接着继续步进当我们到了下面位置的时候发现明文a被重写了一遍 变成了密文 那整个逻辑就很明了了 这里就是我们的加密位置 如果不确定的话可以控制台输出a的密文和发包密文对比 也是一模一样的
(a = (0, r.default)(a)
继续跟进去加密位置 加密位置就出来了
接下来就是扣Js和改写Js的操作
2.扣出和改写
我们现在需要把整个加密函数给扣出来 整体扣取有一个小技巧 可以在末端的花括号点击一下变成灰色
然后再去往上找也有一个花括号变成灰色 这中间就是一整个完整的函数了
将Js复制粘贴到调试器 接下来就是Js改写步骤了运行Js根据控制台输出的错误进行相对应的修改 去变量 改自执行 导出函数
改完之后运行Js提示atob is not defined 就是node环境没有atob这个东西那缺啥补啥就行啦 补完之后再运行 结果就出来了
感谢您的观看
不会吧 不会吧 你真的以为某乎就这样一点坑都没有吧
回到浏览器调试我们输出同样的加密明文看输出密文
node输出:a0F0rAFX
浏览器输出:BTY0
对不上 那咋办
还能咋办 一步一步调呗
但是新手才会这样做 还费肝
我们运行Js的时候提示我们缺少navigator 但是在Js代码里面并没有出现这个东西
事情逐渐蹊跷 这这这这不是和tou条一个德行的嘛 逻辑混淆
那咋整呢 逻辑混淆肯定有取值 赋值的操作存在的 通常也会伴随
eval apply call Function等字眼的出现 那我们咋办呢
其实 很很简单的 肝就完事了
回到浏览器中找到这段加密位置 凭经验找关键字眼 那就有人问了 我没有经验我怎么看出来哪个是哪个? 很好 那你问到点上了 跟着看 跟着学
主要加密代码就四百多行 从头看到尾 注意看关键字眼 那些位操作就基本可以忽略啦
这 这 这不就是我刚刚说的eval了嘛 断点打上 测试一波
呕吼 好家伙 不愧是我 一下子就断对了
那这里就有人问了 断这里有啥用呀
诶嘿 问得好 要知道 我们浏览器和node的环境是有差别的 既然这个代码能在我们的node环境运行得出结果 但是拿到的值却和浏览器的值不相同 那我们是不是要考虑一下 哪里出了问题呢 既然我们找到了操作位置 那我们接下来就可以进行插桩操作了
什么是插桩?
其实就是console
插好桩了之后呢我们就可以取出代码放浏览器调试啦
这是浏览器插桩输出的结果
这是浏览器输出的结果
一项一项对比发现 浏览器的123并没有增加奇怪的字符 长度3正常
而node环境的123被加上了奇奇怪怪的字符 长度变成5 和 6
也许 我们发现了问题所在既然 他修改了我们的字符 那我们就强制还原为正常的明文
详细的你们在这个位置进行插桩调试便知
下面说说我的做法:
首先呢 检测了navigator的userAgent 补上就是了
window.navigator={ userAgent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3766.400 QQBrowser/10.6.4163.400" };
if(t=="length"){ A.k[0]=A.k[0].slice(1); A.r[0]=A.k[0]; };
先判断t是不是length我们需要修改的属性然后在进行修改 运行输出一下
结果很相近了 但是结果还是不正确 回到原来的地方输出一下
console.log("取出",A.r[this.c],"的",t,"结果",A.r[this.c][t]);
发现 wocao 代码被slice了俩次 原文被改变了 那可不行 那简单 加个判断就行了
首先 在头部定义一个东西 随便一个名字就行
var xxx =false;
然后 在if里面加上判断即可(当然 其他方法判断也是可以的 不限于这种笨方法)
if(t=="length" && xxx==false){ xxx=true; A.k[0]=A.k[0].slice(1); A.r[0]=A.k[0]; };
改好之后我们再输出一下结果
再算一个真实参数的密文和浏览器的对比一下看看
好了 到此 才算是真正的结束啦