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
相关文章:

JS渗透(安全)
JS逆向 基本了解 作用域: 相关数据值 调用堆栈: 由下到上就是代码的执行顺序 常见分析调试流程: 1、代码全局搜索 2、文件流程断点 3、代码标签断点 4、XHR提交断点 某通js逆向结合burp插件jsEncrypter 申通快递会员中心-登录 查看登录包…...

淘宝扭蛋机小程序,功能优势分析
随着潮玩文化的影响,扭蛋机作为潮玩的鼻祖,又再次成为了大众的“宠儿”。扭蛋机通过与多种IP结合,创造出各种元素的商品,为大众带来娱乐、收藏的新方式。我国潮玩市场规模正在大幅度的增长,将达到千亿元,发…...
Redis 数据备份与恢复
Redis 数据备份与恢复 引言 Redis 作为一种高性能的键值存储数据库,在许多应用场景中扮演着重要的角色。然而,数据的安全性是任何数据库系统都需要关注的问题。为了确保数据的安全和完整性,定期进行数据备份和掌握恢复策略是至关重要的。本文将详细介绍 Redis 数据备份与恢…...
CentOS9 Stream 设置禁用IPV6
CentOS9 Stream 设置禁用IPV6 方法 1: 修改 sysctl 配置方法 2: 使用 NetworkManager方法 3: 禁用内核参数验证 IPv6 是否禁用 在 CentOS 9 Stream 中,您可以通过以下步骤禁用 IPv6: 方法 1: 修改 sysctl 配置 编辑 sysctl 配置文件: 打开 /…...

C语言 | Leetcode C语言题解之第530题二叉搜索树的最小绝对差
题目: 题解: void dfs(struct TreeNode* root, int* pre, int* ans) {if (root NULL) {return;}dfs(root->left, pre, ans);if (*pre -1) {*pre root->val;} else {*ans fmin(*ans, root->val - (*pre));*pre root->val;}dfs(root->…...
【系统设计】高效的分布式系统:使用 Spring Boot 和 Kafka 实现 Saga 模式
在现代分布式系统中,管理跨多个服务的长事务至关重要。传统的分布式事务解决方案往往面临性能瓶颈和复杂性问题,而 Saga 模式 作为一种灵活高效的解决方案,逐渐受到开发者的青睐。本文将探讨如何利用 Spring Boot 和 Kafka 实现 Saga 模式&am…...
蓝桥杯 python day01 第一题
1. 确定字符串是否包含唯一字符 确定字符串是否包含唯一字符 题目描述 实现一个算法来识别一个字符串的字符是否是唯一的(忽略字母大小写)。 若唯一,则输出YES,否则输出NO。 输入描述 输入一行字符串,长度不超过…...

10款好用的win10录屏软件带你体验专业录屏。
其实win10系统的设备上有自带的录屏功能,还有powerpoint里面也有录屏工具可以使用。如果有朋友觉得里面的功能并不能够满足自己的录屏需求的话,可以用专门的录屏软件来完成。比如我最近找到的这4款工具,录制的视频效果好,操作还方…...

2025浙江省考报名流程详细教程
2025年浙江省考报名马上就要开始了,有想要参加浙江省考的同学,可以提前看一下报名流程,和报名照要求。 报名时间:11月6日9时一11月11日17时 南核时间:11月6日9时一11月13日17时 缴费时间:11月14日9时一11月…...
unity3d——关于GetComponent<T>()
先看代码: TankBaseObj obj other.GetComponent<TankBaseObj>();if(obj ! null){//说明是坦克打到坦克 受伤处理 固定不会受伤 移动的会受伤obj.Wound(fatherObj);} TankBaseObj 是一个基类 wound是一个虚函数 子类已经重新实现 当你的游戏对象依附…...

Spring 框架中常见的注解(Spring、SpringMVC、SpringBoot)
1. Spring 中常见注解 还有Recourse:相当于AutowiredQualifier Value : 用于将配置文件中的值注入到Bean的字段中。 Bean : 用于在配置类中声明一个Bean。 Lazy : 用于延迟加载Bean。 2. SpringMVC 中常见注解 还有GetMapping PostMapping PutMapping DeleteMapp…...

Hms?: 1渗透测试
靶机:Hms?: 1 Hms?: 1 ~ VulnHub 攻击机:kail linux 2024 主机扫描阶段发现不了靶机,所以需要按DriftingBlues2一样手动配置网卡 1,将两台虚拟机网络连接都改为NAT模式,并查看靶机的MAC地址 2,攻击机上做主机扫描发现…...

1、Qt6 Quick 简介
一、Qt6 Quick 简介 1、Qt Quick简介 Qt Quick 是 Qt 6 中使用的用户界面技术的总称。它是在 Qt 4 中引入的,现在在 Qt 6 中进行了扩展。Qt Quick 本身是几种技术的集合: QML——用户界面标记语言JavaScript - 动态脚本语言Qt C - 高度可移植的增强型…...
大模型论文集-20241103
Investigating the catastrophic forgetting in multimodal large language models 研究问题 本文探讨了多模态大型语言模型(MLLMs)在学习新任务时的灾难性遗忘现象。研究者关注于在添加新数据集后,模型是否能够保留之前学到的知识而不忘记…...

GESP4级考试语法知识(计数排序-桶排序)
整数排列参考程序代码: #include<iostream> #include<cstring> using namespace std; int main() {int a[101],n,i,j,k;memset(a,0,sizeof(a)); //数组清0cin>>n; //输入数字个数for(i1;i<n;i) {cin>>k; //输…...

红队-shodan搜索引擎篇
如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.shodan原理与功能的介绍 Shodan Search Engine 它是专门搜网络设备的,只要联网的,只要有IP地址的都可以称为网络设备 1.shodan&#x…...
SQL 数据结构查询
1:查询变得结构。 SELECT COLID,SO.NAME,EP.VALUE,SO.LENGTH,MIN(ST.NAME) AS TYPE FROM SYS.EXTENDED_PROPERTIES EP RIGHT JOIN SYS.SYSCOLUMNS SO ON MAJOR_IDID AND COLIDMINOR_ID LEFT JOIN SYS.SYSTYPES ST ON ST.XTYPESO…...

《高频电子线路》—— 角度调制(调相、调频)
文章内容来源于【中国大学MOOC 华中科技大学通信(高频)电子线路精品公开课】,此篇文章仅作为笔记分享。 目录 角度调制(调相、调频) 角度调制的原因 调频VS调幅 角度调制的分类 本章重难点 调相 时域࿰…...

危机来临前---- 力扣: 876
危机即将来临 – 链表的中间节点 描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 示例: 何解? 1、遍历找到中间节点 : 这个之在回文链表中找…...
langchain调用chatgpt对文本进行编码
1.导包 from langchain_openai import OpenAIEmbeddings2.加载编码器 embeddings_model OpenAIEmbeddings(model"text-embedding-3-large",base_url"https://api.chatanywhere.tech/v1")3.编码 embeded_result embeddings_model.embed_documents([&qu…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...