说明
本次教学仅供参考,如有问题请下方评论,作者第一时间回复。
想要获取源文件请到公众号发送信息:JS逆向817
初识
Web逆向初始
Web 逆向:数据加密、请求头参数加密、表单加密、参数加密、cookie 加密
数据加密 --> 数据解密:解密的 JS 板块,复制下来使用 --> 明文
请求头参数加密 --> 获取生成的方式 --> 服务器也不知道具体是什么内容 --> 爬虫,模仿服务器的加密方式
cookie 加密 --> 返回的数据对不对?
Web 逆向技巧:
-
定位技巧
-
初步熟悉 JS 语法(混淆 JS、无混淆 JS、eval 加密)
-
无混淆 JS:关键字搜索、XHR 断点、路径断点(搜索)、跟栈、hook
-
涉及的内容:对称加密算法(DES AES)、非对称加密算法、消息摘要算法(MD5、SHA;不能够被解密的算法)
-
数字签名算法
案例实践
某航空逆向登录
加密分析:
参数分析(一定要处理;时效性参数;请求头 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)格式:
1、快速构建爬虫程序
在线爬虫工具:
Convert curl commands to code (curlconverter.com)
粘贴之后,下方产生爬虫代码,直接复制过来使用。
修改网页内容,查看第二个响应页,相同方法得出 Python 爬虫程序,与上一个内容,查看密文是否变化。
2、找到堆栈(重点)
点击第一个 window,
观察右边的作用域,向上一步溯源匿名,
向上走到 l, 依然是密文
再向上走到匿名,作用域内容不见了,
此时进入“异步逻辑”,查看参数 e,依然是密文,
再向上走一步,没有想要的内容了。
这就不是正常生成的了,是”异步载入“,显著再第二个”匿名“运行语句的上一句打上断点,取消前面的勾选,点击释放,
再次点亮,点击登录,出现新的栈”then“,进行方法的回调,
然后取消该断点,在”匿名“执行命令的前一命令打上断点,运行,再打断点,点击登录,进入新的堆栈,,即”异步堆栈“,
内容还是密文,
进入 login,查看到 i、o、t,被单独拿出来了,在代码段中找到产生他们的位置,
3、rw 头部参数生成
选择 t =后面的函数,弹出面板,点击链接,跳转到该函数位置,
新建 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)
有很多参数,我们在控制台上查看,
再进行代码改写,得到 sw 的生成过程代码。结果如下:
在浏览器中验证:
对比发现,是 md5 加密:
使用 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 的赋值:
同上,进入r.encryptAES(t)函数的位置:
放入 js 文件中,并安装数据包(npm install crypto-js)
再回到,py 文件中,说明 password 变量,对 password 进行 ctx.call 函数调用加密得到 password2 变量:
password = input('请输入你的密码:')
password2 = ctx.call('l',password)
print(password2)
运行:
6、处理验证码
首先去掉之前的断点:
查看验证码载荷:
复制(以 cURL(bash)格式复制)
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)
生成爬虫程序:
写到新的 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,
)
写入:
with open('./123.jpg', 'wb') as f:
f.write(response.content)
运行,生成:
使用 ddddocr(https://github.com/sml2h3/ddddocr?tab=readme-ov-file)
下方代码放入 demo2 文件中:
运行,发现得出图片验证码内容:
ctrl+鼠标左键,进入第三方库,可修改输出内容:
原文始发于微信公众号(安全君呀):JS逆向 | 案例学习
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论