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

在这里插入图片描述

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

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

相关文章

世界技能竞赛大数据应用开发环境1:1还原

关注我&#xff0c;私信我获得集群环境 集群情况 模块A搭建环境&#xff0c;在容器中搭建大数据平台 Hadoop HA环境 Pc机&#xff0c;安装安装比赛需要软件 模块B中使用idea快速开发完成数据处理 模块E包含了接口数据&#xff0c;使用vs code快速搭建vue数据可视化

【c++丨STL】vector模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、vector底层刨析 二、模拟实现 1. 属性、迭代器以及函数声明 2. 功能实现 交换两个容器的内容 构造函数 拷贝构造 赋值重载 析构…

指针的运用

接下来我将会用的话&#xff0c;讲解我对指针运用仅有的印象 1.解引用 int a23; int*p&a; *p666; 而*p666&#xff1b;&#xff0c;便是解引用操作&#xff0c;跟简单地说*p便是解引用&#xff0c;它的意思是&#xff0c;对p中所储存的地址所在位置的内容进行操作&#xf…

三周精通FastAPI:38 针对不同的编程语言来生成客户端

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/advanced/generate-clients/ 生成客户端 因为 FastAPI 是基于OpenAPI规范的&#xff0c;自然您可以使用许多相匹配的工具&#xff0c;包括自动生成API文档 (由 Swagger UI 提供)。 一个不太明显而又特别的优势是&#…

广告联盟有哪些

随着互联网的发展&#xff0c;越来越多的人开始投身于网站建设和运营。对于站长来说&#xff0c;如何在提供优质内容的同时获取收益是一个重要的问题。广告联盟作为一种常见的盈利模式&#xff0c;受到了广大站长的青睐。本文将介绍5个适合国内站长的广告联盟平台&#xff0c;帮…

兵马未动,粮草先行-InnoDB统计数据是如何收集的

我们前面介绍查询成本的时候经常用到一些统计数据&#xff0c;比如通过SHOW TABLE STATUS可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;本章将聚焦…

【Promise】JS 异步之宏队列与微队列

文章目录 1 原理图2 说明3 相关面试题3.1 面试题13.2 面试题23.3 面试题33.4 面试题4 1 原理图 2 说明 JS 中用来存储待执行回调函数的队列包含 2 个不同特定的队列&#xff1a;宏队列和微队列。宏队列&#xff1a;用来保存待执行的宏任务(回调)&#xff0c;比如&#xff1a;定…

基础概念理解

一&#xff0c;数据结构分类 连续结构&#xff0c;跳转结构。 二&#xff0c;对变量的理解 在 C 语言中&#xff0c;变量是用于存储数据的抽象符号。变量本质上是一块内存区域的标识符&#xff08;即它代表内存中的某一块区域&#xff09;&#xff0c;用来存储数据&#xff…

C 学习(4)

return 0; 前提&#xff1a;C 语言规定&#xff0c;main()是程序的入口函数&#xff0c;即所有的程序一定要包含一个main()函数。程序总是从这个函数开始执行&#xff0c;如果没有该函数&#xff0c;程序就无法启动。其他函数都是通过它引入程序的。 main()的写法&#xff0c…

欺诈文本分类检测(十八):基于llama.cpp+CPU推理

1. 前言 前文我们用Lora训练出自己的个性化模型后&#xff0c;首先面临的问题是&#xff1a;如何让模型在普通机器上跑起来&#xff1f;毕竟模型微调时都是在几十G的专用GPU上训练的&#xff0c;如果换到只有CPU的普通电脑上&#xff0c;可能会面临几秒蹦一个词的尴尬问题。 …

工程数学线性代数(同济第七版)附册课后习题答案PDF

《线性代数附册 学习辅导与习题全解》是与同济大学数学科学学院编《工程数学 线性代数》第七版教材配套的教学辅导书&#xff0c;由同济大学作者团队根据教材内容和要求编写而成。本书在《工程数学 线性代数》第六版附册&#xff08;即辅导书&#xff09;的基础上修改而成。全书…

传输层协议、ACL

第六章 传输层协议、ACL 文章目录 第六章 传输层协议、ACL1.TCP和UDP协议1.1 TCP协议1.2 TCP报文段1.3 TCP连接 2.UDP协议3.ACL概述ACL原理及种类ACL组成规则编号通配符&#xff08;反掩码&#xff09; 4.ACL应用ACL匹配规则ACL匹配规则 1.TCP和UDP协议 TCP/IP协议族的传输层协…

(蓝桥杯C/C++)——搜索

一、回溯法 1.回溯法简介 回溯法一般使用 ** DFS(深度优先搜索) ** 实现&#xff0c;DFS是一种遍历或搜索图、树或图像等数据结构的算法&#xff0c;当然这个图、树未必要存储下来(隐式处理就是回溯法)&#xff0c;常见的是通过某种关系构造出的搜索树&#xff0c;搜索树一般…

Turtlebot3 buger 硬件与操作平台详细介绍

引言 TurtleBot3 有三个版本&#xff0c;分别是紧凑型的 Burger、功能更强的 Waffle和性能提升的 Waffle Pi&#xff0c;分别适用于不同的应用需求。使用 Raspberry Pi 作为主控单板计算机&#xff08;SBC&#xff09;&#xff0c;而 Waffle Pi 可以使用更强大的 NVIDIA Jetson…

Ubuntu实现双击图标运行自己的应用软件

我们知道在Ubuntu上编写程序&#xff0c;最后编译得到的是一个可执行文件&#xff0c;大致如下 然后要运行的时候在终端里输入./hello即可 但是这样的话感觉很丑很不方便&#xff0c;下边描述一种可以类似Windows上那种双击运行的实现方式。 我们知道Ubuntu是有一些自带的程序…

Chromium Mojo(IPC)进程通信演示 c++(4)

122版本自带的mojom通信例子仅供学习参考&#xff1a; codelabs\mojo_examples\01-multi-process 其余定义参考文章&#xff1a; Chromium Mojo(IPC)进程通信演示 c&#xff08;2&#xff09;-CSDN博客 01-mojo-browser.exe 与 01mojo-renderer.exe进程通信完整例子。 一、…

基于Prometheus的client_golang库实现应用的自定义可观测监控

文章目录 1. 安装client_golang库2. 编写可观测监控代码3. 运行效果4. jar、graalvm、golang编译运行版本对比 前文使用javagraalvm实现原生应用可观测监控&#xff1a; prometheus client_java实现进程的CPU、内存、IO、流量的可观测&#xff0c;但是部分java依赖包使用了复杂…

【C++课程学习】:继承(上)(详细讲解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一.继承的概念和定义 &#x1f384;继承的概念&#xff1a; &#x1f384;继承的定义&#xff1a; …

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

Android JNI 技术入门指南

引言 在Android开发中&#xff0c;Java是一种主要的编程语言&#xff0c;然而&#xff0c;对于一些性能要求较高的场景&#xff08;如音视频处理、图像处理、计算密集型任务等&#xff09;&#xff0c;我们可能需要使用到C或C等语言来编写底层的高效代码。为了实现Java代码与C…