
취약한 Flask 복호화 엔드포인트와 키 없이 임의의 암호문을 복호화하는 Python 익스플로잇 스크립트를 사용하여 AES-CBC 암호화에 대한 패딩 오라클 공격을 시연합니다.
# 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)
웹 애플리케이션이 AES‑CBC를 사용하여 데이터를 복호화하고 패딩의 유효성 여부를 노출합니다. 공격자는 변조된 암호문을 제출하고, 서버의 오류 응답을 기반으로 키를 알지 못한 채 임의의 데이터를 반복적으로 복호화하거나 암호화할 수 있습니다.
pip install flask pycryptodome
python padding_oracle_server.py
python exploit_padding_oracle.py
오라클 탐지는 취약점을 확인하며, 전체 익스플로잇은 padbuster와 같은 도구를 사용합니다.