• 4 heures
  • Facile

La CRLF

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Explication

La faille CRLF (Carriage Return Line Feed) permet - comme son nom l'indique - d'effectuer un retour chariot dans un champ du type input ou textarea. Elle est le plus souvent utilisée pour récupérer le mot de passe de quelqu'un, grâce à la fonction mail() de la page "mot de passe oublié" présent sur un très grand nombre de sites. Il nous suffit de connaitre l'adresse mail de la victime et d'utiliser la faille pour nous mettre en copie de ce mail. Prenons un cas concret. Ce formulaire est présent sur la page "mot de passe oublié" :

<form action="password_oublie.php" method="POST">
    <input type="text" name="mail">
    <input type="submit" value="Envoyer">
</form>

Le hacker va alors essayer de se mettre en copie du mail. Pour cela il lui suffit d'insérer un retour à la ligne dans le champ input en utilisant la chaine "%0A". On obtient quelque chose comme ça :

victime@service.com%0Apirate@service.com

Et le tour est joué !

Haha oui mais moi j'ai bloqué les caractères "%" dans mon script PHP, je ne risque rien !

Et une fois de plus ce n'est qu'une idée reçue. Si le pirate veut contourner cette vérification, il peut sans problème afficher le code de la page et modifier le input en textarea. Il n'a alors plus besoin de "%0A" et votre vérification est inefficace !

Comment s'en protéger

Pas de grande surprise pour cette partie, le moyen le plus efficace pour s'en protéger est tout bonnement de supprimer les retours à la ligne lors du traitement

<?php
// On récupère la valeur du input
$chaine_utilisateur = $_POST['mail'];
// On supprime les retour à la ligne
$chaine_secure = str_replace(array("\n","\r",PHP_EOL),'',$chaine_utilisateur);
?>

Vous pouvez également vérifier que la chaine de caractères entrée par l'utilisateur est bien une adresse mail. Utilisez par exemple un filtre

<?php

$email = $_POST['mail'];

if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    // Valide
}

else {
    // Non valide
}

?>

Il est également possible de vérifier la forme de l'adresse grâce à une expression régulière.

Voilà ce type de vérification paraît anodin, mais vous évitera beaucoup de problèmes par la suite :)

Exemple de certificat de réussite
Exemple de certificat de réussite