T: / Corrigés des challenges / PHP
Introduction au Brute Force avec une mise en pratique concrète.
Une méthode dite « brute force » consiste à tester toutes les solutions possibles jusqu’à trouver la bonne. Quand il n’est pas possible d’écrire un algorithme pour atteindre de façon ordonnée la solution, alors il reste la possibilité de tester tous les cas possibles !
Dans le challenge SECURITY_1, c’est la solution qu’il faut utiliser. On est en effet face à des hashs. Le hash est le résultat d’un algorithme de chiffrage appliqué à une chaîne de caractères donnée. Ces algorithmes ont la spécificité de ne fonctionner que dans un sens. Je peux chiffrer une chaîne de caractères, mais je ne pourrais pas la déchiffrer.
Donc le seul moyen de trouver la chaîne de caractères du départ est de tester toutes les variantes possibles.
Ici, on a une règle plutôt basique, avec un nombre de cas maîtrisé.
Si la personne s’appelle « Néo Anderson », alors les mots de passe possibles sont :
Il n’y a que les 3 derniers caractères qui changent, 2 chiffres et une lettre.
Ce qui donne : 9 x 10 x 26 => 2 340 possibilités à tester.
Le challenge va proposer une dizaine de personnes à tester, soit environ 23 400 combinaisons (maximum) à tester.
Même si ce nombre peut paraître important, on est là sur une volumétrie qui nécessite peu de temps de calcul.
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
foreach ($informations as $information) {
[$firstName, $lastName, $xCompany, $extension, $hash] = preg_split('/[.@:]/', $information);
$passStart = strtolower($firstName) . strtoupper(substr($lastName, 0, 3)) . '@';
for ($randomNumber = 10; $randomNumber <= 99; $randomNumber++) {
for ($indexLetter = 0; $indexLetter < 26; $indexLetter++) {
$pass = $passStart . $randomNumber . $alphabet[$indexLetter];
if ($hash === hash('sha256', $pass)) {
break 3;
}
}
}
}
Un peu d’explications :
Le brute force correspond donc à mes 2 boucles for enchainées qui vont tester les 2340 cas avant de passer à la ligne suivante.
On est là sur un cas qui peut avoir l’air basique mais ce sont ces méthodes qui peuvent être utilisées par des hackers qui réussissent à mettre leur main sur des bases de données. Les mots de passe sont (normalement) toujours chiffrés mais un brute force bien pensé peut permettre de craquer des mots de passe dits faibles, c’est à dire des mots de passe que l’on peut « deviner » :
Il y a bien sûr plein de façons de se protéger de la technique du brute force, que ce soit au moment du chiffrement, en ajoutant une clé, c’est-à-dire une chaîne supplémentaire, ou en ayant des mots de passe complexes, longs, avec des caractères spéciaux, ce qui aura tendance à rendre le brute force beaucoup trop long à réaliser.
Enfin, ce corrigé se veut une introduction au concept de brute force. C’est un sujet très complexe qui ne s’applique d’ailleurs pas qu’à la thématique des mots de passe. Si le sujet t’intéresse… Google est ton ami 😉
foreach ($informations as $information) {
[$firstName, $lastName, $xCompany, $extension, $hash] = preg_split('/[.@:]/', $information);
$passStart = strtolower($firstName) . strtoupper(substr($lastName, 0, 3)) . '@';
for ($randomNumber = 10; $randomNumber <= 99; $randomNumber++) {
$letter = 'A';
for ($indexLetter = 0; $indexLetter < 26; $indexLetter++) {
$pass = $passStart . $randomNumber . $letter;
if ($hash === hash('sha256', $pass)) {
break 3;
}
$letter++;
}
}
}
La différence se trouve ici dans l’incrémentation d’une lettre !
En effet, le code ci-dessous est tout à fait fonctionnel :
$letter = 'A';
$letter++;
echo $letter; // affiche "B"
Other content to discover
Corrections, challenges, news, technical monitoring... no spam.