// accueil / write-ups / Crypto

Padding oracle : déchiffrer sans la clé

Crypto par smrtblck · 10 min de lecture · 02 décembre 2024

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}

← Tous les write-ups Proposer un write-up