携带请求参数:可以从ajax的代码中获取
请求回来的数据对应的回调函数
函数的参数就是请求到的响应数据(加密的密文数据),该函数会对拿到的密文数据进行解密,将解密后的原文动态显示前台页面中重点:只要能够找到点击查询按钮对于的ajax请求代码后,就可以知道动态变化且加密的请求参数如果生成,就可以获取相应的密文数据,然后通过回调函数的操作获取解密方案,使用该方案的响应进行解密即可
操作:找ajax代码
获取搜索按钮对应的点事件: getData();绑定的点击事件有价值的信息: type == "HOUR"查询时间是以小时为单位 发现函数内部调用了另外两个函数getAQIData(); getWeatherData();ajax代码的实现一定实在上述的两个函数内部这这两个函数内部没有发现ajax 代码的实现调用了一个叫做getServerData()函数,getServerData的参数: method :GETDETAIL 字符串param:字典,有四组键值对 param.type = type; param.startTime = startTime; param.endTime = endTime;回掉函数:0.5 进入 getServerData的函数内部找ajax代码: 这个函数没有存在当前文件中需要在抓包工具里面进行全局搜索通过全局搜索找到了getServerData在jquery文件中,是密文 js混淆: 在网站的后后台,关键的重要的js函数的实现为了保密,一般会对这些js函数代码进行混淆(加密),所以我们需要进行解密(反混淆)反混淆网址:http://www.bm8.com.cn/jsConfusion/分析getServerData函数中的ajax代码:
动态变化加密的请求参数:
var param = getParam(method, object); method = GETDETAILobject = param 字典 decodeData(data);将data这个响应数据进行解密需要调用这两个函数就可以进行发生请求了总结: 调用getParam后就可以获取加密变化的请求参数调用decodeData就可以将响应数据进行解密 问题:python调用jsjs逆向: 可以将js代码改写成 python代码使用相关模块进行js逆向 pip3 install PyExecJS PyExecJS的使用: 1.需要接待执行,的js函数的全部定义存到text.js中2.模拟执行js源文件中的js函数 加载js源文件js代码将js源文件中的代码进行编译 import requests import execjs # 实例化一个对象 node = execjs.get() # Params method = "GETDETAIL" city = '北京' type = "HOUR" start_time = "2018-01-25 00:00:00" end_time = "2018-01-25 23:00:00" # Copile javascript file = "./text.js" # 待加载编译的js源文件 ctx = node.compile(open(file,encoding='utf-8').read()) # 调用getPostParamCode js = 'getPostParamCode("{0}","{1}","{2}","{3}","{4}")'.format(method,city,type,start_time,end_time) # eval表示模拟进行编译好的js函数 params = ctx.eval(js) # print(params) # 返回是加密变化的请求参数 # 发起post请求 url = "https://www.aqistudy.cn/apinew/aqistudyapi.php" response_text = requests.post(url=url,data={'d':params}).text # print(response_text) # 返回加密的数据 # 模拟执行decodeData进行解密 jes = 'decodeData("{0}")'.format(response_text) decrypted_data = ctx.eval(jes) print(decrypted_data) print("我结束了")