渗透测试高级技巧(三):被前端加密后的漏洞测试
字数 1250 2025-08-20 18:17:07

渗透测试高级技巧:前端加密漏洞测试教学文档

1. 前端加密登录场景分析

1.1 典型加密登录流程

  1. 用户界面到JS层

    • 用户在界面输入用户名和密码
    • 数据以JSON格式传递给JS层处理
  2. JS层加密处理

    • JS接收到原始JSON数据
    • 使用AES ECB模式进行加密
  3. 客户端到服务器传输

    • 发送加密后的数据到服务器
  4. 服务器处理

    • 服务器接收加密数据并进行解密
    • 查询数据库获取用户信息
    • 验证用户凭据
    • 准备响应数据并进行加密
  5. 服务器到客户端响应

    • 发送加密的响应数据回客户端
  6. 客户端处理响应

    • JS层解密服务器响应
    • 将解密后的结果显示在用户界面

2. 基础解密技术

2.1 AES ECB解密方法

raw = codec.DecodeBase64(`zqBATwKGlf9ObCg8Deimijp+OH1VePy6KkhV1Z4xjiDwOuboF7GPuQBCJKx6o9c7`)
result = codec.AESECBDecrypt(`1234123412341234`, raw,"")
dump(result)

2.2 通用解密函数实现

decryptData = (packet) => {
    body = poc.GetHTTPPacketBody(packet)
    params = json.loads(body)
    raw = codec.DecodeBase64(params.data)~
    key = codec.DecodeHex(params.key)~
    result = codec.AESECBDecrypt(key, raw, nil)~
    return string(result)
}

3. MITM中间人攻击中的明文查看

3.1 修改数据包存储流程

hijackSaveHTTPFlow = func(flow /* *yakit.HTTPFlow */, modify /* func(modified *yakit.HTTPFlow) */, drop/* func() */) {
    request = codec.StrconvUnquote(flow.Request)~
    newRequest = decryptData(request)
    flow.Request = codec.StrconvQuote(newRequest)
    modify(flow)
}

4. 自动化加密发送

4.1 加密函数实现

encryptData = (packet, key) => {
    body = poc.GetHTTPPacketBody(packet)
    result = string(codec.AESECBEncrypt(key, body, nil)~)
    data = {
        "data": codec.EncodeBase64(result),
        "key": codec.EncodeToHex(key),
    }
    body = json.dumps(data)
    return string(poc.ReplaceBody(packet, body /*type: []byte*/, false))
}

5. 全站加密场景处理

5.1 AES CBC加密/解密实现

// 解密函数
decrypt = packet => {
    body = poc.GetHTTPPacketBody(packet)
    obj = json.loads(body)
    if "iv" in obj && "key" in obj && "message" in obj {
        iv = codec.DecodeHex(obj.iv)~
        key = codec.DecodeHex(obj.key)~
        msg = codec.DecodeBase64(obj.message)~
        newBody = string(codec.AESCBCDecrypt(key, msg, iv)~)
        return poc.ReplaceBody(packet, newBody, false)
    }
    return packet
}

// 加密函数
encrypt = packet => {
    body = poc.GetHTTPPacketBody(packet)
    iv = randstr(16)
    key = randstr(16)
    msg = string(body)
    enc := codec.AESCBCEncryptWithPKCS7Padding(key, msg, iv /*type: []byte*/)~
    newBodyObj = {
        "iv": codec.EncodeToHex(iv),
        "key": codec.EncodeToHex(key),
        "message": codec.EncodeBase64(enc),
    }
    newBody = json.dumps(newBodyObj)
    packet = poc.ReplaceHTTPPacketBody(packet /*type: []byte*/, newBody)
    return packet
}

5.2 Web Fuzzer热加载配置

// 请求前自动加密
beforeRequest = func(req) {
    return encrypt(req)
}

// 响应后自动解密
afterRequest = func(rsp) {
    return decrypt(rsp)
}

5.3 MITM存储前解密

hijackSaveHTTPFlow = func(flow /* *yakit.HTTPFlow */, modify /* func(modified *yakit.HTTPFlow) */, drop/* func() */) {
    req = codec.StrconvUnquote(flow.Request)~
    flow.Request = codec.StrconvQuote(decrypt(req))
    rsp = codec.StrconvUnquote(flow.Response)~
    flow.Response = codec.StrconvQuote(decrypt(rsp))
    modify(flow)
}

6. 实战靶场分析

6.1 被加密请求的SQL注入靶场

  1. 特征:

    • 使用AES ECB加密
    • 固定密钥"1234123412341234"
    • 数据包中包含"data"和"key"字段
  2. 测试流程:

    • 通过MITM捕获加密请求
    • 使用解密函数查看明文
    • 修改明文构造SQL注入
    • 使用加密函数重新加密发送

6.2 全站加密靶场

  1. 特征:

    • 使用AES CBC加密
    • 随机key和随机初始偏移量
    • 使用Pkcs7Padding
    • 数据包中包含"iv"、"key"和"message"字段
  2. 测试流程:

    • 配置Web Fuzzer热加载自动加解密
    • 直接使用明文进行测试
    • 配置MITM存储前解密
    • 实现无缝的加密通信测试

7. 关键知识点总结

  1. 加密算法识别

    • 通过查看前端JS代码确定加密算法和密钥
    • 常见加密模式:AES ECB、AES CBC等
  2. 解密技术

    • 使用Yaklang的codec模块实现解密
    • 处理Base64和Hex编码的数据
  3. MITM中间人技术

    • 使用hijackSaveHTTPFlow修改存储前的数据包
    • 实现加密流量的明文查看
  4. 自动化测试技术

    • 通过beforeRequest/afterRequest实现自动加解密
    • 保持测试工具与加密系统的兼容性
  5. 全站加密处理

    • 处理包含iv/key/message的复杂加密格式
    • 实现请求和响应的双向加解密

8. 工具使用技巧

  1. Yakit热加载

    • 快速修改数据包处理逻辑
    • 无需修改工具核心代码
  2. Web Fuzzer配置

    • 结合热加载实现加密通信测试
    • 保持测试过程的透明性
  3. MITM数据存储

    • 存储解密后的明文数据
    • 便于后续分析和报告生成

9. 进阶思考

  1. 动态密钥处理

    • 分析密钥生成算法
    • 预测或获取动态密钥
  2. 非对称加密场景

    • 处理RSA等非对称加密
    • 获取或伪造公私钥
  3. 混合加密系统

    • 分析多层加密机制
    • 逐层解密的技术实现
  4. 自动化测试框架

    • 构建通用的前端加密测试框架
    • 支持多种加密算法的插件化设计
渗透测试高级技巧:前端加密漏洞测试教学文档 1. 前端加密登录场景分析 1.1 典型加密登录流程 用户界面到JS层 : 用户在界面输入用户名和密码 数据以JSON格式传递给JS层处理 JS层加密处理 : JS接收到原始JSON数据 使用AES ECB模式进行加密 客户端到服务器传输 : 发送加密后的数据到服务器 服务器处理 : 服务器接收加密数据并进行解密 查询数据库获取用户信息 验证用户凭据 准备响应数据并进行加密 服务器到客户端响应 : 发送加密的响应数据回客户端 客户端处理响应 : JS层解密服务器响应 将解密后的结果显示在用户界面 2. 基础解密技术 2.1 AES ECB解密方法 2.2 通用解密函数实现 3. MITM中间人攻击中的明文查看 3.1 修改数据包存储流程 4. 自动化加密发送 4.1 加密函数实现 5. 全站加密场景处理 5.1 AES CBC加密/解密实现 5.2 Web Fuzzer热加载配置 5.3 MITM存储前解密 6. 实战靶场分析 6.1 被加密请求的SQL注入靶场 特征: 使用AES ECB加密 固定密钥"1234123412341234" 数据包中包含"data"和"key"字段 测试流程: 通过MITM捕获加密请求 使用解密函数查看明文 修改明文构造SQL注入 使用加密函数重新加密发送 6.2 全站加密靶场 特征: 使用AES CBC加密 随机key和随机初始偏移量 使用Pkcs7Padding 数据包中包含"iv"、"key"和"message"字段 测试流程: 配置Web Fuzzer热加载自动加解密 直接使用明文进行测试 配置MITM存储前解密 实现无缝的加密通信测试 7. 关键知识点总结 加密算法识别 : 通过查看前端JS代码确定加密算法和密钥 常见加密模式:AES ECB、AES CBC等 解密技术 : 使用Yaklang的codec模块实现解密 处理Base64和Hex编码的数据 MITM中间人技术 : 使用hijackSaveHTTPFlow修改存储前的数据包 实现加密流量的明文查看 自动化测试技术 : 通过beforeRequest/afterRequest实现自动加解密 保持测试工具与加密系统的兼容性 全站加密处理 : 处理包含iv/key/message的复杂加密格式 实现请求和响应的双向加解密 8. 工具使用技巧 Yakit热加载 : 快速修改数据包处理逻辑 无需修改工具核心代码 Web Fuzzer配置 : 结合热加载实现加密通信测试 保持测试过程的透明性 MITM数据存储 : 存储解密后的明文数据 便于后续分析和报告生成 9. 进阶思考 动态密钥处理 : 分析密钥生成算法 预测或获取动态密钥 非对称加密场景 : 处理RSA等非对称加密 获取或伪造公私钥 混合加密系统 : 分析多层加密机制 逐层解密的技术实现 自动化测试框架 : 构建通用的前端加密测试框架 支持多种加密算法的插件化设计