最近测试了好几个站点,开局一个登录框,抓包后用户名和密码加密了,格式如下:
在前端加密用的比较多的是 aes,也碰到过先通过 rsa 将 aes 的 key 进行加密,再利用 aes 加密传输的数据的。
上图就是直接使用 aes 加密的案例。
我们可以通过浏览器找到加密的 js 文件,一般在源代码 / 来源中找到 js 目录,此网站比较简单,直接使用了 crypto-js.js 文件,打开直接就可以看到 aes 的 key 和加密方式。
如上图我们可以知道,给了 key,模式是 ECB,pad 是 Pkcs7,有了这几个东西后,就可以去解密数据了。
使用 burpsuite 的autodecoder插件,这次解密也是使用这款插件
autoDecoder 有四个选项卡。
第一个 options 选项卡,是一些设置
- 模块控制:在 burp 哪些模块上运行 autodecoder 加解密
- 加解密选项:用来控制加解密的方式,使用自带算法加解密还是使用接口加解密
后面的选项是针对第一个选项,如我选择接口加解密,那么我可以设置对数据头进行处理
或请求响应不同加解密
选项。
- 加解密设置:则需要注意加解密域名一定要填写,否则 autodecoder 选项卡显示不了。其他的可以默认。
- 设置完后,一定要
保存
。
第二个选项卡是 autodecoder 自带算法加解密
第三个选项卡是接口加解密
需要设置接口,接口可参考作者给的。如果需要自定义一些请求参数,则大部分需要使用接口加解密。
如这次遇到的存在两个参数,使用自带的算法加解密就有点无法满足要求了。
自带的算法加解密有个正则模式匹配,只能匹配一个加密字符串(name),就无法提取 pwd 参数的加密字符串。
第四个选项卡是请求响应替换
可以用来测一些越权的漏洞,感觉和 burp 的 Autorize 插件一样,没用过。
简单的介绍了下 autodecoder 插件。
根据作者的脚本改了下,适应了当前测试的站点
from flask import Flask, request
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
import base64
from urllib.parse import parse_qs,quote
import hashlib
def aes_encrypt(key, data):
cipher = AES.new(key, AES.MODE_ECB)
padded_data = pad(data.encode(), AES.block_size)
cipher_text = cipher.encrypt(padded_data)
return base64.b64encode(cipher_text).decode()
def aes_decrypt(key, data):
cipher = AES.new(key, AES.MODE_ECB)
decrypted_data = cipher.decrypt(base64.b64decode(data))
unpadded_data = unpad(decrypted_data, AES.block_size)
return unpadded_data.decode()
app = Flask(__name__)
@app.route('/encode', methods=["POST"])
def encrypt():
key = b'这里写aes的key' # 16 bytes key
str1 = '123'
param = request.form.get('dataBody') # Get POST parameter
md5value = param + str1
param1 = quote(aes_encrypt(key,param))
param2 = hashlib.md5(md5value.encode()).hexdigest()
return f"Param={param1}&Autograph={param2}"
'''
data = json.loads(param)
encrypted_id = aes_encrypt(key, data["id"])
encry_param = param.replace(data["id"], encrypted_id)
return base64.b64decode(encry_param.encode()).decode()
'''
@app.route('/decode', methods=["POST"])
def decrypt():
key = b'这里写aes的key'
param = request.form.get('dataBody')
print('param: ',param)
parsed_params = parse_qs(param)
print(parsed_params)
# 解密两个参数,分别是name和pwd
decrypted_name = aes_decrypt(key, parsed_params["name"][0])
decrypted_value = aes_decrypt(key, parsed_params["pwd"][0])
# 返回包含两个参数的JSON响应
return f"name={decrypted_name}&pwd={decrypted_value}"
if __name__ == '__main__':
app.debug = True # Set debug mode, remember to turn it off in production
app.run(host="0.0.0.0", port=8888)
写好了脚本,那么就运行,程序会监听在 127.0.0.1:8888
python3 aed_decode.py
可以先抓个包测试下,可以看到成功解密了
目前设置如下:
设置完成后,抓包就可以看到每一次请求都会自动解密了,在 autoDecoder 选项卡可以看到解密内容
也可以开始利用 burp 的 intruder 模块进行登录爆破了。
在这里也推荐一个前端加密对抗练习靶场,包含非对称加密、对称加密、加签以及禁止重放的测试场景,比如 AES、DES、RSA,用于渗透测试练习。