对抗js前端加密的万能方法

news2024/12/26 2:56:13

1、前言

现在越来越多的网站采用全报文加密,测试的时候需要逆向提取加密算法以及密钥,过程十分繁琐和复杂。本文提供一种更为简单快捷的方法来解决此问题。

原理大致如下:使用浏览器的Override Hook加密前的数据,配置代理地址发送给中转服务器,中转服务器将修改后的内容传给Hook函数,最后再传给后端。

2、环境

Echo Server:Python3实现的一个中转服务器

Chrome:Sources->Overrides Hook线上js

BurpSuite:HTTP抓包工具

目标地址:id.oppo.com

3、调试

首先要找到加密前数据位置。打开的Chrome的XMLHTTPRequest的日志记录,并对后端发起请求。

post body数据被加密了。
https://id.oppo.com/apis/login/validate-password

在这里插入图片描述
下面来定位加密前数据位置,找到刚刚那个请求的调用栈
在这里插入图片描述
然后使用XHR断点来查看输入的数据。

在这里插入图片描述
然后点击登录
在这里插入图片描述

跟到w.post,很明显是一个封装的后的post请求函数。
在这里插入图片描述
将整个js保存到Overrides窗口下。
右键点击js文件,保存并覆盖。
(https://id.oppo.com/new/js/vendors_business~9326b498.1c00dd58484efe3187d8.js)
在这里插入图片描述

从上述代码得知,url的值为t,data值为e。调用js方法打印t的看看。(修改完需ctri+s保存并刷新网页才能生效)
console.log(“调试打印数据”,e)
在这里插入图片描述
再次点击密码登录查看刚刚hook效果。
在这里插入图片描述
如上图,明文内容已经被我们hook到。

但是现在只是能获取到明文内容,如果需要动态修改内容就需要与抓包工具交互。用一个中转服务器(Echo Server)将post body的内容作为响应内容返回给hook函数即可。

4、数据发送与修改

通过javascript将明文内容经过抓包工具发送给Echo Server。查看以下代码示例:

 W.post = function(t, e, n) {
        console.log("调试打印数据",e)
        // 构造发包
       	var xhr = new XMLHttpRequest();
        // 同步
        xhr.open('post', 'http://127.0.0.1:27001/oppo/req', false);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhr.send(JSON.stringify(e));
        // 获取到修改后的数据传给原来流程
        //  转回对象
        let modifyData = JSON.parse(xhr.responseText);
        // 重新赋值
        e = modifyData;
        return W(Object.assign({
        url: t,
        data: e,
        method: "post"
            }, n))
        }

在这里插入图片描述
burp配置

监听端口27001,js发送请求会经过burp代理
在这里插入图片描述
将流量重定向至Echo Server

在这里插入图片描述
Echo Server代码:


from http.server import HTTPServer, BaseHTTPRequestHandler


class RequestHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        print('Recving request connction...')
        request_headers = self.headers
        content_length = request_headers.get('content-length')
        length = int(content_length[0]) if content_length else 0

        print(self.headers)
        self.send_response(200)
        self.end_headers()
        self._send_cors_headers()
        self.wfile.write(self.rfile.read(length))

    def do_POST(self):
        print('Recving request connction...')
        req_datas = self.rfile.read(int(self.headers['content-length']))
        # print(self.headers)
        # print(req_datas)

        self.send_response(200)
        self._send_cors_headers()
        self.end_headers()
        self.wfile.write(req_datas)

    def _send_cors_headers(self):
        self.send_header('Content-type', 'application/json')
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "*")
        self.send_header("Access-Control-Allow-Headers", "Authorization, Content-Type")

    def do_OPTIONS(self):
        self.send_response(200)
        self._send_cors_headers()
        self.end_headers()


def main(ECHO_PORT):
    print('Listening on localhost: %d' % ECHO_PORT)
    server = HTTPServer(('127.0.0.1', ECHO_PORT), RequestHandler)
    server.serve_forever()


if __name__ == '__main__':
    main(27002)

效果如下:

在这里插入图片描述
在这里插入图片描述

5、引用

基于浏览器Override对抗前端加密
由于这篇文章写的和网站有实际出入,所以我复现完才出了一篇文章

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Linux]Linux编译器-gcc/g++

🥁作者: 华丞臧. 📕​​​​专栏:【LINUX】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站 文…

SpringBoot+Redis(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-messaging-redis.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建应用程序,使用…

【谷粒商城基础篇】商品服务:商品维护

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念(第一、二章)基础环境搭建(第三章)整合SpringCloud整合SpringCloud、SpringCloud alibaba(第四、五章)前端知…

xxx.lua入门编程

lua入门级编程,openresty的前置技能lua入门级编程,openresty的前置技能 看上图 lua示例: 入门示例 print("hello world!") local arr {"java","mysql","oracle"}; local map {usernamezhangsan,password123}; local fu…

Debezium 同步 PostgreSQL 数据到 RocketMQ 中

1.RocketMQ Connect概览 RocketMQ Connect是RocketMQ数据集成重要组件,可将各种系统中的数据通过高效,可靠,流的方式,流入流出到RocketMQ,它是独立于RocketMQ的一个单独的分布式,可扩展,可容错系…

字节二面:Redis 的大 Key 对持久化有什么影响?

Redis 的持久化方式有两种:AOF 日志和 RDB 快照。 所以接下来,针对这两种持久化方式具体分析分析。 大 Key 对 AOF 日志的影响 先说说 AOF 日志三种写回磁盘的策略 Redis 提供了 3 种 AOF 日志写回硬盘的策略,分别是: Always&am…

Git(四) - Git 分支操作

​​​​​​​ 一、什么是分支 在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支…

前端面试常考 | js原型与原型链

文章目录一. 什么是原型?二. 什么是原型链?一. 什么是原型? 在js中所有的引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象。 而在js中的引用类型包括:Object,Array,Date,Function 而所有函数都有…

基于K8s的DevOps平台实践(二)

文章目录1. 流水线入门🍑 流水线基础语法🍑 脚本示例🍑 脚本解释🍑 Blue Ocean2. Jenkinsfile实践🍑 演示一🍑 演示二🍑 演示三🍑 演示四🍑 总结3. 多分支流水线实践&…

BEV视觉3D感知算法梳理

1. 基于BEV空间的自动驾驶感知任务 最近,基于BEV空间下的感知任务已经涌现出了众多优秀算法,并在多个自动驾驶公开数据集(KITTI,Waymo,nuScenes)上取得了非常不错的成绩。根据自动驾驶汽车上安装的传感器类…

【从零开始学习深度学习】37. 深度循环神经网络与双向循环神经网络简介

目录1. 深度循环神经网络2. 双向循环神经网络总结1. 深度循环神经网络 之前介绍的循环神经网络只有一个单向的隐藏层,在深度学习应用里,我们通常会用到含有多个隐藏层的循环神经网络,也称作深度循环神经网络。下图演示了一个有LLL个隐藏层的…

数字化时代,全方位解读商业智能BI

商业智能BI是一种通用的数据类技术解决方案,不会因为行业BI没有进行针对性开发而出现不适配、无法使用的情况。同时,也正因为商业智能BI核心是数据,只要企业有数据沉淀,不管是哪些行业BI商业智能都能发挥出作用。 不过考虑到不同…

文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具

文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128438303 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

portraiture2023智能磨皮修饰滤镜插件中文版

在人像后期修图的时候免不了需要进行磨皮处理,很多人在挑选磨皮软件的时候都不知道该如何选择,今天的文章就来带大家看看磨皮软件哪个好,能磨皮的修图软件和插件!借助磨皮软件即使是新手也能做出高级的人像图片,下面挑选了几款好用…

Java 并发编程知识总结【五】

6. 线程中断与 LockSupport 6.1 线程中断机制 大厂(蚂蚁金服)面试题: 什么是中断? 首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.…

Exynos_4412——中断控制器

目录 一、中断控制器 中断控制器的作用: 二、Exynos_4412下的中断控制器 它支持三种类型的中断 可以编程设置: 三、中断控制器详解 四、中断控制器编程 一、中断控制器 外设产生的中断信号,先要经过中断控制器,中断是异常…

如何解决软件项目管理中的冲突?

1、项目干系人间的良好沟通 项目干系人之间保持良好的沟通交流,是减少项目管理中冲突的重要手段。甲乙双方签订合同后,为保障项目的成功,在项目发生矛盾和困难时,需要双方相互理解和沟通,共同协商解决问题。 为了及时解…

Git(八) - IDEA 集成 GitHub

一、设置 GitHub 账号 二、分享工程到 GitHub 来到GitHub中发现已经帮我们创建好了git-test的远程仓库。 三、push 推送本地库到远程库 注意:push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致, push的操作是会被拒绝的…

go 性能分析pprof和trace

runtime/pprof:采集程序(非 Server)的运行数据进行分析,用于可结束的代码块,如一次编解码操作等net/http/pprof:采集 HTTP Server 的运行时数据进行分析。用于不可结束的代码块,如 web 应用等 使…

​工程师如何对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师,亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践,也看到了很多 Bad Cases,所以想把自己的一些心得体会写在这里,供工程师进行…