JS渗透(安全)

JS逆向

基本了解

在这里插入图片描述

作用域:

相关数据值

调用堆栈:

由下到上就是代码的执行顺序

在这里插入图片描述

常见分析调试流程:

1、代码全局搜索

2、文件流程断点

3、代码标签断点

4、XHR提交断点

某通js逆向结合burp插件jsEncrypter

申通快递会员中心-登录

在这里插入图片描述

查看登录包,这里的发起程序里的请求调用堆栈可以看见依次调用了那些js文件,调用顺序为从下往上

在这里插入图片描述

看名字就感觉send就是发送,ajax 提交,login可能存在加密

function Login() {
var numMobile = $(“#numMobile”).val();
var numPassword = $(“#numPassword”).val();
var numCode = $(“#numCode”).val();
var chkAgreement = $(“#accountChkAgreement”).prop(“checked”);

function Login() {
    var numMobile = $("#numMobile").val();
    var numPassword = $("#numPassword").val();
    var numCode = $("#numCode").val();
    var chkAgreement=$("#accountChkAgreement").prop("checked");   
//验证服务条款是否选中
    if (!chkAgreement) {
        layer.msg("请查看并同意服务条款");
        return false;
    }
    //判断手机号码格式是否正确
    if (!$("#numMobile").val() === "") {
        layer.msg("手机号码不能为空");
        return false;
    }
    else if (!$("#numMobile").val().length > 11) {
        layer.msg("请输入有效的手机号码");
        return false;
    }
        //判断手机号码格式是否正确
    else if (!$("#numMobile").val().match(/^1(3|4|5|6|7|8|9)\d{9}$/)) {
        layer.msg("手机号码格式不正确");
        return false;
    }
    //用if语句来判断当用户名或者密码有一个为false时就弹出一个消息框,并提示:请输入正确的信息。
    if (!numMobile || !numPassword) {
        layer.msg("请输入正确的信息");
        return false;
    }
    encrypt.setPublicKey(pkey);
    var logindata = {};
    //加密手机号
    var numMobile = $("#numMobile").val();
    var numPassword = $("#numPassword").val();
    var numCode = $("#numCode").val();
    logindata.UserName = encodeURI(encrypt.encrypt(numMobile));
    logindata.Mobile = encodeURI(encrypt.encrypt(numMobile));;
    //加密密码
    logindata.Password = encodeURI(encrypt.encrypt(numPassword));
    //  logindata.ValidateCode = numCode;
    //logindata.NECaptchaValidate = ret.validate;
    var userId = $("#hiddenUserId").val();
    //用ajax来实现不刷新网页的基础上更新数据
    $.ajax({
        type: "post",
        url: "/Vip/LoginResult",
        data: logindata,
        success: function (data) {
            if (data.Status) {
                layer.msg("登录成功");
                window.location = "/Vip/Index";
            }
            else {
                layer.alert(data.StatusMessage);
            }
        }
    });
   }

可以看见注释//加密密码 //加密手机号 在此断点
在这里插入图片描述
在这里插入图片描述

看右边作用域发现还没进行加密,那么再往下走,将鼠标放在

encodeURI(encrypt.encrypt(numMobile)) 和encodeURI(encrypt.encrypt(numMobile))上面发现就是加密后的字符串

在这里插入图片描述

找到加密函数就在Login函数内,就去掉非加密的部分,扣代码

function Login() {
    encrypt.setPublicKey(pkey);
    var logindata = {};
    //加密手机号
    var numMobile = "19174007849";
    var numPassword = "123456"
    logindata.UserName = encodeURI(encrypt.encrypt(numMobile));
    logindata.Mobile = encodeURI(encrypt.encrypt(numMobile));;
    //加密密码
    logindata.Password = encodeURI(encrypt.encrypt(numPassword));
	console.log(logindata.Mobile)
   }

放在线js执行看看

在这里插入图片描述

提示encrypy不存在,回到源代码找encrypy

在这里插入图片描述

找到var encrypt = new JSEncrypt();

在这里插入图片描述

ctrl+shift+f搜索function JSEncrypt找不到匹配项,证明它是js自带库

在这里插入图片描述

询问gpt然后确定是三方库后,获取到该库的url

<script src="https://cdn.jsdelivr.net/npm/jsencrypt/bin/jsencrypt.min.js"></script>

构造POC:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Example</title>
    <script src="https://cdn.jsdelivr.net/npm/jsencrypt/bin/jsencrypt.min.js"></script>
    <script>
        function Login() {
            var encrypt = new JSEncrypt();
            var pkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIcxKPIWPDEg1V9kILfivIpldY"
    + "G3dZ0tdUKrqOAb3r0TXGK0RXwpdkHRIyUZv18y51g03xnYyMRz5LsEKqfHt4S7IT"
    + "gyYrk1MUSM38I46H9ifPvrsARbq1FLa/Mc67uStp6+0unnlzhmuCNpooFdv9JJYy"
    + "kVdRvyrIQeLSOoEgMQIDAQAB";
            encrypt.setPublicKey(pkey);
            var logindata = {};
            var numMobile = "19174007849";
            var numPassword = "123456";
            logindata.UserName = encodeURI(encrypt.encrypt(numMobile));
            logindata.Password = encodeURI(encrypt.encrypt(numPassword));
            console.log(logindata.Mobile);
            console.log(logindata.Password);
        }
        Login();
    </script>
</head>
<body>
</body>
</html>

运行访问看看是否成功

在这里插入图片描述

成功,将三方库下载下来,这边建议搜索这个js名字,直接通过该网站下载,不然可能报错,我就是因为这一点浪费2h

在这里插入图片描述

在这里插入图片描述

使用jsEncrypter插件(安装方式网上查需要先安装好phantomjs),更改phantomjs_server.js文件内容

这里提供两个文件下载位置:

下载phantomjs并设置环境变量

https://phantomjs.org/download.html

Burp加载jsEncrypter插件

https://github.com/c0ny1/jsEncrypter/releases

更改名字导入下载好的三方js文件

var wasSuccessful = phantom.injectJs('jsencrypt.min.js');/*引入实现加密的js文件*/
var encrypt = new JSEncrypt();
var pkey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIcxKPIWPDEg1V9kILfivIpldY"
    + "G3dZ0tdUKrqOAb3r0TXGK0RXwpdkHRIyUZv18y51g03xnYyMRz5LsEKqfHt4S7IT"
    + "gyYrk1MUSM38I46H9ifPvrsARbq1FLa/Mc67uStp6+0unnlzhmuCNpooFdv9JJYy"
    + "kVdRvyrIQeLSOoEgMQIDAQAB";
encrypt.setPublicKey(pkey);
newpayload = encodeURI(encrypt.encrypt(payload));

将加密主要函数小改后放进去

在这里插入图片描述

命令phantomjs phantomjs_server.js启动,开启监听

在这里插入图片描述

在bp的jsEncrypter连接并test

在这里插入图片描述

左边是test的明文,右边是加密后的

在这里插入图片描述

在爆破模块中的payload处理处添加 通用Burp扩展,选择jsEncrypter

就可以了

在这里插入图片描述

某大学平台登陆点js逆向

交我算平台

在这里插入图片描述

这里调用的堆栈太多了,不好排查断点,费力耗时

那么就使用标签(DOM)断点或XHR断点,什么是标签断点,就是选中登录的元素代码,选择中断于子树修改和属性修改,意思就是如果登录框状态一旦变化就暂停调试

在这里插入图片描述

但是如下图,没看到什么有用的思路

在这里插入图片描述

那么就使用XHR断点

抓取到登录包的url特点是/user/login,在XHR断点处添加这个特性,一旦遇见该请求

在这里插入图片描述

提交数据包
在这里插入图片描述

断点成功,在作用域看见了username和password字段,找到入手点了

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

点击这个向上符号或者堆栈往上逆向

在这里插入图片描述

点到堆栈value的时候可以发现i变量就是我输入的用户名,a变量就是我输入的密码,s变量就是我输入的密码被加密后的样子

在这里插入图片描述

可以看见a是经过r.encrypt变成s的

var s = r.encrypt(a)

那么就寻找r.encrypt()

发现var r = new JSEncrypt,JSEncrypt是老朋友了,直接全局搜它
在这里插入图片描述

访问后先下载到本地

在这里插入图片描述

r.setPublicKey(o);

这里发现o的值是公钥,但是o不知道会不会变化,那么在输入其他用户名密码断点一次,提取两次的o值查看是否有变化

在这里插入图片描述

第一次:

305c300d06092a864886f70d0101010500034b003048024100959684a0076fd2a8fc1589469cf8c95f16ef67490c519f4d274373f29cee64cf6a0db8ad8953122c5b3664e4a48acd34d9b95c0ae62a31be612632e1c49154db0203010001

第二次:

305c300d06092a864886f70d0101010500034b003048024100959684a0076fd2a8fc1589469cf8c95f16ef67490c519f4d274373f29cee64cf6a0db8ad8953122c5b3664e4a48acd34d9b95c0ae62a31be612632e1c49154db0203010001

太好了,没有变化,那么就是说o是固定值

开始扣代码

在这里插入图片描述

浏览器访问该html,查看控制器

在这里插入图片描述

没有报错,那么再使用burp插件jsEncrypter联合爆破

修改phantomjs_server.js文件

在这里插入图片描述

运行插件并在burp上测试

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

成功

将password标记为变量

在这里插入图片描述

导入字典后,payload处理选择jsEncrypter插件

在这里插入图片描述

在这里插入图片描述

成功编码

反调试

实现防止他人调试、动态分析自己的代码

检测调试方法:

1、键盘监听(F12)

2、检测浏览器的高度插值

3、检测开发者人员工具变量是否为true

4、利用 console.log 调用次数-利用代码运行的时间差

5、利用 tostring

6、检测非浏览器

绕过反调试

条件断点

正在播放:【识骨寻踪第二季】part 4-- 咸鱼影视 智能解析 X4

该网站在播放视频的时候开启开发者模式就会暂停
在这里插入图片描述

在debug处添加断点并添加条件写入false
在这里插入图片描述

再刷新就ok了

此处暂停法

在这里插入图片描述

置空函数法

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

本地覆盖

例如如下网站:

PM2.5实时查询|PM2.5历史数据查询|PM2.5全国城市排名|PM2.5雾霾地图|中国空气质量在线监测分析平台|

在这里插入图片描述

在这里插入图片描述

右键 F12都被禁用

那么先开启开发者工具然后再访问该网址
在这里插入图片描述

成功打开调试器,但是程序依然暂停

全局搜索关键词:检测到非法调试
在这里插入图片描述

可以发现endebug函数就是检测函数

在这里插入图片描述

全局搜索使用endebug相关的代码
在这里插入图片描述

发现jquery.min.js?v=1.1和jquery.min.js?v=1.3两个js文件使用了endebug

那么在这两个文件右键,选择替代内容
在这里插入图片描述

找到endebug,将它所在的函数注释掉,并ctrl+s保存

然后再刷新,右键/F12都可以用了,也不会被反调试了
在这里插入图片描述

在这里插入图片描述

混淆加密

为了防止反调试功能被剔除,我们可以对JS代码进行混淆加密

开源代码混淆解密:
https://www.sojson.com

在这里插入图片描述

加密结果

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

执行没问题,去掉最后(‘sojson.v4’)试试
在这里插入图片描述

源码就出来了
aa加密在这里插入图片描述

运行试试:在这里插入图片描述

和上面思路一样,寻找最后一个括号删除内容

这里推荐插件Rainbow可以高亮
在这里插入图片描述在这里插入图片描述

删除后源代码就出来了
在这里插入图片描述

商业代码混淆解密:

https://jsdec.js.org.

如下网站的这个js文件就是混淆加密后的代码

https://www.eisk.cn/Tides

在这里插入图片描述

拿出来放网站尝试解密
在这里插入图片描述

一个一个试就解出来了

可以发现是aes加密

模式:cbc;iv:3125674387384578;key:aaasfbbbbcccgasdeeeeffffgrwervxr

JS安全问题

配置泄露

在这里插入图片描述

未授权

在这里插入图片描述

在这里插入图片描述

更改返回包即可绕过前端验证

框架漏洞检测

工具推荐:

https://github.com/DenisPodgurskii/pentestkit

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Imperva 数据库与安全解决方案

Imperva是网络安全解决方案的专业提供商&#xff0c;能够在云端和本地对业务关键数据和应用程序提供保护。公司成立于 2002 年&#xff0c;拥有稳定的发展和成功历史并于 2014 年实现产值1.64亿美元&#xff0c;公司的3700多位客户及300个合作伙伴分布于全球各地的90多个国家。…

工业网络监控中的IP保护与软件授权革新

未来的智能工厂离不开稳定而高效的通信网络&#xff0c;这些网络在支撑生产流程的同时&#xff0c;也面临着复杂的管理与安全挑战。PROCENTEC推出了一系列硬件和软件产品&#xff0c;如Atlas、Mercury和Osiris&#xff0c;以提供全面的网络监控和故障排除能力。然而&#xff0c…

基于springboot+vue实现的网上预约挂号管理系统 (源码+L文+ppt)4-104

结合现有六和医院网上预约挂号管理系统的特点&#xff0c;应用新技术&#xff0c;构建了六和医院网上预约挂号管理系统。首先从需求出发&#xff0c;对目前传统的六和医院网上预约挂号管理进行了详细的了解和分析。根据需求分析结果&#xff0c;对系统进行了设计&#xff0c;并…

QT for android 问题总结(QT 5.15.2)

1.配置好的sdk&#xff0c;显示设置失败 Android SDK Command-line Tools run. Android Platform-Tools installed. Command-line Tools (latest) 版本过高导致报错 &#xff0c;下载一个低版本的latest &#xff0c;替换掉之前latest中的文件。即可&#xff0c;latest 路径如…

NAS端最强音乐库,多平台服务支持。海康存储部署『Navidrome』

NAS端最强音乐库&#xff0c;多平台服务支持。海康存储部署『Navidrome』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于我们NAS用户&#xff0c;我们总是喜欢将自己喜欢的音乐资源通过下载的方式保存在本地&#xff0c;不过海康存储目前对因音乐的支持和管理实在过于薄弱&am…

【论文阅读笔记】Wavelet Convolutions for Large Receptive Fields

1.论文介绍 Wavelet Convolutions for Large Receptive Fields 大感受野的小波卷积 2024 EECV Paper Code 2.摘要 近年来&#xff0c;人们试图通过增加卷积神经网络&#xff08;ConvolutionalNeuralNets&#xff0c;CNNs&#xff09;的核尺寸来模拟视觉变换器&#xff08;V…

2024年最新10款顶级项目管理软件排行

项目管理软件在现代项目管理中扮演着至关重要的角色&#xff0c;它不仅仅是一个工具&#xff0c;更是一种高效、系统化的方法来管理和优化项目流程&#xff0c;帮助项目经理和团队成员快速了解项目状态&#xff0c;加速项目进展。 进度猫 进度猫是一款以甘特图为向导的轻量级…

SAP ABAP开发学习——RFC

目录 RFC接口 定义 调用过程 RFC的通信 RFC通信情况 RFC接口系统 RFC的通信模式 RFC版本 RFC调用方式 Web Service接口 SAP创建Web Service示例 远程目标的维护 创建远程目标 外部系统访问设置 RFC的调用 RFC接口 定义 调用过程 RFC的通信 RFC通信情况 RFC接…

gps数据对接G7易流平台

之前伙伴对接G7物流平台获取温度、轨迹数据&#xff0c;写的一塌糊涂&#xff0c;今天来重新对接下。 G7易流 G7物联和易流科技合并后正式发布的品牌&#xff0c;主要面向生产制造与消费物流行业的货主及货运经营者提供软硬一体、全链贯通的SaaS服务。这包括订阅服务&#xff…

【网络】传输层协议TCP(下)

目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手&#xff0c;下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…

高效新闻管理:SpringBoot框架应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理新闻稿件管理系统的相关信息成为必然。开发…

【已解决】C# NPOI如何设置单元格格式

前言 设置单元格格式我们做表格必须要的一步&#xff0c;那么如何对单元格进行设置呢&#xff1f;直接上图看看效果图先&#xff0c;我做的是一个居中然后字体变化的操作&#xff0c;其他的查他的手册即可。 解决方法 直接上代码 IWorkbook excelDoc new XSSFWorkbook();…

通过微调 Embedding 优化 RAG

大型语言模型 (LLM) 向用户和组织展示了巨大的潜力&#xff1b;它们的强大功能和生成能力使它们最近广受欢迎并被广泛接受。LLM 面临的一些缺点是无法以上下文感知的方式生成或响应用户给出的提示&#xff0c;听起来非常通用和开放&#xff0c;或者有时响应的信息已经过时。如果…

微信小程序生成二维码

目前是在开发小程序端 --> 微信小程序。然后接到需求&#xff1a;根据 form 表单填写内容生成二维码&#xff08;第一版&#xff1a;表单目前需要客户进行自己输入&#xff0c;然后点击生成按钮实时生成二维码&#xff0c;不需要向后端请求&#xff0c;不存如数据库&#xf…

用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(二)

概述 从 WWDC 24 开始&#xff0c;苹果推出了全新的测试机制&#xff1a;Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式&#xff0c;并且使得单元测试更加灵动自由&#xff0c;更符合 Swift 语言的优雅品味。 在这里我们会和大家一起初涉并领略…

Python的自然语言生成与对话系统介绍

1. 背景介绍 自然语言生成(Natural Language Generation&#xff0c;NLG)和对话系统是人工智能领域的重要研究方向。NLG 涉及将计算机理解的信息转换为自然语言文本&#xff0c;而对话系统则涉及计算机与用户之间的自然语言交互。Python 作为一种易于学习、易于使用的编程语言…

HarmonyOS NEXT 应用开发实战(十、从零设计一款个人中心页面详细示例)

随着HarmonyOS的不断发展&#xff0c;越来越多的开发者开始关注这个平台上的应用开发。本篇文章将详细讲解如何从零开始设计一款个人中心页&#xff0c;并在代码中实现其相关功能。 1. 项目结构设计 首先&#xff0c;我们需要设计一个合理的项目结构。我们将个人中心页面分为几…

Node.js 入门指南:从零开始构建全栈应用

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;node.js篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来node.js篇专栏内容:node.js-入门指南&#xff1a;从零开始构建全栈应用 前言 大家好&#xff0c;我是青山。作…

我们来学mysql -- 连接(原理版)

我们来学mysql -- 连接 题记两张表驱动表 题记 回到初学者的视角&#xff0c;navicat或命令窗口&#xff0c;呈现一行行数据&#xff0c;类比为excel工作薄更是深入人心通过join将多表的记录关联起来&#xff0c;这似乎也没啥问题只是好像是那么回事&#xff0c;又…似乎有想说…

ssm校园二手交易管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 系统开发技术 3 2.1 MySQL数…