上:
写文章用于个人记录与分享。第一次记录写得详细一点。本文对xx同城的登录做逆向分析与简单实现。
目标网址:aHR0cHM6Ly9wYXNzcG9ydC41OC5jb20vbG9naW4v(大佬们的文章都这么写b64一下)
中:
首先打开chrome,ctrl+shift+N打开无痕模式,F12打开控制台,进入目标网址,输入账号密码(错误密码)登录,抓包分析;
找到post登录的请求;再用其它浏览器同样操作一遍抓包对比携带参数;
username就是用户名;password就是加密后的密码;然后就是token、path和fingerprint这三个参数在变,其它都没有变;一个一个来。
ctrl+shift+F全局搜索password;
结果有点多,我是慢慢找下来找到的(mobilelogin这个js)。大佬们肯定有更好的办法。点进去,格式化,ctrl+F再搜索password;
依然很多,还是慢慢找
找到可疑的位置,下面有几个差不多也是这样的可以都打上断点试试;
(然后发现就是这第一处826行)
再点击一遍登录,断到了;
追进去找到了这个encrypt函数,e就是输入的密码;先把函数粘到webstorm;这里已经写着是rsa哈,那两个rsa的值就是加密的模数和模量;一般都是固定的,有的会写死在js里或者是HTML里,这里是请求来的;
了解大体逻辑我们就可以改写一下这个函数;
get_password = function(password) {
var rsaExponent = '010001';
var rsaModulus = "008baf14121377fc76eaf7794b8a8af17085628c3590df47e6534574efcfd81ef8635fcdc67d141c15f51649a89533df0db839331e30b8f8e4440ebf7ccbcc494f4ba18e9f492534b8aafc1b1057429ac851d3d9eb66e86fce1b04527c7b95a2431b07ea277cde2365876e2733325df04389a9d891c5d36b7bc752140db74cb69f";
var i = 1411093327735 - (new Date).getTime();
var o = (new Date).getTime() + i;
return encryptString(o + encodeURIComponent(password), rsaExponent, rsaModulus)
};
现在还缺这个encryptString函数;缺啥补啥;继续追进去慢慢看;
发现这些调用的函数都在这个ppt_security的js里,这也就四百多行,直接全部抠走;
运行一哈缺window,开头加上 var window = this;
再运行一哈缺RSAUtils,先加上 var RSAUtils = {}; 试试。
完事;
然后是token;我们可以看看rsa请求上面的那个长的挺像的那个请求;
发现token就躺在里面;
不过这也要搞定这两个参数才能拿得到;
全局搜索path,发现就在html里,可以直接把值放里面搜;(当时我还在js里找了半天找不到还去问了卞大佬)
其实也可以发现path的值就是https%3A%2F%2Ffz.58.com%2F%3Fpts%3D + 13位时间戳;
然后就是callback;观察可以发现这个参数也是JsonpCallBack + 一串数字,不过这并不是简单的时间戳;
所有我们可以直接搜"JsonpCallBack" +;
发现依然是这个js;进去搜发现有两处,两处都打上;(104行和1392行)
都打上断点刷新页面就会重新发送请求,果然进入了断点;
分析一下生成逻辑就是这个啦;
"JsonpCallBack" + (new Date).getTime() + Math.floor(1e3 * Math.random())
可以直接用python改写;懒就直接js生成;
现在我们就只剩下最后一个fingerprint啦;
一搜fingerprint和finger2都出来了;不过这两个只是定义的js;
(慢慢摸索出来的)
先进去fingerprint在可疑的地方都打上断点,刷新页面;
断到的是getnew这里;
调用它的js在右边调用栈慢慢看;又是那个mobilelogin的js;
点进去看看,意外发现了finger2;
点进去瞅一眼;
生成逻辑就在第189行;有空可以慢慢研究一下;我看了前面几项是网页浏览器的一些基本属性,地区语言分辨率什么的;反正最后会生成出一个固定的值;(不同浏览器和不同设备值都会不同,这就是指纹吧)
回到fingerprint,这里我们只需要了解它的生成逻辑就好了;
可知fingerprint就是正则匹配的finger_session这个cookie的值;
所以我们只要知道这个cookie怎么来的就完事啦;
找cookie大佬们都用的hook cookie;不会的就慢慢在请求里找cookie是什么时候出来的;(我就是)
这里要重新打开一个无痕浏览器才能找到那个请求;
就是你啦;还需要带着finger2和callback去请求就能获得那两个finger的cookie啦;
收工;
下:
总结一下整个登录逻辑:请求获取path→js生成password和callback→请求获取token→请求获取cookie得到fingerprint→模拟请求携带参数post登录。
技术难度不高;要了解弄清楚整个逻辑还是要花点时间。
我踩的坑就是登录过多会出现需要手机或者邮箱验证的情况,当时一直以为是我代码问题,后面手动在网页用验证码登一遍就好了;
完整代码:https://github.com/WhySoFoolish/js-/tree/main/58%E5%90%8C%E5%9F%8E