Principe
L’application chiffre des données sensibles avec AES-CBC et les transmet dans un cookie. Quand on modifie le cookie, le serveur retourne soit “Erreur de déchiffrement” (padding invalide) soit “Session invalide” (padding valide mais données incorrectes). Cette différence est un oracle de padding.
L’attaque
L’attaque exploite le mode CBC où chaque bloc de texte clair dépend du bloc chiffré précédent. En modifiant un octet du bloc précédent et en observant si le padding est valide, on peut déduire la valeur du texte clair.
def oracle(ct):
"""Retourne True si le padding est valide"""
r = requests.get(url, cookies={"session": base64.b64encode(ct).decode()})
return "Session invalide" in r.text # padding OK mais données fausses
def decrypt_byte(ct_block, prev_block, pos, known):
pad_val = 16 - pos
for guess in range(256):
modified = bytearray(prev_block)
modified[pos] = guess
# Ajuster les octets déjà connus pour le padding
for i in range(pos + 1, 16):
modified[i] = known[i] ^ pad_val
if oracle(bytes(modified) + ct_block):
return guess ^ pad_val
Résultat
En itérant sur chaque octet de chaque bloc (du dernier au premier), on reconstruit le texte clair complet sans jamais connaître la clé de chiffrement.
Flag : flag{p4dd1ng_0r4cl3_byt3_by_byt3}