利用autoDecoder工具在数据包加密+签名验证站点流畅测试

本文主要是介绍利用autoDecoder工具在数据包加密+签名验证站点流畅测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

站点是个靶场
https://github.com/0ctDay/encrypt-decrypt-vuls

演示地址http://39.98.108.20:8085/

不是仅登录位置暴力破解的那种场景,使用autoDecoder(https://github.com/f0ng/autoDecoder)的好处就是每个请求自动加解密,测试起来比较流畅

如何查找js加密代码这里就不详细写了,网上很多文章,直接贴出关键部分信息
请添加图片描述

程序会校验三个header,timestamp、requestId、sign,每个都不能错

timestamp由Date.parse(new Date)生成

requestId由p函数生成

sign为MD5(明文参数的json串+requestId+timestamp)

p函数的代码为

请添加图片描述
关键的加密函数l(n),跟进看一下
请添加图片描述

用了AES_CBC加密,填充方式是Pkcs7,iv与key都是1234567891234567
明白了这些逻辑,参考https://github.com/f0ng/autoDecoder-usages/blob/main/%E5%8A%A0%E8%A7%A3%E5%AF%86%E4%BB%A3%E7%A0%81%E4%BE%8B%E5%AD%90/aes_cbc_zeropadding.py
写出了本次的加解密逻辑代码,因为还有签名等逻辑,改动略大,不过后面遇到类似的照这个结构做些逻辑变更即可

from flask import Flask
import base64
import execjs
import time
import hashlib
import re
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from flask import request# 密钥(key), 偏移量(vi)
app = Flask(__name__)
key = b'1234567891234567'  
iv = b'1234567891234567'#从站点js文件中拷贝出来的一些函数,dtime生成时间戳,p函数生成requestIDctx = execjs.compile("""function dtime() {return Date.parse(new Date)   }function p() {var t = "0123456789abcdef", e = Array.from({length: 32}, (function() {return t.substr(Math.floor(16 * Math.random()), 1)}));return e[14] = "4",e[19] = t.substr(3 & e[19] | 8, 1),e[8] = e[13] = e[18] = e[23],e.join("")}
""")#生成md5,用于签名的生成
def md5_string(text):md5 = hashlib.md5()md5.update(text.encode('utf-8'))return md5.hexdigest()def AES_Encrypt(data):# 定义加密算法为AES_CBCcipher = AES.new(key, AES.MODE_CBC, iv)# 字符串补位padded_data = pad(data.encode('utf-8'), AES.block_size)# 加密后得到的是bytes类型的数据encrypted = cipher.encrypt(padded_data)# 使用Base64进行编码,返回byteencodestrs = base64.b64encode(encrypted)# 对byte按utf-8进行解码转为字符串格式enctext = encodestrs.decode('utf8')return enctextdef AES_Decrypt(data):# base64解密encrypted_data = base64.b64decode(data)# 根据AES_CBC算法解密cipher = AES.new(key, AES.MODE_CBC, iv)decrypted_padded = cipher.decrypt(encrypted_data)try:  #去除填充decrypted = unpad(decrypted_padded, AES.block_size)  # 返回字符串格式明文return decrypted.decode('utf-8')  except ValueError:  # 如果解密后数据格式不正确,比如填充错误,则抛出异常  raise ValueError("解密失败,可能密文已损坏或密钥/IV不正确")@app.route('/encode',methods=["POST"])  #定义加密接口
def encrypt():param = request.form.get('dataBody')  # 获取body内容param_headers = request.form.get('dataHeaders')  # 获取headers内容request_id = ctx.call("p")     #调用js代码中的p函数生成requestIdtime_str = str(ctx.call("dtime"))  #调用js代码中的dtime函数生成过期时间戳json_body = param    #body内容为json串,如{"password":"123456789","username":"test","validCode":"d0f6"}#签名算法为MD5(参数信息+requestId+时间戳)sign_str = json_body + request_id + time_strsign_md5 = md5_string(sign_str)#获取的headers内容为字符串,这里替换header中timestamp、requestId、sign的值,否则校验不通过param_headers = re.sub(r'\btimestamp:\s*(.*?)(?=\s+)', f'timestamp: {time_str}', param_headers)param_headers = re.sub(r'\brequestId:\s*(.*?)(?=\s+)', f'requestId: {request_id}', param_headers)param_headers = re.sub(r'\bsign:\s*(.*?)(?=\s+)', f'sign: {sign_md5}', param_headers)#调用AES加密body数据encry_param = AES_Encrypt(param)#返回整个http包,headers与body中间通过多个换行分隔return param_headers.strip() + "\r\n\r\n\r\n\r\n" + encry_param.strip()@app.route('/decode',methods=["POST"]) # 定义解密接口
def decrypt():param = request.form.get('dataBody')  # 获取body内容headers = request.form.get('dataHeaders')  # 获取headers内容# 如果body内容中有"存在,则表示数据包为明文,不需要解密,不包含则调用AES解密if '"' in param:return headers + "\r\n\r\n\r\n\r\n" + paramelse:decry_param = AES_Decrypt(param)return headers + "\r\n\r\n\r\n\r\n" + decry_paramif __name__ == '__main__':app.run(host="127.0.0.1",port="8888")   #接口地址为本地8888端口

autoDecoder配置如图

请添加图片描述
加解密接口配置
请添加图片描述
本地运行python启动接口
在这里插入图片描述

看下最终效果
实际数据包内容
请添加图片描述
在autoDecoder标签处可看到明文

请添加图片描述

在明文包中右键,选择"Send to Repeater"可以更改参数测试
请添加图片描述

把password值修改下提交,可看到返回包也会自动解密(注意要把明文包拷贝到Pretty或Raw下面才可以

请添加图片描述

暴力破解场景也是轻松拿捏,但需要限制为单个线程,否则验签会失败

请添加图片描述

成功获取密码
请添加图片描述

这篇关于利用autoDecoder工具在数据包加密+签名验证站点流畅测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108862

相关文章

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具