Les injections CRLF

Auteur : palkeo
Créé le : le 21/09/2008 à 20:42
Visualisations : 2993
Ce tutoriel est composé des parties suivantes :

Introduction

Dans ce tutoriel, je vais vous parler d'une faille très peu connue : L'injection CRLF
Elle consiste à injecter des caractères de fin de ligne dans des formulaire, et peu conduire à tout types de vulnérabilités.

Présentation

L'injection CRLF, tout comme la faille XSS, repose sur le fait que les entrées de l'utilisateur ne sont pas vérifiées, et contiennent des données qui ne sont pas attendues.
Mais, contrairement à la faille XSS, elle ne consiste pas en l'injection de code HTML, mais de... passage à la ligne !

Prenons l'exemple de la fonction mail() de PHP.
Elle prend comme paramètre le destinataire du mail, le sujet du mail, son contenu, et éventuellement des "headers" additionnels.
Toutefois, admettons que vous souhaitiez définir un expéditeur (ce qui doit se faire lorsque vous envoyez un mail).
Il suffira de définir le paramètre contenant les header à "From: expediteur@nom-de-domaine.com" par exemple.
Mais, si vous laissez l'utilisateur choisir l'expéditeur, il pourra insérer un saut de ligne, puis insérer d'autres headers !

Par exemple, si l'utilisateur injecte "expediteur@ndd.com%0ACc: copie@ndd.com", une copie du mail sera envoyée à copie@ndd.com, grâce au header "Cc" (Copie Conforme).
Notez que le %0A, en HTML, correspond au saut de ligne, au \n si vous connaissez (car, 0A est le code hexadécimal qui correspond au saut de ligne dans la table ASCII).
Plutôt que d'insérer un %0A, qui sera "échappé" par le navigateur, et qu'il faudra donc redéfinir avant l'envoi avec une extension comme Tamper Data (pour firefox), le plus simple reste de modifier le code source de la page pour remplacer le champ dans lequel on défini l'e-mail de l'expéditeur par une textarea, puis il suffit de passer à la ligne dans cette dernière pour pouvoir effectuer l'injection.
Notez qu'il est possible d'insérer tout un tas d'autres headers, ce qui peut conduire à de gros problèmes de sécurité.


Un second exemple est l'injection de ligne dans des logs d'un site.
Admettons que dans les logs d'un site web soient sauvés le pseudo de tous les nouveaux inscrits, avec leur adresse IP, ainsi que les éventuelles erreurs, ou alertes de sécurité.
Si quelqu'un utilise cette technique pour utiliser un pseudo sur plusieurs lignes, il pourra alors injecter de nouvelles lignes dans le log.
Par exemple, si quelqu'un s'inscrit avec pour pseudo palkeo, on aurait :
Code : log
Inscription de palkeo (IP: 45.124.56.213)
mais si quelqu'un s'inscrit avec pour pseudo "palkeo (IP: 25.85.65.12)%0AAlerte de sécurité, tentative de piratage", on obtient :
Code : log
Inscription de palkeo (IP: 25.85.65.12)
Alerte de sécurité,tentative de piratage (IP: 45.124.56.213)
Ainsi, on a pu falsifier son adresse IP, et faire croire à une tentative de piratage !

Conclusion

Ainsi, pensez à vérifier que les entrées utilisateurs ne contiennent pas de passage à la ligne (\n), surtout quand ces entrées vont êtres insérées dans des logs, des headers de mail, ou même des headers HTTP !