携程H5端航班数据抓取
1 加密参数分析
(文章提供方法仅用作交流学习,请不要用作商业用途)
(数据已做脱敏处理)
-
页面url: aHR0cHM6Ly9tLmN0cmlwLmNvbS9odG1sNS9mbGlnaHQvc3dpZnQvZG9tZXN0aWMvQ1RVL0NBTi8yMDIyLTA0LTA3P2RmaWx0ZXI9
可以看到查询航班的url路径是由起飞机场三字码、到达机场三字码以及起飞日期组成
-
请求url:
aHR0cHM6Ly9tLmN0cmlwLmNvbS9yZXN0YXBpL3NvYTIvMTQwMjIvZmxpZ2h0TGlzdFNlYXJjaD9fZnhwY3FsbmlyZWR0PTA5MDMxMTAyMzE1NzgzMzY3NjYx抓包可以看到这个Ajax请求正好返回了对应的航班飞机机票数据
接着看一下请求头,请求头中带有记录用户行为和信息的cookie,经过不断请求清除cookie重新生成,发现cookie中其他的参数都是固定的,只有一个SESSIONID、GUID以及_bfa是变化的
再来看这个post请求的请求体(payload)
经过多次请求,不难看出请求参数以及荷载中的cid和cookie中的GUID是一样的。accode是到达机场三字码,dccode是出发机场三字码,tid是怎么生成的还不知道
2 追踪分析参数
经过分析,只要模拟出对应的荷载以及用户cookie差不多就可以抓到数据了,点击启动器,查看此Ajax请求调用的程序,其中有一个fetchDataWithCache,点击进去,在此处打上断点,重新刷新页面
这里可以看到tid以及生产了点击↑向上追溯调用栈
点击几次后,看到set和get方法,get返回的就是tid(tid的格式看起来八成是生成UUID的格式)
接着定位到对应的函数
跟推断的差不多,就是UUID的格式,把源码po出来
没什么毛病,就是按规则随机生成的UUID。
3 得到cookie
tid搞定了,接下来主要问题就是搞定cookie了,这里主要有两个方法:一个是Hook大法,还有一个就是使用mitmproxy或者模拟浏览器抓cookie
- Hook大法
Hook大法网上由很多大神的教程,我也是跟着大神学到了很多,推荐这篇K哥爬虫博主的文章,很值得学习,JS逆向之HOOK大法
可以通过油猴脚本hook还可以通过fiddler插件hook
通用JavaScript代码如下:
(function(){
'use strict';
var cookieTemp = "";
Object.defineProperty(document, 'cookie', {
set: function(val) {
if(val.indexOf('_bfa') != -1){
debugger;
}
console.log("Hook到的cookie", val);
return val;
},
get: function() {
return cookieTemp;
}
});
})();
然后刷新页面,就可以hook到该cookie参数了
- mitmproxy抓取cookie
mitmproxy也就是中间人代理攻击,可以截获客户端与服务器端的通讯通话并且插入新的内容,具体可以查看我的这篇文章MitmProxy介绍使用