JS 逆向简单 DEMO & 流程
前言
分享一下简单的加解密逻辑与步骤, 用Chrome & FireFox
做一下比较, 用简单的AES
做一下案例演示. 后续会随着复杂度难度逐渐递增并记载.
声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。
调试环境搭建
这里给出一个简单的本地环境, 代码如下:
<!DOCTYPE html>
<html>
<head>
<title>登录Demo</title>
<!-- 引入CryptoJS AES加密库 -->
<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
</head>
<body>
<divstyle="margin: 20px;">
<h2>登录</h2>
<formid="loginForm">
<divstyle="margin: 10px 0;">
<label>账号:</label>
<inputtype="text"id="username"required>
</div>
<divstyle="margin: 10px 0;">
<label>密码:</label>
<inputtype="password"id="password"required>
</div>
<buttontype="button">登录</button>
</form>
</div>
<script>
document.getElementsByTagName('button')[0].addEventListener('click', function(){
login(); // 登录逻辑
});
// AES加密配置(实际应用中密钥应更复杂且安全存储)
const AES_KEY = CryptoJS.enc.Utf8.parse('1234567812345678'); // 16位密钥
const AES_IV = CryptoJS.enc.Utf8.parse('1234567812345678'); // 16位初始向量
functionlogin() {
// 获取输入值
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
// 创建待加密的JSON对象
const loginData = {
username: username,
password: password
};
// 加密数据
const encryptedData = aesEncrypt(JSON.stringify(loginData));
// 发送加密后的数据
fetch('checklogin.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ data: encryptedData })
})
.then(response => response.json())
.then(data => {
alert(data.message);
})
.catch(error => {
console.error('Error:', error);
});
}
// AES加密函数(CBC模式,PKCS7填充)
functionaesEncrypt(data) {
const encrypted = CryptoJS.AES.encrypt(
data,
AES_KEY,
{
iv: AES_IV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return encrypted.toString();
}
</script>
</body>
</html>
这里是一个登录 -> 加密 -> 发送JSON数据
的简单 DEMO, 而后端使用 PHP 接收, 代码如下:
<?php
// 注意:需要安装php7.4+和openssl扩展
$secretKey = '1234567812345678'; // 与前端一致的密钥
$iv = '1234567812345678'; // 与前端一致的初始向量
// 获取加密数据
$input = json_decode(file_get_contents('php://input'), true);
$encryptedData = base64_decode($input['data']);
// 解密数据
$decryptedData = openssl_decrypt(
$encryptedData,
'AES-128-CBC',
$secretKey,
OPENSSL_RAW_DATA,
$iv
);
if ($decryptedData) {
$loginInfo = json_decode($decryptedData, true);
// 这里可以添加数据库验证逻辑
$response = [
'status' => 'success',
'message' => '登录成功(模拟)',
'decrypted_data' => $loginInfo
];
} else {
$response = [
'status' => 'error',
'message' => '解密失败'
];
}
header('Content-Type: application/json');
echo json_encode($response);
?>
使用php://input
来收到JSON
中POST
所发送的值, 进行AES解密
的操作, 随后返回给前端, 而一次请求发送的内容如下:
FireFox 调试
这里笔者使用FireFox
进行直接调试, 直接对登录按钮进行右键 -> 检查
即可, 如下:
从这里我们可以进行对目标打上断点, 后续进行DEBUG
调试出加密逻辑:
可以从中看到的是, 经过了aesEncrypt
方法加密后, 得到了一串最终要发包的密文信息. 后续则是使用DEBUG
步入等功能查看加解密逻辑即可, 这里不再赘述, 慢慢的进行单步,步入
调试就行:
Chrome 调试
对于Chrome
的调试不同于FireFox
, 个人更喜欢Chrome
的调试功能, 它对事件的查找也不同, 如下:
这里不像FireFox
那样, 而是需要在事件监听器
中进行定位到事件, 随后进入并进行DEBUG
即可:
从中我们也可以看到最终的加密也是呗aesEncrypt
进行处理了.
编写对应的解密脚本
实战中可能流程更加复杂, 不会出现这么简单的情况, 我们只需要细心慢慢跟入即可, 找到最终对其加密的方法就行.
而我们拿到AES-KEY
后, 可以根据上述加密情况, 编写出对应的解密脚本如下:
<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width, initial-scale=1.0">
<title>Document</title>
<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
</head>
<body>
<script>
let data = 'fwiCcQLoitBApt+MxIjLMtuFcCCLyBYEgDhzdWr28+gTHzeTYNhe73AawWX1ngBC';
const AES_KEY = CryptoJS.enc.Utf8.parse('1234567812345678');
const AES_IV = CryptoJS.enc.Utf8.parse('1234567812345678');
functionaesDecrypt() {
const decrypted = CryptoJS.AES.decrypt(
data,
AES_KEY,
{
iv: AES_IV,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
return decrypted.toString(CryptoJS.enc.Utf8); // 指明 CryptoJS.enc.Utf8
}
console.log("Key: " + data + " Value: " + aesDecrypt(data));
</script>
</body>
</html>
最终转换 Python 等, 编写爬虫脚本之类的不在此说明了, 语法上查一下API就行.
原文始发于微信公众号(Heihu Share):JS 逆向简单 DEMO & 流程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论