记一次测试过程中登录参数加密逆向分析
字数 1272 2025-08-24 16:48:15

登录参数加密逆向分析教学文档

1. 前言

在渗透测试过程中,经常会遇到前端对登录参数进行加密的情况。本文将通过一个实际案例,详细讲解如何对登录框中的密码加密参数进行逆向分析,并实现加密算法的复现。

2. 环境准备

2.1 工具准备

  • 浏览器开发者工具(Chrome/Firefox)
  • Python 3.x
  • Node.js(用于运行前端JS代码)
  • 代码编辑器(VS Code等)

2.2 库准备

  • Python: pycryptodomecrypto-js
  • Node.js: crypto-js

3. 加密分析流程

3.1 初步观察

  1. 打开目标登录页面
  2. 打开浏览器开发者工具(F12)
  3. 切换到"网络(Network)"选项卡
  4. 勾选"Fetch/XHR"筛选器
  5. 在登录框中输入测试密码(如"123456")并提交
  6. 观察请求参数,特别是password字段的值

3.2 定位加密函数

  1. 在开发者工具中切换到"源代码(Sources)"选项卡
  2. 使用全局搜索功能(Ctrl+Shift+F)搜索关键词:
    • "encrypt"
    • "password"
    • "AES"
    • "crypto"
  3. 找到疑似加密函数(本例中为c(t)函数)

3.3 分析加密算法

通过分析找到的加密函数,确定以下信息:

  • 加密算法:AES
  • 加密模式:ECB
  • 填充方式:PKCS7
  • 密钥:需要进一步分析确定

4. 加密算法复现

4.1 Python实现方法

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64

# 密钥(示例中使用的是16字节的密钥)
key = b'0123456789ABCDEF'

# 创建AES加密器(ECB模式)
cipher = AES.new(key, AES.MODE_ECB)

def encrypt(msg):
    """
    加密函数
    :param msg: 明文消息
    :return: Base64编码的密文
    """
    plaintext = msg.encode('utf-8')
    padded_plaintext = pad(plaintext, AES.block_size)
    ciphertext = cipher.encrypt(padded_plaintext)
    return base64.b64encode(ciphertext).decode('utf-8')

def decrypt(ciphertext):
    """
    解密函数
    :param ciphertext: Base64编码的密文
    :return: 解密后的明文
    """
    ciphertext_bytes = base64.b64decode(ciphertext.encode('utf-8'))
    padded_plaintext = cipher.decrypt(ciphertext_bytes)
    plaintext = unpad(padded_plaintext, AES.block_size)
    return plaintext.decode('utf-8')

# 测试
enData = encrypt('123456')
print("加密结果:", enData)
print("解密结果:", decrypt(enData))

4.2 Node.js实现方法

const CryptJs = require('crypto-js');

function c(t) {
    var e = CryptJs.enc.Utf8.parse(t);
    return CryptJs.AES.encrypt(e, {
        "words": [808530483, 875902519, 943276354, 1128547654],
        "sigBytes": 16
    }, {
        mode: CryptJs.mode.ECB,
        padding: CryptJs.pad.Pkcs7
    }).toString()
}

// 测试
data = '123456';
console.log(c(data));

5. 调试技巧

5.1 断点调试

  1. 在加密函数开始和结束处设置断点
  2. 单步执行观察变量变化
  3. 将光标悬停在变量上查看值

5.2 变量替换

  1. 当遇到未定义变量时(如示例中的o
  2. 在断点处查看该变量的值
  3. 在复现代码中直接使用该值替换

6. 实际应用

6.1 密码爆破

  1. 准备密码字典(明文)
  2. 使用加密算法对字典中所有密码进行加密
  3. 使用加密后的密码进行爆破

6.2 自动化脚本

可以将加密逻辑集成到自动化测试工具中,如:

  • Burp Suite的Intruder模块
  • Python的requests库脚本
  • 自定义的渗透测试工具

7. 注意事项

  1. 密钥获取:在实际分析中,密钥可能隐藏在JS的其他部分或通过其他方式生成
  2. 加密模式:确认是ECB还是其他模式(CBC等)
  3. 填充方式:常见的有PKCS7、ZeroPadding等
  4. 编码方式:注意Base64、Hex等不同编码方式
  5. 法律合规:确保测试行为获得授权

8. 扩展知识

8.1 AES加密模式

  • ECB:电子密码本模式,简单但不安全
  • CBC:密码分组链接模式,更安全但需要IV
  • GCM:伽罗瓦/计数器模式,提供认证加密

8.2 其他常见前端加密

  • RSA:非对称加密
  • MD5/SHA:哈希算法(不可逆)
  • 自定义加密算法

9. 总结

通过本文的学习,你应该掌握了:

  1. 如何识别前端加密参数
  2. 如何定位和分析加密函数
  3. 如何复现加密算法(Python和Node.js实现)
  4. 如何应用这些知识进行渗透测试

在实际工作中,每个网站的加密方式可能不同,需要灵活运用这些技巧进行分析。

登录参数加密逆向分析教学文档 1. 前言 在渗透测试过程中,经常会遇到前端对登录参数进行加密的情况。本文将通过一个实际案例,详细讲解如何对登录框中的密码加密参数进行逆向分析,并实现加密算法的复现。 2. 环境准备 2.1 工具准备 浏览器开发者工具(Chrome/Firefox) Python 3.x Node.js(用于运行前端JS代码) 代码编辑器(VS Code等) 2.2 库准备 Python: pycryptodome 或 crypto-js Node.js: crypto-js 3. 加密分析流程 3.1 初步观察 打开目标登录页面 打开浏览器开发者工具(F12) 切换到"网络(Network)"选项卡 勾选"Fetch/XHR"筛选器 在登录框中输入测试密码(如"123456")并提交 观察请求参数,特别是password字段的值 3.2 定位加密函数 在开发者工具中切换到"源代码(Sources)"选项卡 使用全局搜索功能(Ctrl+Shift+F)搜索关键词: "encrypt" "password" "AES" "crypto" 找到疑似加密函数(本例中为 c(t) 函数) 3.3 分析加密算法 通过分析找到的加密函数,确定以下信息: 加密算法:AES 加密模式:ECB 填充方式:PKCS7 密钥:需要进一步分析确定 4. 加密算法复现 4.1 Python实现方法 4.2 Node.js实现方法 5. 调试技巧 5.1 断点调试 在加密函数开始和结束处设置断点 单步执行观察变量变化 将光标悬停在变量上查看值 5.2 变量替换 当遇到未定义变量时(如示例中的 o ) 在断点处查看该变量的值 在复现代码中直接使用该值替换 6. 实际应用 6.1 密码爆破 准备密码字典(明文) 使用加密算法对字典中所有密码进行加密 使用加密后的密码进行爆破 6.2 自动化脚本 可以将加密逻辑集成到自动化测试工具中,如: Burp Suite的Intruder模块 Python的requests库脚本 自定义的渗透测试工具 7. 注意事项 密钥获取:在实际分析中,密钥可能隐藏在JS的其他部分或通过其他方式生成 加密模式:确认是ECB还是其他模式(CBC等) 填充方式:常见的有PKCS7、ZeroPadding等 编码方式:注意Base64、Hex等不同编码方式 法律合规:确保测试行为获得授权 8. 扩展知识 8.1 AES加密模式 ECB:电子密码本模式,简单但不安全 CBC:密码分组链接模式,更安全但需要IV GCM:伽罗瓦/计数器模式,提供认证加密 8.2 其他常见前端加密 RSA:非对称加密 MD5/SHA:哈希算法(不可逆) 自定义加密算法 9. 总结 通过本文的学习,你应该掌握了: 如何识别前端加密参数 如何定位和分析加密函数 如何复现加密算法(Python和Node.js实现) 如何应用这些知识进行渗透测试 在实际工作中,每个网站的加密方式可能不同,需要灵活运用这些技巧进行分析。