JS渗透(安全)

news2024/11/5 20:22:40

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

在这里插入图片描述

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

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

相关文章

Redis为什么用跳表实现有序集合

Redis为什么用跳表实现有序集合 手写一个跳表 为了更好的回答上述问题以及更好的理解和掌握跳表&#xff0c;这里可以通过手写一个简单的跳表的形式来帮助读者理解跳表这个数据结构。 我们都知道有序链表在添加、查询、删除的平均时间复杂都都是 O(n) 即线性增长&#xff0c…

影刀RPA实战:嵌入python,如虎添翼

1. 影刀RPA与Python的关系 影刀RPA与Python的关系可以从以下几个方面来理解&#xff1a; 技术互补&#xff1a;影刀RPA是一种自动化工具&#xff0c;它允许用户通过图形化界面创建自动化流程&#xff0c;而Python是一种编程语言&#xff0c;常用于编写自动化脚本。影刀RPA可以…

GR2——在大规模视频数据集上预训练且机器人数据上微调,随后预测动作轨迹和视频(含GR1详解)

前言 上个月的24年10.9日&#xff0c;我在朋友圈看到字节发了个机器人大模型GR2&#xff0c;立马去看了下其论文(当然了&#xff0c;本质是个技术报告) 那天之后&#xff0c;我就一直想解读这个GR2来着 然&#xff0c;意外来了&#xff0c;如此文《OmniH2O——通用灵巧且可全…

HarmonyOS NEXT应用元服务开发组合场景

在一些场景中&#xff0c;一个功能上完整的UI对象可能是由若干个更小的UI组件组合而成的。若每一个小的UI组件都可以获焦并朗读&#xff0c;则会造成信息冗余和效率降低。同时由于可聚焦的组件过多过细&#xff0c;也会影响触摸浏览时走焦的性能体验。在这种情况下&#xff0c;…

2024双11高端家用投影仪哪个牌子好?当贝因何力压极米坚果

随着生活水平的日益提升与科技的飞速进步&#xff0c;人们不只通过外出游玩来获得身心的愉悦&#xff0c;也通过提升家庭娱乐生活的品质&#xff0c;来获得足不出户的快乐。在2024年双11购物狂欢节之际&#xff0c;很多家庭都纷纷将高端家用投影仪加入购物清单&#xff0c;但各…

SpringBoot day 1104

ok了家人们这周学习SpringBoot的使用&#xff0c;和深入了解&#xff0c;letgo 一.SpringBoot简介 1.1 设计初衷 目前我们开发的过程当中&#xff0c;一般采用一个单体应用的开发采用 SSM 等框架进行开发&#xff0c;并在 开发的过程当中使用了大量的 xml 等配置文件&#x…

HCIP(7)-边界网关协议BGP基本配置(对等体peer,宣告network,引入import)

边界网关协议&#xff08;Border Gateway Protocol&#xff0c;BGP&#xff09;是一种用来在路由选择域之间交换网络层可达性信息&#xff08;Network Layer Reachability Information&#xff0c;NLRI&#xff09;的路由选择协议。由于不同的管理机构分别控制着他们各自的路由…

算法: 链表题目练习

文章目录 链表题目练习两数相加两两交换链表中的节点重排链表合并 K 个升序链表K 个一组翻转链表 总结 链表题目练习 两数相加 坑: 两个链表都遍历完后,可能需要进位. class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode cur1 l1;ListNode…

HTML 基础标签——元数据标签 <meta>

文章目录 1. `<meta>` 标签概述2. 属性详解2.1 `charset` 属性2.2 `name` 属性2.3 `content` 属性2.4 `http-equiv` 属性3. 其他常见属性小结在 HTML 文档中,元数据标签 <meta> 是一种重要的标签,用于提供关于文档的信息,这些信息不直接显示在网页内容中,但对于…

新闻稿件管理系统:SpringBoot框架深度解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

【网络】自定义协议——序列化和反序列化

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是序列化和分序列&#xff0c;并且自己能手撕网络版的计算器。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…

CTFshow之信息收集第1关到10关。详细讲解

得而不惜就该死&#xff01; --章总 开始新的篇章&#xff01; 零、目录 一、实验准备 1、ctf网站&#xff1a;ctf.show 2、工具&#xff1a;chrome浏览器、hackbar插件 3、burpsuite抓包工具 二、实验技巧 &#xff08;一&#xff09;F12摸奖 源码泄露 &#xff08;二…

Redis ——发布订阅

问题引入&#xff1a; 服务器A、B、C、D&#xff0c;客户端&#xff1a;C1&#xff0c;C2&#xff0c;C3&#xff0c;C4&#xff1b; 客户端基于集群聊天服务器的负载均衡分配&#xff1b; C1 被分配到A&#xff0c;C2 被分配到B&#xff0c;C3 被分配到C&#xff0c;C4 被分…

【漏洞复现】某平台-QRcodeBuildAction-LoginSSO-delay-mssql-sql注入漏洞

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…

API网关 - JWT认证 ; 原理概述与具体实践样例

API网关主要提供的能力&#xff0c;就是协议转换&#xff0c;安全&#xff0c;限流等能力。 本文主要是分享 如何基于API网关实现 JWT 认证 。 包含了JWT认证的流程&#xff0c;原理&#xff0c;与具体的配置样例 API网关认证的重要性 在现代Web应用和微服务架构中&#x…

Excel:vba实现批量插入图片

实现的效果&#xff1a; 实现的代码&#xff1a; Sub InsertImageNamesAndPictures()Dim PicPath As StringDim PicName As StringDim PicFullPath As StringDim RowNum As IntegerDim Pic As ObjectDim Name As String 防止表格里面有脏数据Cells.Clear 遍历工作表中的每个图…

什么是 OpenTelemetry?

OpenTelemetry 定义 OpenTelemetry (OTel) 是一个开源可观测性框架&#xff0c;允许开发团队以单一、统一的格式生成、处理和传输遥测数据&#xff08;telemetry data&#xff09;。它由云原生计算基金会 (CNCF) 开发&#xff0c;旨在提供标准化协议和工具&#xff0c;用于收集…

电商美工必备神器:千鹿 AI 轻松解决场景图主图尺寸问题

前言 在电商领域&#xff0c;美工在做详情页设计时&#xff0c;常常会为图片尺寸问题而苦恼。而 AI 扩图在此刻就成为了美工们的得力助手。其中&#xff0c;场景图主图太小是一个让人颇为头疼的难题。千鹿 AI 作为一款强大的工具&#xff0c;能够一键将图片改成指定尺寸&#…

关于 PDF 抽取的吐槽

今天一下午写了8&#xff0c;9个 PDF 抽取的脚本。最后又回归最开始简单的模式了&#xff0c;要疯了&#xff0c;谁懂啊。 我是下午的工作是这样的(我是这么疯的) 最开始使用最简单的策略&#xff0c;先使用 PyPDF2.PdfReader(file) 读取文件&#xff0c;然后在每一页使用 pag…

无人机避障——(局部规划方法)DWA(动态窗口法)

传统的DWA算法更加倾向于车辆等差速无人车&#xff0c;旋翼无人机是全速的&#xff0c;全向的。 全局路径是通过A*算法生成的 局部路径规划效果&#xff1a; DWA算法效果&#xff1a; 过程图&#xff1a; 完整过程&#xff1a; PID算法效果&#xff1a; 过程图&#xff1a…