JS前端逆向

前言

js逆向一直没有相关了解,虽然目前渗透遇见的不是很多,大多数遇见的要么不加密,要么无法实现其加密流程,不过最近看到了一个较为简单的站点正好能够逆向出来,就做了简单记录。本文旨在介绍js逆向的一些基础思路,希望能对初学js前端逆向的师傅有所帮助。

JS定位

在我们寻找JS源代码时,如果直接翻看全部的js文件以来寻找自己想要的一部分,无疑是复杂繁琐的,且工作量巨大,有点类似大海捞针,因此这里我们需要借助一些巧妙的办法来快速定位某标签的js语句,具体方法如下。

元素审查定位

当我们不确定某处的js文件位置时,可以使用F12,点击元素审查,然后点击登录处,观察事件监听器

10202fd1ce4033a39838b620bb38bac2.png

此时可以观察到login.js文件出现,接下来就可以去对应文件下继续深入。

74119dd63c55951febc0e3399f86444f.png

发现check函数,寻找check函数

9f6d9ba1351ea58a5823c7d1f1c206b8.png

此时发现加密是secret函数,再继续跟secert函数就可以了解其整体流程。

全局搜索法

像我们常见的登录框,他们要提交的加密参数一般名为password,或者加密为Crypto加密,因此我们可以全局搜索此类关键字,进而寻找我们需要找的关键加密js语句,进而实现js逆向。

具体操作也很简单,这里简单举个例子。

首先打开F12,随便点击一个元素,而后ctrl+shift+f,接下来全局搜索关键词即可

45d0a444f5e12f848905dd3301a95213.png

此时含关键词的语句映入眼帘,像一些css文件中的直接略过即可,而后即可找到真正生成密码的地方

151dd77eec31acb0e008540125f57d10.png

接下来便可以深入secret,了解加密方法。

Onclick定位

像一些登录点是存在着onclick属性的,如若该属性值是js函数,那么就极有可能是我们要寻找的js加密函数,而后进行寻找相关函数即可。

注:图参考自cony1大师傅。

cony1大师傅的图为例进行简单讲解

43137187722edea767a4c448f5942040.png

这里发现ssologin函数,接下来寻找该函数

2603c101be228feea7c8702fb38170fa.png

此时即可发现相关js语句。

实战

某登录站点js逆向

找到一个登录站点,随意输入

392d9da37dae1ede6c9c848bce914845.png

发现用户名和密码均被加密,接下来ctrl+shift+f,全局搜索password字段,寻找加密点

fc0a91102d78f4f48a0475c00403db5b.png

第一个这里明显是输入框的password,且是注释,肯定不是这里,接着寻找,后来到

6e6e09fd2e6d4089babf45b03ceb2110.png

整体代码如下

function check() {//这里将用户名,密码加密var code = 'letu@levle';var yname = $("#yname").val();if (yname == '') {alert("用户名不能为空");return false;} else {var newName = secret(yname, code, false);$("#xname").val(newName);}var ypassword = $("#ypassword").val();if (ypassword == '') {alert("密码不能为空");return false;} else {var newPassword = secret(ypassword, code, false);$("#xpassword").val(newPassword);}}

可以看出js代码逻辑并不难,首先提取出ypassword标签下的内容,而后验证其是否为空,若不为空,则对其进行secret函数处理,很明显,这个secret函数就是加密函数,所以我们接下来跟进此加密函数

c738e3a6d1cbaea439fd4747364e7b5f.png

这里直接给出了iv和key,所以接下来打断点调试就行了,而后打上断点

941554c39f95053a7d95353a3a6a7bc7.png

接下来开始随便输入密码提交,而后来到调试界面

选中code.substring(16)得到keyf3991777154f4bd0

58af0c7f0c1188bb2f53c26939eae479.png

选中code.substring(0,16)得到偏移量ace43e65106a77f6

b34b18f9b01a10ffa8aae2e585e3d8ee.png

下方也给出了Padding和mode分别是Pkcs7CBC,所以接下来直接解密即可,在网络中我们可以看到提交后加密的账密

d67c7a9ec9e2e3823a8d2758a662e330.png

拿去随便找个AES解密网站

290c95e35b0b0e8de4e62769c9849615.png

与所输入的进行比对

4c3feb9c997b7bca58832bda7c38eaa3.png

成功得到正确结果

接下来编写脚本即可,直接将字典的内容全部进行加密,而后放入burp进行爆破

import base64
from Crypto.Cipher import AES
from Crypto.Hash import MD5
from Crypto.Util.Padding import pad#填入AES的key和iv
key = 'f3991777154f4bd0'
iv = 'ace43e65106a77f6'def AES_Encrypt(data):global keyglobal ivcipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))paddingdata = pad(data.encode('utf-8'),AES.block_size)encrypted = cipher.encrypt(paddingdata)#print(base64.b64encode(encrypted).decode())return base64.b64encode(encrypted).decode()password = []
with open('password.txt','r',encoding='utf-8') as f:for i in f:password.append(i.strip())
with open('password_aes.txt','w',encoding='utf-8') as w:for i in password:data = AES_Encrypt(i)+'\n'w.write(data)
1e323a571b76bce12d63dc41b4d89623.png

数据长度明显与错误时不一致,不过这里也未成功进入后台,有二次验证,Google验证码无从下手,故点到为止。

某道js逆向

6c8164d5eeb6e58f4ee5da52e54dfcd7.png

接下来进行抓包

c7721dae66c6d0f23afab4bc342a11b3.png

这里我们首先注意一下每次不同点在哪,以此为入口点来进行下去,因此我们多次刷新界面抓包,同样的参数观察包的参数哪个值是不同的

e44f404943e3439eef5e5d5128a92530.png

从上图可以看出signmysticTime是变化的,因此接下来针对这两个变量进行深入,如果我们能够控制这两个变量,那么我们就可以实现直接脚本请求得到翻译对应的语句。

所以接下来首先从sign开始,我们首先进行F12,而后输入ctrl+shift+f全局搜索关键词

45f12809760686e8e6654da837d96477.png

这里可以发现出现了js中含有sign关键字的,但像这个inpage.js他明显不是我们要找的js语句,因此继续往下寻找(输入sign:更容易找到对应函数)。这里我们找到如下语句

2fc46537484f7ebd1f442c45f9960288.png

相关代码如下

const u = "fanyideskweb", d = "webfanyi", m = "client,mysticTime,product", p = "1.0.0", g = "web", b = "fanyi.web", A = 1, h = 1, f = 1, v = "wifi", O = 0;function y(e) {return c.a.createHash("md5").update(e).digest()}function j(e) {return c.a.createHash("md5").update(e.toString()).digest("hex")}function k(e, t) {return j(`client=${u}&mysticTime=${e}&product=${d}&key=${t}`)}function E(e, t) {const o = (new Date).getTime();return {sign: k(o, e),client: u,product: d,appVersion: p,vendor: g,pointParam: m,mysticTime: o,keyfrom: b,mid: A,screen: h,model: f,network: v,abtest: O,yduuid: t || "abcdefg"}}

这里可以看到sign是由函数k构成的,同时注意到这里也给出了k的参数,k是由client=fanyideskweb&mysticTime=${e}&product=webfanyi&key=${t}所组成的,此时再看函数E,o是时间戳,e这里未知,这时候该怎么办呢,先看看他是不是固定值,当自己不确定在哪下断点调试时,就在附近的几个可疑点都打下断点,观察e的值即可

3ee3e50500e00b38a8ed4e9ceac80d48.png

经观察,这里的e值是固定的,即fsdsogkndfokasodnaso,此时k(o,e)中的参数我们都了解了,但我们注意到k函数中是有j在外包裹的,因此我们需要对j函数进行相关了解

function j(e) {return c.a.createHash("md5").update(e.toString()).digest("hex")}

明显的md5加密,因此到这里也就都清楚了。

当我们进行请求时,首先获取当前的时间戳,此作为参数之一,同时与client等参数值组合,进行md5加密,就组成了sign的值。对于mysticTime这个参数,我们从k函数也了解到它其实就是时间戳,因此两个变化的参数到目前就都了解其生成过程了。

接下来尝试写python脚本

import hashlib
import time
import requestsrequests.packages.urllib3.disable_warnings()
headers = {"Content-Length": "312",
"Pragma": "no-cache",
"Cache-Control": "no-cache",
"Sec-Ch-Ua": "\"Google Chrome\";v=\"119\", \"Chromium\";v=\"119\", \"Not?A_Brand\";v=\"24\"",
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/x-www-form-urlencoded",
"Sec-Ch-Ua-Mobile":"?0",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
"Sec-Ch-Ua-Platform": "\"Windows\"",
"Origin": "https://fanyi.youdao.com",
"Sec-Fetch-Site": "same-site",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty",
"Referer": "https://fanyi.youdao.com/",
"Accept-Encoding": "gzip, deflate",
}
Cookie = {
"OUTFOX_SEARCH_USER_ID":"239978291@10.130.108.41",
"OUTFOX_SEARCH_USER_ID_NCOO":"520521807.43848985"
}
url = ""
word = input("请输入翻译内容:")
localtime = str(int(time.time() * 1000))
canshu = "client=fanyideskweb&mysticTime={}&product=webfanyi&key=fsdsogkndfokasodnaso".format(localtime)
sign = hashlib.md5(canshu.encode(encoding='utf8')).hexdigest()
data = {"i": f"{word}","from": "auto","to": "","dictResult": "true","keyid": "webfanyi","sign": sign,"client": "fanyideskweb","product": "webfanyi","appVersion": "1.0.0","vendor": "web","pointParam": "client,mysticTime,product","mysticTime": localtime,"keyfrom": "fanyi.web"
}
res = requests.post(url=url,headers=headers,cookies=Cookie,data=data,verify=False)
print(res.text)
564ab829c4fb065b119336f50f7caaf5.png

此时便得到了加密数据,解密同理,不再阐述。

参考

https://www.freebuf.com/articles/web/381666.html

https://gv7.me/articles/2018/fast-locate-the-front-end-encryption-method/

https://www.cnblogs.com/wxd501/p/17070184.html

原创稿件征集

征集原创技术文章中,欢迎投递

投稿邮箱:edu@antvsion.com

文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关

通过审核并发布能收获200-800元不等的稿酬。

更多详情,点我查看!

51fd1562f20f78f151401108996ff4af.gif

参与靶场实战,戳"阅读原文"

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

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

相关文章

spring cache 学习 —— @Cacheable 使用详解

1. 功能说明 Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。 注意,这…

蓝桥杯真题:四平方和

import java.io.*;/*先找后两个数for(int i 0; 2 * i * i < n;i)for(int j i; i * i j * j < n;j ) 再找前两个数 for(int i 0;4 * i * i < n; i )for(int j i;2 * (j * j i * i) < n;j )//这样就可以让后两个数尽量大,前两个数尽量小 这样就可以确定后…

HTML5+CSS3+Vue小实例:浪漫的心形文字动画特效

实例:浪漫的心形文字动画特效 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 需要环境或者解析可以私信 &#xff08;二&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&…

行业分析:2023年藜麦市场竞争格局及发展现状分析

藜麦是藜科藜属植物。穗部可呈红、紫、黄&#xff0c;植株形状类似灰灰菜&#xff0c;成熟后穗部类似高粱穗。植株大小受环境及遗传因素影响较大&#xff0c;从0.3-3米不等&#xff0c;茎部质地较硬&#xff0c;可分枝可不分。单叶互生&#xff0c;叶片呈鸭掌状&#xff0c;叶缘…

Pytorch CIFAR10图像分类 Swin Transformer篇

Pytorch CIFAR10图像分类 Swin Transformer篇 文章目录 Pytorch CIFAR10图像分类 Swin Transformer篇4. 定义网络&#xff08;Swin Transformer&#xff09;Swin Transformer整体架构Patch MergingW-MSASW-MSARelative position biasSwin Transformer 网络结构Patch EmbeddingP…

数据结构学习笔记——二叉树的遍历和链式存储代码实现二叉树

目录 一、二叉树的遍历&#xff08;一&#xff09;二叉树的先序遍历&#xff08;DLR&#xff09;&#xff08;二&#xff09;二叉树的中序遍历&#xff08;LDR&#xff09;&#xff08;三&#xff09;二叉树的后序遍历&#xff08;LRD&#xff09;&#xff08;四&#xff09;先…

如何使用群晖管家结合内网穿透实现公网远程访问本地黑群晖

白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01; 文章目录 白嫖怪狂喜&#xff01;黑群晖也能使用群晖管家啦&#xff01;1.使用环境要求&#xff1a;2.下载安装群晖管家app3.随机地址登陆群晖管家app4.固定地址登陆群晖管家app 自己组装nas的白嫖怪们虽然也可以通…

微信小程序引入node_modules依赖

微信小程序不支持直接读取node_modules 首先在目录文件夹下cmd输入npm init命令 D:\小程序\project\calendar\calendar_1>npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible…

linux resin的安装

1. 下载安装包 1.1 下载地址&#xff1a;https://caucho.com/products/resin/download 这里我下载的是普通版本的resin&#xff0c;没有选resin pro 版本。 科普一下&#xff0c;从性能上来说 resin和resin pro 版本的性能没区别。 resin pro 版本的 和resin 普通版本的文件是…

无惧泄密:揭秘上海迅软DSE防拷贝大杀器!

对于企事业单位而言&#xff0c;文档的安全保护不仅要从源头上进行&#xff0c;杜绝文档在使用、传播过程中产生的泄密风险&#xff0c;同时也要对文档内容本身进行保护。为防止有心人通过拷贝、截屏、拍照等方式盗窃走重要文档内容信息的情况&#xff0c;天锐绿盾文件防泄密软…

HTTP 缓存机制

一、强制缓存 只要浏览器判断缓存没有过期&#xff0c;则直接使用浏览器的本地缓存而无需再请求服务器。 强制缓存是利用下面这两个 HTTP 响应头部&#xff08;Response Header&#xff09;字段实现的&#xff0c;它们都用来表示资源在客户端缓存的有效期&#xff1a; Cache…

Python基础快速过一遍

文章目录 一、变量及基本概念1、变量2、变量类型3、变量格式化输出4、type()函数5、input()函数6、类型转换函数7、注释 二、Python运算/字符1、算数运算2、比较运算3、逻辑运算4、赋值运算符5、转义字符6、成员运算符 三、判断/循环语句1、if判断语句2、while循环语句3、for循…

等保测评报价相差很大,里面有什么门道

等保测评报价的差异主要源于以下几点&#xff1a; 服务质量评估标准不同&#xff1a;不同的测评机构在测评过程中所提供的服务范围、深度、细节等方面可能存在差异&#xff0c;因此导致报价有所不同。一些机构可能提供全面且细致的测评服务&#xff0c;致力于提供高质量的等保测…

openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数

文章目录 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数139.1 操作步骤139.2 异常处理 openGauss学习笔记-139 openGauss 数据库运维-例行维护-检查应用连接数 如果应用程序与数据库的连接数超过最大值&#xff0c;则新的连接无法建立。建议每天检查连…

一种结构新颖的双通带超导滤波器设计

闫鑫1,2&#xff0c;季来运1&#xff0c;张浩1,2&#xff0c;李颢毅1,2&#xff0c;王昭月1,2&#xff0c;曹凤莹1,2 &#xff08;1.天津海芯电子有限公司&#xff0c;天津300380&#xff1b;2.天津师范大学物理与材料科学学院&#xff0c;天津 300387.&#xff09; 摘要&…

前端dark主题的快速构建与切换

首先在全局css样式中增加一个 dark 模式即可&#xff0c;主要就是filter这个属性&#xff0c; invert(1);则表示100%完全反转样式&#xff0c;通俗点就是颠倒黑白&#xff0c;白的让它变成黑的&#xff0c;黑的让它变成白的。 css中的filter函数总结 filter:invert(1);数值范围…

Leetcode题库(数据库合集)_ 难度:简单

目录 难度&#xff1a;简单1. 组合两个表2. 第二高的薪水3. 第N高的薪水4. 分数排名5. 连续出现的数字6. 超过经理收入的员工7. 重新8. 寻找用户推荐人9. 销售员10. 排名靠前的旅行者11. 患某种疾病的患者12. 修复表中的名字13. 求关注者的数量14. 可回收且低脂的产品15. 计算特…

前后端参数传递总结

1、 页面参数 js传递参数 渲染表格 页面控制器&#xff08;前端&#xff09; 后端控制器 后端服务 实体赋值 2、跟踪情况

场景实践 | 法大大落地业财一体化,优化流程结构

2023 年&#xff0c;法大大作为中国电子签行业唯一上榜《2023胡润全球未来独角兽》企业&#xff0c;同时上榜“2022深圳市潜在科技独角兽企业榜单”。作为高速发展的高科技服务企业&#xff0c;法大大自2021年完成9亿元腾讯D轮融资后&#xff0c;建立了长期主义发展计划&#x…