NewbieContest

Divers => Hacking => Discussion démarrée par: poute35 le 19 Septembre 2019 à 14:20:31



Titre: Length extension attack
Posté par: poute35 le 19 Septembre 2019 à 14:20:31
Bonjour,
J'essaie de comprendre le Length extension attack.
Pouvez vous me dire pourquoi les deux valeurs ne donnent pas le même hash ?
Code:
<?php
$Value1 
sha1(urldecode("%73%65%63%72%65%74%64%61%74%61%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%50"));
$Value2 sha1(urldecode("%73%65%63%72%65%74%64%61%74%61"));
?>


Merci


Titre: Re : Length extension attack
Posté par: flob le 19 Septembre 2019 à 18:10:02
Salut,

Le fait d'avoir le même hash ça s'appel une collision.

Cette attaque ne permet pas de générer une collision.

Tu trouveras beaucoup de documentations à ce sujet sur internet. Tu peux d'ailleurs commencer par la page Wikipedia ;)


Titre: Re : Length extension attack
Posté par: poute35 le 19 Septembre 2019 à 18:11:57
Merci pour ta réponse mais je ne souhaite pas faire de collision.
Ce que j'ai ajouté c'est le padding.


Titre: Re : Length extension attack
Posté par: flob le 19 Septembre 2019 à 18:38:01
Pouvez vous me dire pourquoi les deux valeurs ne donnent pas le même hash ?

Je répondais simplement à ta question ^^ C'est tout à fait normal que les deux valeurs ne donnent pas le même hash (puisque le but de cette attaque n'est pas de générer un collision)  ;)

Donc oui t'as ajouté un padding pour tenter une "length extension attach" mais si tu l'as fait dans l'espoir d'avoir le même hash alors c'est pas la bonne démarche.

Le concept de base de cette attaque est très bien expliqué dans le premier paragraphe de la page Wikipédia.


Titre: Re : Length extension attack
Posté par: poute35 le 19 Septembre 2019 à 18:41:04
J'ai du louper un truc :)
Pour moi les deux valeurs sont les mêmes vu de l'algo du sha1.
De ce que je comprends sur le site de PIXIS:

"Le premier bloc que nous avons pris soin de créer est exactement le même que celui produit par sha1..."
https://beta.hackndo.com/hash-length-extension/

Dans son exemple, les deux bloc donnent le même sha1:

4d 6f 6e 53 33 63 72 65  74 6e 61 6d 65 3d 68 61
63 6b 6e 64 6f 26 61 64  6d 69 6e 3d 30

et

4d 6f 6e 53 33 63 72 65  74 6e 61 6d 65 3d 68 61
63 6b 6e 64 6f 26 61 64  6d 69 6e 3d 30 80 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 E8


Titre: Re : Length extension attack
Posté par: flob le 19 Septembre 2019 à 19:21:11
L'article de pixis est très bien fait mais tu ne dois pas t'arrêter à cette étape. Si tu vas jusqu'au bout tu verras que ça fonctionne !

Citation
Le premier bloc que nous avons pris soin de créer est exactement le même que celui produit par sha1...
Pour ce qui est de cette phrase, elle est tout à fait juste.
Tu devrais relire tout le début de l'article ( les chapitres avant "Cas pratique" ) afin de mieux comprendre.


Titre: Re : Length extension attack
Posté par: nikost le 20 Septembre 2019 à 11:24:40
Je crois que je vois où est la confusion. =)
Pour comprendre, il faut s'intéresser à l'algorithme de padding. Dans ton exemple, si tu donnes comme entrée à l'algorithme sha1 la chaîne :

4d 6f 6e 53 33 63 72 65  74 6e 61 6d 65 3d 68 61
63 6b 6e 64 6f 26 61 64  6d 69 6e 3d 30

L'algorithme du sha1 va effectivement utiliser du padding pour obtenir un bloc de 512 bits qui sera :

4d 6f 6e 53 33 63 72 65  74 6e 61 6d 65 3d 68 61
63 6b 6e 64 6f 26 61 64  6d 69 6e 3d 30 80 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 E8

Et c'est ce bloc qui sera utilisé pour calculer le hash.

Cependant, si tu donnes directement comme entrée à l'algorithme sha1 la chaîne :

4d 6f 6e 53 33 63 72 65  74 6e 61 6d 65 3d 68 61
63 6b 6e 64 6f 26 61 64  6d 69 6e 3d 30 80 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 E8

Dans ce cas là, le sha1 va rajouter un bloc entier de padding. En effet, l'agorithme de padding fonctionne de la manière suivante:
1. Dans tous les cas, rajouter un bit à '1' à la fin du message (dans l'exemple précédent, c'est ce qui fait apparaître l'octet 0x80).
2. Ensuite rajouter des 0 jusqu'à arriver à une taille totale étant (un multiple de 512) - 64 bits.
3. Rajouter la taille du message originale pour combler les 64 bits de fin de bloc (dans l'exemple précédent, c'est ce qui fait apparaître l'octet 0xE8).

Donc dans ce nouvel exemple, un bloc entier sera rajouté au message. Et donc la partie calculatoire du sha1 sera effectuée sur deux blocs :

4d 6f 6e 53 33 63 72 65  74 6e 61 6d 65 3d 68 61
63 6b 6e 64 6f 26 61 64  6d 69 6e 3d 30 80 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 E8

80 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 xx

C'est pour ça que tu obtiens un hash différent. :D

Et comme le dis flob, le but de l'attaque n'est pas de réaliser une collision, mais de pouvoir, en se basant sur le hash d'un message 1, de connaître le hash d'un message 2 sans forcément connaître le premier message (dans l'article de pixis, on ne connaît pas le secret en préfixe)



Titre: Re : Length extension attack
Posté par: poute35 le 20 Septembre 2019 à 13:27:46
Oui merci à vous deux.
Mon erreur était de considérer le padding comme = ( le bit à 1 + les zéros + la tailles des données utiles).
Or le bit à 1 comme tu le dis nikost ne fait pas partie du padding il est toujours ajouté par sha1 quelque soit la taille des données utiles à hasher.
Merci encore.


Titre: Re : Re : Length extension attack
Posté par: Pech le 20 Septembre 2019 à 14:28:42
Salut,

Or le bit à 1 comme tu le dis nikost ne fait pas partie du padding il est toujours ajouté par sha1 quelque soit la taille des données utiles à hasher.
La longueur du message est également ajoutée dans tous les cas : seul le padding est optionnel.

Pour présenter d'une façon qui - selon moi - fait moins mal à la tête que celle de nikost (:p), ce que tu donnes en entrée à l'algorithme il le traite comme étant uniquement le message.
Autrement dit, il ne se demande pas si (0x80 [+ padding] + taille sur 8 octets) ont été ajoutés au préalable.
Et donc, ici, tu calcules le hash de deux messages différents.

Pech.