W3lkin's Universe
「你就像是一阵风,在我这里掀起了万丈波澜,却又跟着云去了远方」
April 28th, 2023
水文一篇,没啥含金量,有手进行的东西,是我太菜了,所以觉得值得记录一下
就是一个首先输入身份信息然后返回该账号是否存在的功能点,没有验证码。正常情况下肯定burp一把梭了。但是这里发现提交的数据是被处理过了的,并不是原始的明文。乍一看就是base64,然后去解码发现解出来的全是乱码。那没法了,只能去看看前端是怎么处理的。
点击“下一步”就是直接验证用户是否存在,这里调用的是nextStep()方法找到了nextstep方法的具体操作了,account参数经encryptAES方法处理在js文件里面找到了encryptAES方法的具体操作,知道AES是对称加密,这里面也有了秘钥,那这不就来了吗?我找了很多的在线网站,都没能成功加密,我很疑惑。也不知道是啥情况。对于这些算法我也是一概不懂。但encryptAES方法就是对字符串进行AES之后再base64的。我直接用python先AES再base64之后也不行。提交过去就显示数据格式错误(这点蛮好的,方便我排错。要是统一显示账号不存在,那我可能一直走在错误的道路上也不知道)最后还是ChatGPT救了我,其实这是一个很简单的问题。gpt指出了js里面是使用的ECB模式,添加PKCS7填充并加密数据。所以很简单了,直接一句话让GPT给我们写代码。之前一直失败就是应为没有指定具体的加密器和填充方法(应该是这样)
先来一个解密脚本验证一下
from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import base64 # 定义密钥和加密模式 key = b'*******' mode = AES.MODE_ECB # base64解码加密的数据 encrypted_data = '********' decoded_data = base64.b64decode(encrypted_data) # 创建AES解密器 decryptor = AES.new(key, mode) # 解密数据并删除填充 decrypted_data = unpad(decryptor.decrypt(decoded_data), AES.block_size) # 打印解密后的结果 print(decrypted_data.decode('utf-8'))
ok没问题(如果是错的脚本会直接报错),思路是对的,那么接下来就直接写对payload批量加密的脚本这里还需要对=+等符号进行url编码,直接用现成的库来处理就行了
from Crypto.Cipher import AES from Crypto.Util.Padding import pad import base64 import urllib.parse # 定义密钥和加密模式 key = b'********' mode = AES.MODE_ECB # 打开要读取的文件和要写入的文件 with open('fff.txt', 'r') as f, open('ok.txt', 'w') as output_file: # 逐行读取文件 for line in f: # 去除行末的换行符 data = line.strip() # 创建AES加密器 encryptor = AES.new(key, mode) # 添加PKCS7填充并加密数据 padded_data = pad(data.encode('utf-8'), AES.block_size) encrypted_data = encryptor.encrypt(padded_data) # 使用base64编码加密数据 encoded_data = base64.b64encode(encrypted_data) # 使用URL编码对加密后的结果进行编码 url_encoded_data = urllib.parse.quote(encoded_data) # 将加密和编码后的结果写入到输出文件中 output_file.write(url_encoded_data) output_file.write('\n') # 在结果之间插入一个换行符,以便于阅读和处理
将结果导入burp一把梭即可效果也是相当的nice,顺利达到了我想要的结果。
background
水文一篇,没啥含金量,有手进行的东西,是我太菜了,所以觉得值得记录一下
就是一个首先输入身份信息然后返回该账号是否存在的功能点,没有验证码。正常情况下肯定burp一把梭了。但是这里发现提交的数据是被处理过了的,并不是原始的明文。

乍一看就是base64,然后去解码发现解出来的全是乱码。那没法了,只能去看看前端是怎么处理的。
点击“下一步”就是直接验证用户是否存在,这里调用的是nextStep()方法
找到了nextstep方法的具体操作了,account参数经encryptAES方法处理
在js文件里面找到了encryptAES方法的具体操作,知道AES是对称加密,这里面也有了秘钥,那这不就来了吗?
我找了很多的在线网站,都没能成功加密,我很疑惑。也不知道是啥情况。对于这些算法我也是一概不懂。但encryptAES方法就是对字符串进行AES之后再base64的。我直接用python先AES再base64之后也不行。提交过去就显示数据格式错误(这点蛮好的,方便我排错。要是统一显示账号不存在,那我可能一直走在错误的道路上也不知道)最后还是ChatGPT救了我,其实这是一个很简单的问题。gpt指出了js里面是使用的ECB模式,添加PKCS7填充并加密数据。所以很简单了,直接一句话让GPT给我们写代码。之前一直失败就是应为没有指定具体的加密器和填充方法(应该是这样)
先来一个解密脚本验证一下
ok没问题(如果是错的脚本会直接报错),思路是对的,那么接下来就直接写对payload批量加密的脚本
这里还需要对=+等符号进行url编码,直接用现成的库来处理就行了
将结果导入burp一把梭即可
效果也是相当的nice,顺利达到了我想要的结果。