58同城的前端登陆js处理还有很有自己的特色的,藏匿了关键的js语句、同时混插了html源码和js,搜索关键词基本上都是html源码,但是还有事方法还原post参数的来源,下面我们一步步分析。
首先抓个post包看看有哪些参数
source: passportpassword: 42ef99ddfcfed534a8c9f9745d853451802ec173ff6b39914e219912ca90942130fe0fd220e7aa6d29e67ff29b6ec038f8f489c542ae544dea172aa7a54ad3dd560c7d1d20ce3289d1015cd7839c0d3d9fc7574be3d6fa53c84270c6aa0f8ffd436ced4a2434dc4b95e7e21b5bae4ea180580fa6db483dbb2aa8dc87f0b8ace4timesign: isremember: falsecallback: successFunyzmstate: fingerprint: 745425B5EABE10D036C02171090EC40FC1D13ECB0F632851_011path: https://cd.58.com/?pts=1547035234514finger2: zh-CN|24|1|4|1366_768|1366_728|-480|1|1|1|undefined|1|unknown|Win32|unknown|3|false|false|false|false|false|0_false_false|d41d8cd98f00b204e9800998ecf8427e|d21717e01c541ae877c90b4be8200041username: 18328491111validcode: vcodekey: btnSubmit: 登录中...
就从这个包我们可以大致分析一下:
password是RSA加密的样子,需要分析
fingerprint像一个身份ID,需要分析
path像一个固定字符串加上时间戳,不需要分析
finger2感觉像浏览器的一些环境信息可以做固定值,不需要分析
明确我们需要分析两个字段password、fingerprint
全局搜索一下password关键词,看看那些地方出现过
只有上面两处很可疑,但是很明显难以顺藤摸瓜了,尝试了很多关键词以后,没有结果,然后在看网站文件结构倒还发现了一些东西。
login文件夹下有个rsa的文件,那很明显就是密码加密所用的RSA了,打开看看
果然不简单eval开头,在看看这js文件内容:
关键信息都是编码了的,无法直接搜索,先eval解密,解密之后就很好辨认了
再看eval解密后的js文件尾部,有下面一个函数
function encryptString(str, e, m) { var key = RSAUtils.getKeyPair(e, '', m); return RSAUtils.encryptedString(key, str)}
这就是熟悉不过的RSA加密方式了,那现在从RSA加密逆向搜索encryptString关键词,还真找到了有用信息
var timesign = (new Date).getTime() + timespan; $("#p1User").val(encryptString(timesign + encodeURIComponent($("#passwordUser").val()), $("#rsaExponent").val(), $("#rsaModulus").val())); $("#password_value").val($("#passwordUser").val()); $("#btnSubmitUser").val("登录中..."); $("#usernameUser").addClass("fontcolor_cccUser").attr("readonly", "readonly"); $("#passwordUser").val("").addClass("fontcolor_cccUser").attr("readonly", "readonly");
其中关键js代码:
encryptString(timesign + encodeURIComponent($("#passwordUser").val()), $("#rsaExponent").val(), $("#rsaModulus").val())
这就是密码加密的方式无疑,没有涉及到一个关键词,要搜索关键词定位js的话是不可能的;("#rsaExponent").val(), $("#rsaModulus").val(),这三个参数分别是从页面获取id为passwordUser、rsaExponent、rsaModulus的值,那我们去和html搜索这三个关键词分别得到下面信息:
用户输入的密码
RSA加密偏移量01001
RSA密钥
那这三个RSA加密的参数有了,加密过程就不复述了。
var timespan = 1411093327735 - (new Date).getTime();var timesign = (new Date).getTime() + timespan;var pwd = encryptString(timesign + encodeURIComponent(password, iv, pubkey);
接着来看fingerprint字段
全局搜索fingerprint或者其值都没有发现有可用的信息,最后实在没招了,才想起来还cookie没看,然后在cookie中找到了有用信息
ppStore_fingerprint经过URL解码后加上+011就是fingerprint
至于validcode、vcodekey几个字段在没有验证码的情况下都是空;
总体来说58同城的前端加密还是有点意思的,至少要让很大部分人琢磨好一会了,文中只是分析了整个流程,由于时间限制没有用python进行验证,有兴趣的网友可以试试,同时可以保持交流和学习。
ID:Python之战
|作|者|公(zhong)号:python之战
专注Python,专注于网络爬虫、RPA的学习-践行-总结
喜欢研究技术瓶颈并分享,欢迎围观,共同学习。
独学而无友,则孤陋而寡闻!