JS逆向实战案例2——某房地产token RSA加密

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除

作者:zhu6201976

一、 反爬分析

url1:aHR0cDovL3pmY2ouZ3ouZ292LmNuL3pmY2ovZnl4eC94a2I/c1Byb2plY3RJZD05MzBlMDQ0MmJjNjA0MTBkYTgzNzQ0MmQ5ZGRiN2UwMiZzUHJlU2VsbE5vPTIwMjQwMDA1

url2:aHR0cDovL3pmY2ouZ3ouZ292LmNuL3pmY2ovZnl4eC94bXhrYnh4Vmlldw==

浏览器访问url1得到销控表(楼栋列表),点击某一楼栋,下方展示房号列表:

但这一切只是在浏览器中发生的,中间所有的请求和过程,浏览器都帮我们完成了,我们感受不到中间到底发生了什么。真实情况是:我们访问url1,服务器只返回了上半部分内容,而下半部分房号列表信息是缺失的,需要我们POST请求url2,传递project_id、building_id、token等关键参数,才能拿到。然而,token参数是这样的:

到这里,我们可以非常明显的看到,网站做了核心数据的反爬。如果不能解决token参数的生成逻辑,想要协议模拟根本无法实现。

想想也非常正常,对于这个房地产网站,数据量最大,最具核心价值的资源,就在于房号信息。网站一方面为了保护核心数据的安全,另一方面为了防止爬虫程序的滥用,对服务器造成巨大压力,必须对网站进行反爬处理。

效果或许也非常明显,一些初级爬虫,看到这么一大串令人头疼的加密字符,估计已经第一时间放弃抵抗:抬走!

那么,它是如何实现的呢?采用了什么样的加密算法?

1. 首先,我们观察token值的特征,初步判断可能采用了现代密码学:RSA/AES/DES等。
 

iBVW+duWe26lZzi6HVffsw/foveymgr/3kAS3d/2c3TAg/6l1EqnJIXyIsiINANVjrNKzAHgsR80XaTJu2QX96FrVCrNHdCEONr0Iy4qTWHQ5w+Ddptv37bY0PLpX/UYYAAfltxpcCjnxDYGudT9QWqJqfqw2mOuO6rz74/lw8o=@QuZYt/TaVypfEAl0omOoYDP/p8Jn3V5RGz6Bh95bzztU2mEKTqKRY2HfPwgz2pUF9BnPW0BL1vsdvPc+ZHMSgt488Zg++hpXH3r/NcE1J4EofuvI4Ii8JgvtY8oZuR2FSjfwZkLZiwo7YxvcGb+C4J+TqoAyUSRrt9BOnTmS8LQ=@NsXfjXtuNeJX3D51rcd61cmWpTAYISPzw+a4P394pZiXw4TAMFlMwanMdGVLHprXJrv/64D0MIF0qZ+6IvpC7JRWSMUVwRACDTyWTBEyjQmn1YouboOtOr87PV34GUSbe9tXxNlcSVBff7n/3S+ZCHt4t4IDp6tB32ko8r7B3zw=@RENxFEgkEOsQlXZvsvOT4tz0LVzqJq+SwpP0rgbpfWc6KHRN/kpzwTd4563PPhDIY6ASoDVJPdxSZiggCM9jGq+EiaR3d2ZUV5xA7fcjVOC3MkjYoWYKKBAc97LuJ/JGUqpdHMawN6HBthf+iVXmeeeFSxGUzmduRziGfPLZw/g=@RdxwEZPC1HK2X1SxIB8cOQJ7CNX0irA+e76cQYRFRCwg3/Zth/KM6T3gQRdjwNSQ6p5DjnWrLuywSWA1UuXe7m55PXiQDnWIcWP9O46wQfhW7YTeqy1WrIr8THQ+OkfNK2QDj/CRX0wiuZugV5sVrwicqX15/mJv+WeBggoQHow=@FnosIVqEz6WFYIWTPlg/1V+S+ImqiCmv79yfdiQ+J9STWjG1uClgWOP72jkysPD15KxUX5MQA/+fOrNvQxG5ZePg3PbLALB89KIaUkrhFVTySV+FDpmtW/3H1pGC3y8eqQtYbLzKH9pKAA8GaS1gtcMl9tHovz8l8VlYtY3xqMo=@cEtL7FF07gSN8OJUBrDUDlEoAHaRL5S7jxcR2MTD7LfTa1b71upYmTd+xX4UKJ2K0Dpq0IVbiYEK/5JfGbLZ1ioJFXYQytWsJnry1S/Qw5MJ7SjEvDoAcy3w39h+4XQiEh6tedfRWNBeXaqJd0pPNN5tQ1JFkX0EqO6rpIpyFrM=

2. 其次,观察url1的返回document,很明显绑定了点击事件。

当我们点击具体楼栋时,会触发对应绑定的DoSearch函数,并执行对应JS逻辑,发送POST请求url2,获取对应楼栋房号列表信息。

3. 最后,DoSearch函数具体实现在哪?如何快速定位?

在JS逆向中,快速定位很重要。Python之父Guido van Rossum 曾说过:人生苦短,我用Python。那么,我想请问:此处用Python,对我们快速定位有帮助吗?

怎么快怎么来吧,投机取巧一把,全搜搜索 DoSearch 关键词,如果代码没有混淆,肯定是能找到的。果然不出所料,非常轻易的追踪定位到了,上边ak是RSA公钥,说明果然是RSA加密,这也太简单了吧?

二、扣取代码,模拟执行

既然token加密函数DoSearch已定位,那么,我已经迫不及待想扣取代码执行看看效果了。废话不多说,直接完整扣取,放到NodeJS中尝试执行:

function DoSearch(ak, sProjectId, buildingId, houseFunctionId, unitType, houseStatusId, totalAreaId, inAreaId) {var encrypt = new JSEncrypt();encrypt.setPublicKey(ak);var token = encrypt.encrypt(sProjectId) + "@" + encrypt.encrypt(buildingId) + "@" + encrypt.encrypt(houseFunctionId) + "@" + encrypt.encrypt(unitType) + "@" + encrypt.encrypt(houseStatusId) + "@" + encrypt.encrypt(totalAreaId) + "@" + encrypt.encrypt(inAreaId);return token;
}var ak = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1nflpr8o4Jh74z0KPEIBSt+Q4+eCkz6LdyxGZESFgpiQcdIBbWXujhczBCpGO8n1Mo+purvzyxWJIM/I41wjY9JHQSKZF2FL0IfSP8d+V3knz9MA4QHiIzwtrQEpq5U2VmzvSrLsIcPILFPQLZHgaEdQkGVu0NGAzclsMxYmNSQIDAQAB';
var sProjectId = '930e0442bc60410da837442d9ddb7e02';
var buildingId = '63097ed0eb04496b8f9306fc408fe554';
var houseFunctionId = '0';
var unitType = '';
var houseStatusId = '0';
var totalAreaId = '0';
var inAreaId = '0';var ret = DoSearch(ak, sProjectId, buildingId, houseFunctionId, unitType, houseStatusId, totalAreaId, inAreaId);
console.log(ret);

报错:ReferenceError: JSEncrypt is not defined

通过调试,发现JSEncrypt在文件jsencrypt.min.js中定义,行数大概2700,非常明显的RSA加密工具,直接扣取,再次尝试运行:

报错:ReferenceError: navigator is not defined

尝试补环境头:

var Navigator = function Navigator(){}
Navigator.prototype.appName = 'Netscape';
var navigator = new Navigator();

再次运行:

报错:ReferenceError: window is not defined

尝试补环境头:

window = global;

成功出值!

PostMan测试生成的token是否可用,成功拿到正确结果:

三、 完整代码

项目已开源,请访问github获取,期待你的一键三连、star、交流。

github项目地址:https://github.com/zhu6201976/zfcj20240111

项目运行完整截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/240090.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习记录-自动驾驶与机器人中的SLAM技术

以下所有内容均为高翔大神所注的《自动驾驶与机器人中的SLAM技术》中的内容 2D SLAM 作者实现了一个2D 的ICP 3D SLAM ICP 实现了一个并发的ICP配准实现了点到面的ICP实现了点到线的ICP点到线的ICP的结果与点到点的ICP相当,略差于点到面的、在三中算法中&#…

【Proteus仿真】【Arduino单片机】汽车车窗除霜系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602显示模块、光线传感器、DS18B20温度传感器、PCF8691 ADC模块、继电器加热模块等。 主要功能: 系统运行后,LCD…

成功 BOM 流程的五个基本要素

您应该以确保 BOM 流程的方式实现和启用它们: 准确的 当前的 完全的 清除 可行的 追求准确性 为下游提供准确数据 制造商使用其 BOM 来通知下游操作他们需要执行什么。不言而喻,向其他团队和员工提供准确的信息至关重要;否则&…

3.日志配置

规范:项目开发不要编写System.out.println(),应该用日志记录信息 先创建项目: 1. 简介 Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。 SpringBoot怎么把日志默认配置好的 1、每个start…

【Spring 篇】深入探索:Spring集成Web环境的奇妙世界

嗨,亲爱的小白们!欢迎来到这篇有关Spring集成Web环境的博客。如果你曾对如何在Spring中构建强大的Web应用程序感到好奇,那么这里将为你揭示Web开发的神秘面纱。我们将用情感丰富、语句通顺的文字,以小白友好的方式,一探…

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路…

SpringBoot集成Minio

pom文件导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

C盘满了,我用什么思路清理?

20240115 上周六同事传了一个很大的虚拟机给我&#xff0c;C盘就红了 虽然是飞秋选错了存储文件的路径&#xff0c;但后来忘了&#xff0c;就开始毫无目的删除文件&#xff0c;过程中会有没有权限删除的&#xff0c;这样还是没有改善。 咨询了公司IT技术人员&#xff0c; 告…

leetcode-344. 反转字符串、9. 回文数

题目1&#xff1a; 解题方法 直接用reverse()即可 代码&#xff1a; class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: None Do not return anything, modify s in-place instead."""return s.reverse()如果不…

SpringIOC之support模块GenericXmlApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task 核心入口&#xff1a; JobMaster.onStart();部署 Task 链条&#xff1a;JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …

服务异步通讯——springcloud

服务异步通讯——springcloud 文章目录 服务异步通讯——springcloud初始MQRabbitMQ快速入门单机部署1.1.下载镜像安装MQ SpringAMQPwork Queue 工作队列Fanout Exchange广播模式DirectExchange路由模式TopicExchange话题模式 消息转换器 初始MQ RabbitMQ快速入门 官网https:/…

Next.js 开发指​南(GitHub 115k star​)

Next.js 是一个构建于 Node.js 之上的开源 Web 开发框架&#xff0c;它扩展了最新的 React 特性&#xff0c;集成了基于 Rust 的 JavaScript 工具&#xff0c;可以帮助你快速创建全栈 Web 应用 &#xff08;full-stack Web applications&#xff09; 。 对于有一定 React 基础…

mesh 如何接线

水星 1900 mg 二手 约 40 一个 参考 https://post.smzdm.com/p/aoozepzr/ https://service.mercurycom.com.cn/article-1565.html

HTML5+CSS3+JS小实例:实时给中文添加拼音

实例:实时给中文添加拼音 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"&…

nxp s32k144芯片使用J-LINK程序刷写

1.nxp s32k144 (1)打开软件&#xff1a;J-Flash V6.30j (2)新建工程&#xff1a;file->new project (3)选择芯片型号和 target interface (4)可以保存芯片和接口配置 (5)打开程序&#xff1a;File->open data file &#xff08;6&#xff09;程序刷写&#xff1a;T…

Node cool 跨域问题的解决

1.问题 自己在写后端接口的时候 发现一个接口在抖音小程序上可以调用 浏览器上也可以直接打开 但是在H5 的请求中 一直就是cors error 前端报这个跨域问题 在后端 报not Found 一开始以为是找不到 经过确定 发现是跨域问题 2.解决 在全局 configuration.ts 文件里有个全局…

自动驾驶轨迹规划之碰撞检测(二)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.基于凸优化 2.具身足迹 3. ESDF 自动驾驶轨迹规划之碰撞检测&#xff08;一&#xff09;-CSDN博客 大家可以先阅读之前的博客 1.基于…

josef约瑟 电流继电器 DL-13/2 0.5 -1A 1NC, 1NO柜内安装,带附件

系列型号 DL-11电流继电器; DL-12电流继电器; DL-13电流继电器&#xff1b; 一、应用范围 DL-13/2电流继电器 板前接线为电磁式瞬动过电流继电器&#xff0c;它广泛用于电力系统二次回路继电保护装置线路中&#xff0c;作为过电流启动元件。 二、主要技术参数据 动作时间…

普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

PY32C642 单片机采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围。嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器&#xff0c;最高工作频率 24 MHz。包含多种不同封装类型产品。工作温度范围为-40C ~ 85C&#xff0c;工作电压范围 1.7 V ~ 5.5 V。1 路 12 位A…