当前位置: 首页 > 后端技术 > Python

【JS逆袭100例】建筑市场监管平台企业数据

时间:2023-03-26 18:58:14 Python

声明本文所有内容仅供学习交流,严禁用于商业和非法用途,否则由此产生的一切后果与作者无关.反向目标目标:住建部&国家建设市场监管公共服务平台企业数据主页:http://jzsc.mohurd.gov.cn/dat...接口:http://jzsc.mohurd.政府。cn/api...reverse参数:请求返回的加密数据的逆向过程。本次的反向目标是建筑市场监管平台的企业数据。进入全国建筑市场监管公共服务平台首页,点击数据服务->企业数据,尝试抓取所有企业的数据,可以看到返回的数据是加密的:看不到数据是加密的,但是经过大量的加密分析,就知道一般是通过CryptoJS加密模块进行加密的,那么我们可以尝试直接搜索CryptoJS,decrypt等关键字,或者搜索offsetiv,modemode,padding等加密算法中经常用到的,一般的JSON数据可以搜索JSON.parse等,这里直接搜索JSON.parse,在app.a9f6bb6d.js文件中定位可疑代码,埋断点调试:可以看到e是解密后的数据,观察语句vare=JSON.parse(h(t.data));,直接跟进h函数,可以看到明显的AES加密:functionh(t){vare=d.a.enc.Hex.parse(t),n=d.a.enc.Base64.stringify(e),a=d.a.AES.decrypt(n,f,{iv:m,模式:d.a.mode.CBC,填充:d.a.pad.Pkcs7}),r=a.toString(d.a.enc.Utf8);returnr.toString()}加密方式为CBC,填充方式为Pkcs7,缺失的偏移量m和f值也可以在上面找到:f=d.a.enc.Utf8.parse("jo8j9wGw%6HbxfFn")m=d.a.enc.Utf8.parse("0123456789ABCDEF")在Python中直接导入CryptoJS重写此函数。完整代码完整代码可以在GitHub下载:https://github.com/kuaidaili/...jzsc_mohurd_decrypt.js//引用crypto-js加密模块varCryptoJS=require('crypto-js')functiongetDecryptedData(t){varm=CryptoJS.enc.Utf8.parse("0123456789ABCDEF"),f=CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn"),e=CryptoJS.enc.Hex.parse(t),n=CryptoJS。enc.Base64.stringify(e),a=CryptoJS.AES.decrypt(n,f,{iv:m,模式:CryptoJS.mode.CBC,填充:CryptoJS.pad.Pkcs7}),r=a.toString(CryptoJS.enc.Utf8);returnr.toString()}//测试示例//vart='95780ba094xxxxxxxxxx'//console.log(getDecryptedData(t))jzsc_mohurd.py#!/usr/bin/envpython3#-*-coding:utf-8-*-importjsonimportexecjsimportrequestsdata_url='http://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?pg=%s&pgsz=15&total=450'defget_encrypted_data(page):headers={'Host':'jzsc.mohurd.gov.cn','Referer':'http://jzsc.mohurd.gov.cn/data/company','User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}encrypted_data=requests.get(url=data_url%page,headers=headers).text返回encrypted_datadefget_decrypted_data(encrypted_data):withopen('jzsc_mohurd_decrypt.js','r',encoding='utf-8')asf:jzsc_mohurd_js=f.read()decrypted_data=execjs.compile(jzsc_mohurd_js).call('getDecryptedData',encrypted_data)returnjson.loads(decrypted_data)defmain():#30页数据forpageinrange(30):encrypted_data=get_encrypted_data(页)decrypted_data=get_decrypted_data(encrypted_data)打印(decrypted_data)if__name__=='__main__':main()