# padding_oracle_server.py - Server that returns padding error
from flask import Flask, request
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os
key = os.urandom(16)
app = Flask(__name__)
@app.route('/decrypt', methods=['POST'])
def decrypt():
ct = bytes.fromhex(request.form['ciphertext'])
cipher = AES.new(key, AES.MODE_CBC, iv=ct[:16])
try:
pt = unpad(cipher.decrypt(ct[16:]), 16)
return "OK"
except ValueError:
return "Padding error", 400
if __name__ == '__main__':
app.run(port=5000)
某 Web 应用程序使用 AES‑CBC 解密数据,并泄露填充是否有效。攻击者可提交修改后的密文,并依据服务器的错误响应,在不知道密钥的情况下迭代地解密或加密任意数据。
pip install flask pycryptodome
python padding_oracle_server.py
python exploit_padding_oracle.py
预言机检测确认了该漏洞;完整利用可使用 padbuster 等工具。