本帖最后由 帝都小爬虫 于 2021-2-11 03:05 编辑
上周五临近下班,本想美滋滋的回家愉快的看电视、撸串,同事跟我说以前负责爬虫的同事的一个功能挂了,想着一起解决一下,没想到跌进一个坑中。
初步发现页面的内容都是经过JS渲染上去的,所以但从Chrome的开发人员看不出太多内容来,但是这时候就差不多知道这个站点一定用到了大量的JS
点开筛选器,只显示JS,搜索"登录"这个词
仔细观察了一遍,发现没有什么有用的信息,不过也间接的多学习了JS的技术。
打开调试,点击登录按钮,发现根据JS动态生成了一个弹窗,新加载了一些js和css,从这里入手看一下。
这么多东西我们无法一个接着一个看,所以,根据抓包的内容中,rohrtoken进行搜索。
发现有两个JS还有一个html涉嫌跟这个rohr有关系,逐一排查一下。
先将html的代码复制出来,用bejson的js/html格式化功能进行格式化,放到sublime中方便我们查看。
在sublime中搜索rohr关键字,得到结果
继续看另外两个
Rohr.js里有不少代码操作了Rohr
大概找到了入手点,开发人员工具中点开Sources,进行调试。
发现这里面操作了ip这个对象,我们在var iP处加上断点,刷新页面后发现此处在页面加载时被执行过。逐步分析,在iP.reload处加上断点,刷新页面,点击登录按钮,随意输入账号密码点击登录。
Emmmm ,是不是觉得胜利就在眼前了呢,我当时也是这么想的。
根据惯例,我们发现jv的值其实是基本固定的,取出备用。
那么我们可以直接调用这个ip.reload函数么,因为返回的jw就是我们想要的值,其实是可以的,下面我们单独写一个html页面,将下列我们在html页面中发现的内容粘贴到我们的html中。
然后调用Rohr_Opt.reload()这个函数。
为什么要调用Rohr_Opt.reload,因为我们在前面的途中发现了ip被赋给了Rohr_Opt,因为我们定义Rohr_Opt为Object,并且在js中有如下判断
if (typeof (Rohr_Opt) === _$_543c[2]) { iP.bindUserTrackEvent(); Rohr_Opt.reload = iP.reload; Rohr_Opt.sign = iP.sign; Rohr_Opt.clean = iP.decrypt })
简单检查下代码,执行我们自己的html,如果没什么问题的话,你会显示出来一段Token,但是这个Token其实是有问题的,我们放到下面说。
这时候我们可以用PostMan测试一下我们的Token,不出意外的话应该会显示如下的响应。
到这里我们要开始反思,究竟是哪里不对。
现在根据我们的计算jw = iI(iP)这个方法的参数iP来对照正常提交的参数。
这是我通过浏览器正常操作的iP
下图为我们自己html的iP
可以发现,我们与正常操作的变量多少有一些区别,缺少aT、kT、mT,另外bI也与正常的不同,我们看一下bI的代码是怎么加载的。
bI是通过iL()函数来赋值的.
var iL = function() { var jb = document.referrer; var ja = window.location.href; return [ja, jb] };
可以看到这个数组里的内容,但是我们知道document.referrer是只读属性,无法更改,那我们有什么办法来更改呢,试过了很多方法,最后觉得还是直接改js来的快一些。我们将整个rohr.js下来,直接赋值jb和ja的值。
var iL = function() { var jb = "https://e.maoyan.com/user/login?next=%2F"; var ja = "https://epassport.meituan.com/account/unitivelogin?bg_source=6&service=movie&continue=https://e.maoyan.com/backend/account/user/entry/merchant"; return [ja, jb] };
更改下html代码,将js放到同等目录下。
<!DOCTYPE html><html> <head> <title>Rohr_Token计算</title> <script> window.Rohr_Opt = new Object; window.Rohr_Opt.Flag = { flag: 100043 }; window.Rohr_Opt.LogVal = "rohrdata";</script> <script src=https://www.52pojie.cn/"rohr.js">'https://epassport.meituan.com/api/account/login?loginContinue=https://e.maoyan.com/backend/account/user/entry/merchant&&only_auth=undefined'; var n = void 0; n = window.Rohr_Opt.reload(data) onload = function() { divd = document.createElement("div"); divd.id = 'Rohr_Token'; divd.innerHTML = n; document.body.appendChild(divd); }</script> </head> <body></body></html>