Sicherheits relevante Fragen

Discuss phpwcms here, please do not post support requests, bug reports, or feature requests! Non-phpwcms questions, discussion goes in General Chat!
Post Reply
Findus
Posts: 48
Joined: Fri 15. Apr 2005, 10:56
Location: Neustadt
Contact:

Sicherheits relevante Fragen

Post by Findus »

Hallo,

heute wurde ich durch 1und1 auf folgendes aufmerksam gemacht:

--------->8-------------

PHP-Workshop: PHP-Seiten absichern
von Stephan Schmidt
Wenn Sie eine Website im Internet publizieren, die durch Verwendung einer Skriptsprache wie PHP Interaktion mit dem Benutzer ermöglicht, so ist diese Webseite für jedermann erreichbar. Sie müssen also auch damit rechnen, dass es Benutzer geben kann, die Schwachstellen in Ihrer Webseite aufspüren und ausnutzen möchten. In dieser Ausgabe des PHP-Workshops finden Sie Tipps, wie Sie häufige Schwachstellen ausmerzen können.

SQL-Injection
Viele PHP-Webseiten stellen Inhalte in HTML-Seiten dar, die zuvor in einer Datenbank, wie z.B. MySQL gespeichert werden. Sollten Sie diese Technik auch in Ihrer Webseite verwenden, und in Ihren Datenbankabfragen Parameter aus der URL übernehmen, so sollten Sie sich gegen die sogenannte SQL-Injection schützen.

Angenommen, Sie verwenden PHP-Code in Ihrer Seite, der dem folgenden ähnelt:

Code: Select all

$query  = "SELECT * FROM artikel WHERE id=".$_GET['id'];
$result = mysql_query($query);
Ein Angreifer könnte nun versuchen, für den Parameter id anstatt einer Zahl, die den Artikel identifiziert zusätzliche SQL-Abfragen einzuschleusen und somit z.B. Tabellen modizifieren oder verändern. Ein solcher Angriff könnte z.B. so aussehen:

Code: Select all

http://www.beispiel.de/artikel.php?id=1;DELETE%20FROM%20artikel
Unter Umständen würden hier beide SQL-Anweisungen ausgeführt, wodurch alle Artikel gelöscht werden. Um sich dagegen abzusichern reicht es, den Code leicht zu modifizieren:

Code: Select all

$query  = "SELECT * FROM artikel WHERE id=".(integer)$_GET['id'];
$result = mysql_query($query);
Diese kleine Änderung stellt sicher, dass nur Zahlenwerte in die SQL Anweisung eingefügt werden, wodurch Sie schon eine Sicherheitslücke verhindert haben.

Cross-Site-Scripting
Unter dem Begriff "Cross-Site-Scripting" versteht man das Einschleusen von Javascript-Code in Web-Anwendungen. Damit kann der Angreifer z.B. Cookies der Besucher auslesen. Vor Cross-Site-Scripting müssen Sie sich schützen, wenn Sie Daten, die ein Benutzer an Ihre Anwendung schickt und Sie diese später den anderen Besuchern Ihrer Seite anzeigen, wie es z.B. bei einem Gästebuch der Fall ist.

Ein solches Gästebuch besteht in der Regel aus zwei Dateien, eine Datei nimmt neue Einträge entgegen und speichert diese z.B. in der Datenbank:

Code: Select all

$name      = $_POST['name'];
$kommentar = $_POST['kommentar'];

$query  = "INSERT INTO gaestebuch SET name='$name', kommentar='$kommentar'";
$mysql_query($query);
Und in einer zweiten Datei werden einfach alle Einträge wieder ausgegeben:

Code: Select all

$query  = "SELECT * gaestebuch LIMIT 0,10";
$result = $mysql_query($query);
while ($eintrag = mysql_fetch_assoc($result)) {
    printf ("<b>%s</b><br />", $eintrag['name']);
    printf ("<p>%s</p>", $eintrag['kommentar']);
}

So könnte ein Angreifer versuchen, Javascript Code in eines der Felder einzutragen, welcher somit in der Datenbank gespeichert wird:

Code: Select all

<script type="text/javascript">alert('Seite ist unsicher!');</script>
Zeigen Sie diesen Eintrag nun anderen Besuchern an, so sehen diese Besucher ein kleines Pop-Up-Fenster, was zwar kein Sicherheitsrisiko darstellt, aber dennoch als störend erachtet wird. Um den Javascript-Code schon vor dem Speichern zu filtern, bietet Ihnen PHP eine Funktion, um ungewünschte HTML-Tags zu entfernen. Dazu müssen Sie das Skript zum Speichern nur leicht modifizieren:

Code: Select all

$name      = strip_tags($_POST['name']);
$kommentar = strip_tags($_POST['kommentar']);

$query  = "INSERT INTO gaestebuch SET name='$name', kommentar='$kommentar'";
$mysql_query($query);
Die Funktion strip_tags() entfernt sämtliche HTML-Tags aus den eingegebenen Daten und somit verschwindet auch der Javascript-Code, den der Angreifer eingegeben hat.

Eine zweite Möglichkeit ist, die Daten bei der Ausgabe dementsprechend anzupassen, dass der Javascript-Code nicht vom Browser ausgeführt sondern angezeigt wird. Dazu müssen ja nur die HTML-Tags <script> und </script> Tags durch <script> und </script> ersetzt werden. < und > sind die so genannten HTML-Entitäten für das Kleiner- und Größer-Zeichen, die in HTML ja eine Sonderstellung einnehmen, da sie den Anfang und das Ende eines Tags begrenzen.

Die PHP-Funktion htmlentities() kann verwendet werden, um alle Zeichen, die in HTML eine Steuerfunktion haben, durch die entsprechenden Entitäten zu ersetzen, so dass diese im Browser ganz normal angezeigt werden. Sie müssen also nur das Skript, dass alle Einträge ausgibt, leicht anpassen:

Code: Select all

$query  = "SELECT * gaestebuch LIMIT 0,10";
$result = $mysql_query($query);
while ($eintrag = mysql_fetch_assoc($result)) {
    printf ("<b>%s</b><br />", htmlentities($eintrag['name']));
    printf ("<p>%s</p>", htmlentities($eintrag['kommentar']));
}
Dadurch wird der Javascript-Code zwar ausgegeben, aber nicht vom Browser ausgeführt.

Durch die hier erläuterten kleinen Veränderungen an Ihren Skripten können Sie Ihre Website bereits gegen die häufigsten Angriffe schützen. Verwenden Sie auf Ihren Webseiten von 1&1 zur Verfügung gestellte Module, so sind diese natürlich schon gegen diese Attacken geschützt.

* Stephan Schmidt ist Web-Application-Developer bei der 1&1 Internet AG. Weiterhin ist er regelmäßiger Autor des PHP Magazins und auf internationalen Konferenzen zum Thema PHP als Redner vertreten.

--------->8-------------

Für mich stellen sich nun zwei Fragen:

Ist das überhaupt relevant?
Is das in phpWCMS berücksichtigt?

die ich zur Diskussion stellen möchte.
Image
brans

Post by brans »

a.) Meiner Meinung nach ist das völliger Blödsinn, im Bezug auf phpwcms, es sei denn, dass 1und1 ohne Mysql-Benutzer und passwort arbeitet?!?

Es muss sich zuerst Zugriff auf den Server beschafft werden, was schonmal einen grossen Aufwand bedeutet und normalerweise aufgrund der gängigen Methoden einen Alarm bei 1und1 auslösen sollte.


Cross-Scripting ist in phpwcms nur insofern relevant, als man das Gästebuch oder das Forum derart modifiziert, dass JavaScript einbaubar wäre, wirklich gefährlich sind diese Scripte aber auch nicht.
Post Reply