最近測試了好幾個站點,開局一個登錄框,抓包後用戶名和密碼加密了,格式如下:
在前端加密用的比較多的是 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,用於滲透測試練習。