AnzeigeVerwandte Seitengulli:Toolbox |
Die Sicherheit von WebservernIV. Sicherheitslücken am praktischen BeispielUm ein Haus vor Einbruch zu schützen, benutzt man Türen und sichert sie mit einem Schloss. Doch die besten Vorkehrungen können nicht schützen, wenn man vergisst, die Tür zu schließen. Ebenso nützt eine verschlossene Tür nichts, wenn das Schloss nur mit 2 kleinen Schrauben lose befestigt ist.
4.1. Beispiel 1 - "Never trust the web!"Traue niemals dem Web! (Never trust the web!) Unter diesem Grundsatz wurden im Zuge der Recherchen einige Seiten oberflächlich auf ihre Sicherheit überprüft.
Warning: Failed opening 'test.php' for inclusion (include_path='.:/usr/local/lib/php') in /home/beispielde/public_html/index.php on line 40
Diese Auskunft ist leicht zu deuten. Der PHP-Interpreter warnte hier, dass er die Datei "test.php" nicht gefunden hat und sie deshalb nicht einfügen bzw. nicht ausführen konnte. Die Variable $content wurde hier nicht auf ihre Gültigkeit geprüft. Der entsprechende Befehl der Zeile 40 lautete somit:
include($content .".php");
PHP bietet die Möglichkeit, Internetadressen wie Dateien zu behandeln. (Kapitel 3.1.2)
<?php echo("<h1>Never trust the web!/<h1>") ?> Beliebige Befehle konnten somit auf dem Webserver ausgeführt werden, solange sie nicht über die Rechte des PHP-Interpreters hinausgingen. Eine Modifikation der externen Datei zeigt den exakten Inhalt des verwundbaren Scriptes an:
39 if(!$content) $content = "welcome";
Wie erwartet, wurde hier der elementare Fehler begangen, auf den unbedenklichen Inhalt einer Variablen zu vertrauen. Zusätzlich war die Konfiguration des Webservers lückenhaft. Der PHP-Interpreter hatte das Recht, das Verzeichnis von "beispiel.de" zu verlassen und ermöglichte es einem Eindringling, sich durch fast alle Verzeichnisse des Computers zu bewegen. Diese Maschine war nicht wie ein üblicher Großrechner durch Verfahren wie suEXEC geschützt. Doch im Verzeichnis "/home" und "/home2" befanden sich insgesamt 1374 Verzeichnisse von Internetpräsenzen! Der Webserver gehörte einer ganzen Serverfarm an - mit der eigenen Nummer 73. Damit PHP sich mit seiner Datenbank verbinden kann, müssen die Zugangsdaten zwangsweise in einem lesbaren Format abgespeichert werden. Informationen wie Kreditkartennummern, Adressen und E-Mailadressen sind dadurch einsehbar. Durch diese falsche Konfiguration des Webserver hätte ein Cracker komplette Kontrolle über diese 1374 Internetpräsenzen. Nicht nur, dass ein Standardbenutzer derart viele Rechte besaß, die ziemlich veraltete Suse Linux Installation hätte man definitiv mit einem Exploit knacken können, um endgültig administratorische Rechte (root) genießen zu können!! 4.2. Beispiel 2 - Zugang für jedermannWie im Kapitel 3.1.5 beschrieben, sind besonders ASP Seiten zusammen mit dem MS SQL Serverdurch SQL Injektionen gefährdet. Ein besonders sensibler Punkt sindpasswortgeschützte Bereiche. Ein einfacher Anführungsstrich in einem durch Zufall gefundenen Formular brachte folgende Fehlermeldung:
Diese Meldung zeigt an, dass die Möglichkeit von SQL Injektionenbesteht. Für einen erfolgreichen Einbruch muss man zuerst die Strukturder Abfrage kennen. Hierzu kann man entsprechende Fehlermeldungen desSQL Servers wie folgt provozieren: Column 'User_Information.User_InformationID' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. Es wurde die Tabelle "User_Information" benutzt, um den Login zuverifizieren. Die erste Spalte dieser Tabelle hieß "User_InformationID".
Column 'User_Information.User_ID' is invalid in the select
Die zweite Spalte hieß demnach "User_ID". Die Eingabe von
' group by User_Information.User_InformationID, User_Information.User_ID having 1=1 --
ergab die nächste Spalte usw. Dieses wurde mehrfach ausgeführt, bis die Meldung "Cannot group by a bit column." erschien.
Wichtig ist zusätzlich der Typ einer jeden Spalte. Hierzu kann man die
' union select sum(User_InformationID) from User_Information --
führte zu
All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
"User_InformationID" muss somit ein numerischer Datentypen sein.
' union select sum(FullName) from User_Information --
führte zu
The sum or average aggregate operation cannot take a nvarchar data type as an argument.
"FullName" ist demnach eine Zeichenkette.
Mit diesen Angaben hätte ein Angreifer bereits Einträge in dieDatenbanktabelle machen können. Um eventuelle Fehleingaben zu umgehen,wurde für dieses Beispiel ein zusätzlicher Weg gewählt. Allerdings hatte dieser Account so gut wie keine Rechte, was wünschenswerter Weise geändert werden musste.
' UPDATE User_Information SET SuperUser='1' WHERE User_ID='j0j02' --
Ein erneutes Einloggen zeigte den erwünschten Erfolg. Einem Benutzer mit SuperUser Rechten standen eine Vielzahl von Optionen offen, um das Erscheinungsbild der gesamten Webseite zu verändern. normaler User: ![]() Superuser: ![]() Unter "Modify User Account" konnte man alle persönlichen Angaben einsehen. Felder, wie "First Name", beeinflussten dabei keine kritische Funktion im System. In diese Felder hätte man alle Rückmeldungen von Datenbankabfragen lenken können.
|
Weitere Tipps | ||||||||||||||||||||||||||||||||||||||||||||