JS逆向 | 案例学习

admin 2024年8月18日00:10:49评论31 views字数 6111阅读20分22秒阅读模式

说明

本次教学仅供参考,如有问题请下方评论,作者第一时间回复。

想要获取源文件请到公众号发送信息:JS逆向817

初识

Web逆向初始

Web 逆向:数据加密、请求头参数加密、表单加密、参数加密、cookie 加密

数据加密 --> 数据解密:解密的 JS 板块,复制下来使用 --> 明文

请求头参数加密 --> 获取生成的方式 --> 服务器也不知道具体是什么内容 --> 爬虫,模仿服务器的加密方式

cookie 加密 --> 返回的数据对不对?

Web 逆向技巧:

  1. 定位技巧

  2. 初步熟悉 JS 语法(混淆 JS、无混淆 JS、eval 加密)

    1. 无混淆 JS:关键字搜索、XHR 断点、路径断点(搜索)、跟栈、hook

  1. 涉及的内容:对称加密算法(DES AES)、非对称加密算法、消息摘要算法(MD5、SHA;不能够被解密的算法)

  2. 数字签名算法

案例实践

某航空逆向登录

加密分析

参数分析(一定要处理;时效性参数;请求头 rw;请求体-->验证码、password、sw)

加密定位(堆栈分析、关键字搜索、hook、插桩、……)

堆栈分析:用来追踪其在调用多个函数的脚本中所处位置的机制——当前正在运行的函数是哪一个,以及在该函数内部调用了哪些函数,等等

非对称加密算法

应用场景(批量登录 自动登录)

验证码识别

ddddocr(https://github.com/sml2h3/ddddocr?tab=readme-ov-file)

opencv-python(https://github.com/opencv/opencv-python)

3、打码(云码、超级鹰)

市场常见验证码:

数美验证

顶象验证

极验验证

易盾验证

腾讯验证

阿里验证

百度旋转验证

……

JavaScript 逆向:

    • 浏览器调试

    • 国标哈希算法

    • 国标对称加密

    • 国标非对称加密

    • JS 混淆专题讲解

    • cookie 反爬处理

    • JS RPC 远程调用

    • JS 安全产品攻防

    • AST 抽象语法树

    • 浏览器脱环境专题

    • 验证码处理

    • ……

复制cURL(bash)格式:

JS逆向 | 案例学习

1、快速构建爬虫程序

在线爬虫工具:

Convert curl commands to code (curlconverter.com)

JS逆向 | 案例学习

粘贴之后,下方产生爬虫代码,直接复制过来使用。

JS逆向 | 案例学习

修改网页内容,查看第二个响应页,相同方法得出 Python 爬虫程序,与上一个内容,查看密文是否变化。

2、找到堆栈(重点)

JS逆向 | 案例学习

点击第一个 window,

JS逆向 | 案例学习

JS逆向 | 案例学习

JS逆向 | 案例学习

观察右边的作用域,向上一步溯源匿名,

JS逆向 | 案例学习

向上走到 l, 依然是密文

JS逆向 | 案例学习

再向上走到匿名,作用域内容不见了,

JS逆向 | 案例学习

此时进入“异步逻辑”,查看参数 e,依然是密文,

JS逆向 | 案例学习

再向上走一步,没有想要的内容了。

JS逆向 | 案例学习

这就不是正常生成的了,是”异步载入“,显著再第二个”匿名“运行语句的上一句打上断点,取消前面的勾选,点击释放,

JS逆向 | 案例学习

再次点亮,点击登录,出现新的栈”then“,进行方法的回调,

JS逆向 | 案例学习

然后取消该断点,在”匿名“执行命令的前一命令打上断点,运行,再打断点,点击登录,进入新的堆栈,,即”异步堆栈“,

JS逆向 | 案例学习

内容还是密文,

JS逆向 | 案例学习

进入 login,查看到 i、o、t,被单独拿出来了,在代码段中找到产生他们的位置,

JS逆向 | 案例学习

3、rw 头部参数生成

选择 t =后面的函数,弹出面板,点击链接,跳转到该函数位置,

JS逆向 | 案例学习

JS逆向 | 案例学习

新建 js 文件:

JS逆向 | 案例学习

改一下:

// rw 头部参数生成
// rw
function getRandom() {
for (var e = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", n = 6, a = "", t = 0; t < n; t++) {
var o = Math.floor(Math.random() * e.length);
a += e.charAt(o)
}
return a
}

rw = getRandom();

console.log(rw)

4、sw 头部参数生成

a.sw = hex_md5(t + a.mobile + a.deviceInfo.fingerPrintJs)

有很多参数,我们在控制台上查看,

JS逆向 | 案例学习

再进行代码改写,得到 sw 的生成过程代码。结果如下:

JS逆向 | 案例学习

在浏览器中验证:

JS逆向 | 案例学习

对比发现,是 md5 加密:

JS逆向 | 案例学习

使用 AI 生成”使用 python 在 windows 上进行 md5 加密“代码:

import hashlib

def md5_encrypt(text):
# 创建 MD5 哈希对象
md5_hash = hashlib.md5()
# 对输入的文本进行编码,并更新哈希对象
md5_hash.update(text.encode('utf-8'))
# 获取十六进制的哈希值
encrypted_text = md5_hash.hexdigest()
return encrypted_text

text = "Hello, World!"
print(md5_encrypt(text))

对上述代码进行修改:

def md5_encrypt(input_string):
# 创建 MD5 哈希对象
md5 = hashlib.md5()
# 对输入的文本进行编码
input_bytes = input_string.encode('UTF-8')
# 更新 md5 对象
md5.update(input_bytes)

# 获取加密结果
encrypted_string = md5.hexdigest()
return encrypted_string

5、对密码进行逆向

堆栈向上进一步,到 m,可以看到 password 的赋值:

JS逆向 | 案例学习

JS逆向 | 案例学习

JS逆向 | 案例学习

同上,进入r.encryptAES(t)函数的位置:

JS逆向 | 案例学习

JS逆向 | 案例学习

放入 js 文件中,并安装数据包(npm install crypto-js)

JS逆向 | 案例学习

再回到,py 文件中,说明 password 变量,对 password 进行 ctx.call 函数调用加密得到 password2 变量:

password = input('请输入你的密码:')

password2 = ctx.call('l',password)
print(password2)

运行:

JS逆向 | 案例学习

6、处理验证码

首先去掉之前的断点:

JS逆向 | 案例学习

查看验证码载荷:

JS逆向 | 案例学习

复制(以 cURL(bash)格式复制)

JS逆向 | 案例学习

curl 'https://hotel.bestwehotel.com/api/safeverify/[email protected]&verifyImageKey=0.8456907848587032' 
-H 'Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8'
-H 'Accept-Language: zh-CN,zh;q=0.9'
-H 'Connection: keep-alive'
-H 'Cookie: gdp_user_id=893e2f2e-a92c-4c9a-be46-2c7c307e61cb; HWWAFSESTIME=1723863599562; HWWAFSESID=c31b78b08bc366df9d; Hm_lvt_b6e767c4467dcad9be907eab9e9c78ac=1723765723,1723863603; Hm_lpvt_b6e767c4467dcad9be907eab9e9c78ac=1723863603; HMACCOUNT=C6B05AD445FE7718; 989d198a589474f0_gdp_session_id=bfb8008a-74c9-419c-a483-810cefec1bca; 989d198a589474f0_gdp_sequence_ids=%7B%22globalKey%22%3A42%2C%22VISIT%22%3A3%2C%22PAGE%22%3A4%2C%22VIEW_CLICK%22%3A23%2C%22VIEW_CHANGE%22%3A15%7D; 989d198a589474f0_gdp_session_id_bfb8008a-74c9-419c-a483-810cefec1bca=true'
-H 'Referer: https://hotel.bestwehotel.com/NewLogin/?go=https%3A%2F%2Fhotel.bestwehotel.com%2FHotelSearch%2F%3FcheckinDate%3D2024-08-14%26checkoutDate%3D2024-08-15%26cityCode%3DAR04567%26queryWords%3D%26cityName%3D%25E4%25B8%258A%25E6%25B5%25B7%26extend%3D1%2C1%2C0%2C0%2C0%2C0'
-H 'Sec-Fetch-Dest: image'
-H 'Sec-Fetch-Mode: no-cors'
-H 'Sec-Fetch-Site: same-origin'
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
-H 'sec-ch-ua: "Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"'
-H 'sec-ch-ua-mobile: ?0'
-H 'sec-ch-ua-platform: "Windows"'

去在线爬虫工具:

Convert curl commands to code (curlconverter.com)

生成爬虫程序:

JS逆向 | 案例学习

写到新的 py 文件中:

import requests

cookies = {
'gdp_user_id': '893e2f2e-a92c-4c9a-be46-2c7c307e61cb',
'HWWAFSESTIME': '1723863599562',
'HWWAFSESID': 'c31b78b08bc366df9d',
'Hm_lvt_b6e767c4467dcad9be907eab9e9c78ac': '1723765723,1723863603',
'Hm_lpvt_b6e767c4467dcad9be907eab9e9c78ac': '1723863603',
'HMACCOUNT': 'C6B05AD445FE7718',
'989d198a589474f0_gdp_session_id': 'bfb8008a-74c9-419c-a483-810cefec1bca',
'989d198a589474f0_gdp_sequence_ids': '%7B%22globalKey%22%3A42%2C%22VISIT%22%3A3%2C%22PAGE%22%3A4%2C%22VIEW_CLICK%22%3A23%2C%22VIEW_CHANGE%22%3A15%7D',
'989d198a589474f0_gdp_session_id_bfb8008a-74c9-419c-a483-810cefec1bca': 'true',
}

headers = {
'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
# 'Cookie': 'gdp_user_id=893e2f2e-a92c-4c9a-be46-2c7c307e61cb; HWWAFSESTIME=1723863599562; HWWAFSESID=c31b78b08bc366df9d; Hm_lvt_b6e767c4467dcad9be907eab9e9c78ac=1723765723,1723863603; Hm_lpvt_b6e767c4467dcad9be907eab9e9c78ac=1723863603; HMACCOUNT=C6B05AD445FE7718; 989d198a589474f0_gdp_session_id=bfb8008a-74c9-419c-a483-810cefec1bca; 989d198a589474f0_gdp_sequence_ids=%7B%22globalKey%22%3A42%2C%22VISIT%22%3A3%2C%22PAGE%22%3A4%2C%22VIEW_CLICK%22%3A23%2C%22VIEW_CHANGE%22%3A15%7D; 989d198a589474f0_gdp_session_id_bfb8008a-74c9-419c-a483-810cefec1bca=true',
'Referer': 'https://hotel.bestwehotel.com/NewLogin/?go=https%3A%2F%2Fhotel.bestwehotel.com%2FHotelSearch%2F%3FcheckinDate%3D2024-08-14%26checkoutDate%3D2024-08-15%26cityCode%3DAR04567%26queryWords%3D%26cityName%3D%25E4%25B8%258A%25E6%25B5%25B7%26extend%3D1%2C1%2C0%2C0%2C0%2C0',
'Sec-Fetch-Dest': 'image',
'Sec-Fetch-Mode': 'no-cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
}

response = requests.get(
'https://hotel.bestwehotel.com/api/safeverify/[email protected]&verifyImageKey=0.8456907848587032',
cookies=cookies,
headers=headers,
)

JS逆向 | 案例学习

JS逆向 | 案例学习

写入:

with open('./123.jpg', 'wb') as f:
f.write(response.content)

运行,生成:

JS逆向 | 案例学习

使用 ddddocr(https://github.com/sml2h3/ddddocr?tab=readme-ov-file)

JS逆向 | 案例学习

下方代码放入 demo2 文件中:

JS逆向 | 案例学习

运行,发现得出图片验证码内容:

JS逆向 | 案例学习

ctrl+鼠标左键,进入第三方库,可修改输出内容:

JS逆向 | 案例学习

JS逆向 | 案例学习

原文始发于微信公众号(安全君呀):JS逆向 | 案例学习

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月18日00:10:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JS逆向 | 案例学习https://cn-sec.com/archives/3075602.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息