background

水文一篇,没啥含金量,有手进行的东西,是我太菜了,所以觉得值得记录一下

就是一个首先输入身份信息然后返回该账号是否存在的功能点,没有验证码。正常情况下肯定burp一把梭了。但是这里发现提交的数据是被处理过了的,并不是原始的明文。
2023-04-28T00:25:59.png
乍一看就是base64,然后去解码发现解出来的全是乱码。那没法了,只能去看看前端是怎么处理的。

2023-04-28T00:27:15.png
点击“下一步”就是直接验证用户是否存在,这里调用的是nextStep()方法
2023-04-28T00:30:05.png
找到了nextstep方法的具体操作了,account参数经encryptAES方法处理
2023-04-28T00:32:40.png
在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,顺利达到了我想要的结果。