Grundlagen der sicheren PHP Programmierung Parametermanipulationen und Injektionslücken Stefan Esser Hardened-PHP Project.

Slides:



Advertisements
Ähnliche Präsentationen
Ausführen.
Advertisements

Aufbau des Internets Überblick Prof. Dr. T. Hildebrandt
Basis-Architekturen für Web-Anwendungen
Allgemeine Technologien II
Vorstellung von PaderWAVE Generierung von Web-Anwendungen aus visuellen Spezifikationen, SS04 Projektgruppe der AG Kastens.
Objektrelationales Mapping mit JPA
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Daniel Höfler Markus Thurner XMLApplicationPlatform Siemens OpenStage 60/80.
Stefanie Selzer - Pascal Busch - Michael Kropiwoda
FH-Hof Servlets Richard Göbel. FH-Hof Konzept Servlets werden auf der Server-Seite durch ein Formular aufgerufen werten die Eingaben aus einem Formular.
Dateihandles Um in Perl eine bestimmte Datei zum Lesen, Schreiben oder Anhängen zu öffnen, benötigt man so genannte Dateihandles. Ein Dateihandle ist der.
Datenbankanbindung mit ASP Wilhelm-Schickard-Schule Tübingen
Oracle PL/SQL Server Pages (PSP). © Prof. T. Kudraß, HTWK Leipzig Grundidee: PSP – Internet-Seiten mit dynamischer Präsentation von Inhalten durch Einsatz.
Technik Gestaltung Navigation Daten. Übersicht Client Webbrowser InternetServer.
NetUSE Web Application Framework Kai Voigt NetUSE AG 28. Februar 2003.
Einführung MySQL mit PHP
Welche Vor-/Nachteile hat die Bestellung über das Web?
Der VFP Debugger - Coverage und Profiling. © 1999 TMN-Systemberatung GmbH Der VFP Debugger n Neues Aussehen, eigene Task n Erweiterte Möglichkeiten n.
Seite Common Gateway Interface. Konzepte. Übersicht 1Einleitung 2Was ist CGI? 3Wozu wird CGI verwendet? 4Geschichtlicher Überblick 5Grundvoraussetzungen.
PHP Pakete und Beispiele Webengineering Robert Lemke.
Jetzt lernen wir.
YouTube5 .0 Projektpräsentation
... und alles was dazugehört
Welche Funktion hat die php.ini? -Beinhaltet wichtige Einstellungen für PHP. Genannt seien hier u.a. der Speicherort von Cookies, Parameter der Kompilierung,
Einführung Servlets/JSPs
SQL PHP und MySQL Referat von Katharina Stracke und Carina Berning
JavaScript Object Notation
Wir bauen uns eine Webapplikation!
JavaScript.
Projektarbeit PHP 5.3 / MySQL & Content Management Systems
Teilnehmer: Sven Dahmer BAMP01 Marco Pohl BAMP02 Toni Möckel BAMP02 Java – Projekt 2010 Projekt: Realisierung einer API – Applikation für den weltgrößten.
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Erstellen einer Webseitenstatistik mithilfe eines OLAP-Servers
Erstellen einer Webseitenstatistik mithilfe eines OLAP-Servers
Basiswissen für Partner und interessierte Kunden Technologie.
PHP und MYSQL am Organisatorisches Der komplette Kurs im Schnelldurchgang Bewertung von wichtig und unwichtig Historisch Kulturwissenschaftliche.
Grundlagen: Client-Server-Modell
PHP und MYSQL am Organisatorisches Speichern von Bildern in der Datenbank // Zwei Methoden BLOB-Felder in der Datenbank Einlesen von Dateien.
Clientseitig Session IDs Erweiterungen wie NoScript Cookies verbieten Serverseitig Tokens HTML Entities verwenden 1.
25. Januar 2007Klasse IT '041 Projekt Solar Server Schulprojekt der Klasse IT `04.
1 MEDEA3 / IWC-RLO Medea3 System-Übersicht Haupt-Komponenten von Medea 3 –Medea 3 SERVER SUN/SOLARIS System ORACLE 8i Datenbank Server Medea 3 Kernel Apache.
Folgendes kann missbraucht werden: formulare unverschlüsselte login-informationen ungeschützte includes SQL-injection reto ambühler
Internet und SMS Internet und SMS Daniel Rickenbacher Jeremy Deuel.
CGI (Common Gateway Interface)
PHP Basic.
Dynamische Webseiten-Generierung
Einführung in PHP.
Einführung in PHP 5.
Webseiten mit PHP, SQL, XML und Webservices Anhand praktischer Beispiele.
Web 2.0 & AJAX (A)sysnchrones (J)avaScript (A)nd (X)ML
Hacking InfoPoint Jörg Wüthrich Infopoint - Hacking - Jörg Wüthrich 2/26 Inhalte Rund um das Thema Hacking Angriffs-Techniken Session.
Mag. Andreas Starzer weloveIT – EDV Dienstleistungen
Gruppe 1 – Linux Server Maxim Mozgovoi Patrick Preidel
JANIK BAUMANN | MANUEL LOPEZ | RYAN HILLHOUSE | LUKAS KAMBER
Blockseminar Allgemeine Technologien II Dozent: P. Sahle März 2009 PHP in HTML Referentin: Angela Brinck.
Formulare Vanessa Kogelbauer.
Internet-Grundtechnologien. Client / Server Client („Kunde“): fordert Information / Datei an im Internet: fordert Internetseite an, z.B.
PhpMyAdmin.
(Syntax, Strings/Zahlen, Variablen, Arrays)
Java Server Pages Technologie zur Erzeugung dynamischer Webseiten basierend auf Java-Servlets Blockseminar Wintersemester 2001/2002Jochen Pfeiffer Seite.
Typo 3 Templates und TypoScript Dedizierte Systeme Vom Contentmanagementsystem zur Digitalen Bibliothek. Was leisten digitale Repositories? Seminarleitung:
Formulare Maya Kindler 6c. Allgemein Vom client zum Server form tag eröffnet ein Formular Input tag eröffnet ein Formularfeld.
1 JavaServer Pages Stephan Baldes JavaServer Pages Einführung
Arten von Viren Es gibt verschiedene Arten von Viren.
Grundstruktur einer HTML-Seite 1 Thema Die Grundstruktur einer HTML-Seite.
Funktionen, Felder und Parameter- übergabe. Funktionsaufruf mit Feld als Parameter: Parameter = Name des Feldes.
Unternehmensweite und Internetrichtlinien und deren Einhaltung mit BlueCoat & Sophos.
Sicherheit in Webanwendungen „CrossSite“, „Session“ und „SQL“ Angriffstechniken und Abwehrmaßnahmen Mario Klump.
Schmock Mutter nicht ausreichend versorgt  fast verhungert Mutter bei Geburt verstorben Schmock mit Flasche aufgezogen.
Datenbanken
 Präsentation transkript:

Grundlagen der sicheren PHP Programmierung Parametermanipulationen und Injektionslücken Stefan Esser Hardened-PHP Project

Worüber gesprochen wird... Was sind Parametermanipulationen? Was sind Injektionslücken? Was für typische Lückenarten existieren? Wie wirken sie auf PHP Skripte? Wie kann man sich gegen diese Lücken schützen bzw. sie vermeiden?...

Worüber nicht gesprochen wird... Aufsetzen eines sicheren PHP Servers Behandlung von hochgeladenen Dateien Ausgeben von Fehlermeldungen Probleme des Session-Managements Probleme der Programmierlogik Neue Klassen von Lücken in PHP5...

Einfacher schematischer Aufbau einer Webapplikation Datenbank- subsystem Verarbeitungs- Logik Dateisystem Shell- Kommandos Eingabe- Parameter HTTP Header HTML Ausgabe... XML, XMLRPC, SOAP...

Was sind Parametermanipulationen? Parameter = Argumente, welche die Arbeitsweise des PHP Skriptes beeinflussen Parametermanipulation = Gezielte Beeinflussung der Arbeitsweise eines Skriptes durch Übermittlung von... unerwarteten Werten z.B. 9, obwohl ein Voting zwischen 1 und 5 erwartet wird unerwarteten Datentypen z.B. ein Array, obwohl eine Zeichenkette erwartet wird unerwarteten Parametern z.B. Überschreiben von uninitialisierten Variablen wenn register_globals aktiviert ist

Missverständnisse Ich habe register_globals ausgeschaltet, meine Applikationen sind jetzt sicher Meine Formulare sind sicher, ich checke alle Daten per JavaScript Datentransfer generell nur per POST, damit Daten nicht manipuliert werden können Meine Website ist nicht interessant genug, um gehackt zu werden

Parametervertrauen Webapplikationen können nicht sinnvoll ohne Parameter arbeiten Aber alle Parameter die vom Benutzer kommen, sind potentiell verseucht (d.h. manipuliert) und müssen so behandelt werde Dies gilt vor allem auch für Dinge die man in einem Webbrowser normalerweise nicht sehen kann: Cookies, versteckte Formularfelder Dies gilt für Typen, Wertebereiche und insbesondere für die Werte selber Beispiel: Keine Preise in Formularen weiterreichen

Beispiel: Parametermanipulation in einem realen Webshop Manipulation von Formularfeldern Hilfsmittel: Firefox mit Webdeveloper Extension Anhand von Screenshots, da kein Internet Zugang Disclaimer 1 – Demonstration anhand des Warenkorbs legal, Bestellung abgeben wäre Betrugsversuch Disclaimer 2 – das folgende Beispiel soll in keinem Fall als positive oder negative Wahlwerbung verstanden werden

Livedemonstration (zensiert) Die Live Demonstration anhand des Webshops wurde zensiert, bis die betroffene Partei komplett auf ein anderes Shopsystem umgestiegen ist Bisher wurde lediglich der Debugging Modus ausgeschaltet, so dass nicht mehr alle SQL Queries im HTML Quelltext als Kommentare zu finden sind Da es allerdings weiterhin möglich ist, durch Manipulation der Preise verbilligt einzukaufen, sind die Screenshots bis auf weiteres entfernt

register_globals Direktive (I) Steuert ob GET, COOKIE, POST Variablen automatisch globalisiert werden oder nur über Superglobals _GET, _COOKIE, _POST erreichbar sind Deaktiviert in der Standard-Konfiguration seit PHP 4.2 Aber(!!!): In den meisten PHP Installationen reaktiviert aus Kompatibilitätsgründen -> PHP Landschaft sehr heterogen register_globals ausschalten kein Tip für sicheres Programmieren Kein Sicherheitsloch von alleine, aber erlaubt Überschreiben von nicht initialisierten globalen Variablen durch unerwartete Parameter

register_globals Direktive (II) Tip 1: Vermeidung von uninitialisierten Variablen durch Entwicklung mit E_NOTICE Achtung(!!!): Findet keine nicht korrekt initialisierte Arrays homebase:~# php -r ' error_reporting(E_ALL); $y = $noinit;' Notice: Undefined variable: noinit in Command line code on line 1 homebase:~# php -r ' error_reporting(E_ALL); $y["foobar"] = 4;'

register_globals Direktive (III) Tip 2: Deregistrierung der globalen Variablen <?php // Emulate register_globals off function unregister_GLOBALS() { if (!ini_get('register_globals')) {ini_get return; } // Might want to change this perhaps to a nicer error if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) { die('GLOBALS overwrite attempt detected'); } // Variables that shouldn't be unset $noUnset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES'); $input = array_merge($_GET, $_POST,array_merge $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());is_array foreach ($input as $k => $v) { if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {in_array unset($GLOBALS[$k]); } unregister_GLOBALS(); ?>

Unsichere Includes (I) Includes sind ein mächtiges Werkzeug, da sie die Ausführung anderer Dateien erlauben Für viele Programmierer zu mächtig aufgrund der Möglichkeiten von Remote Includes Erlaubt es beliebigen Code auszuführen, beliebige Dateien anzusehen, durch Manipulation des action Parameters action= action=php://input%00 action=/etc/passwd%00 <?php include $_GET['action']."-action.php"; ?>

Unsichere Includes (II) Beteiligte Subsysteme: Dateisystem und URL Handler von PHP Probleme: allow_url_fopen KEIN 100% Schutz gegen externen Code (php://input) Behandlung des ASCII Sonderzeichens NUL (Metazeichen) Lokale Dateien können auch bösen Code enthalten realpath() erlaubt merkwürdige Dinge auf manchen Systemen Bsp: /templates/foobar-template.php/../../../../../../../etc/passwd Fazit: Niemals ungeprüft Daten an Include/Require Statements geben

Cross Site Request Forgeries CSRF beschreibt die Möglichkeit, dass die Webclients der User durch Tricks dritter Parteien dazu gebracht werden Aktionen auf der Webseite durchzuführen Auslöser: Image Tag Java-Script (POST Requests) Ziele: Votingskripte One-Click Käufe Lösungen: Referrer Checks Formular Tokens in Session speichern

HTTP Response Splitting Injektion von Daten in den Stream der HTTP Header Metazeichen: \r und \n Probleme: Über Manipulation des action Parameters können Daten direkt in die Ausgabe geschrieben werden, zum einen sind das weitere Header aber auch die HTML Rückgabe Ermöglicht Cross Site Scripting (XSS) und Verwirrung von Proxies/Caches -> Pseudo Defacement Fazit: Parameter für header() immer urlencode()n oder Sonderzeichen wie \r und \n strippen <?php header("Location: ?>

eval() und ähnliches eval(), assert(), preg_replace(mit //e Modifier), call_user_func(), call_user_func_array(),... erlauben durch ihre Parameter Code auszuführen -> daher aufpassen, was an die entsprechenden Funktionen gegeben wird Metazeichen: Hängen von der Einfügeposition in eval() ab Fügt man innerhalb von doppelten Anführungszeichen einen String in ein eval() Statement, dann müssen doppelte Anführungszeichen, Backslashes und das Dollarzeichen behandelt werden eval() und preg_replace() mit //e Modifier möglichst vermeiden Rasmus Lerdorf: Wenn eval() die Antwort ist, dann hast Du die falsche Frage gestellt

Shell Command Injection shell_exec(), system(), passthru(), exec(), proc_open(), popen() erlauben das Aussführen von Shell Kommandos Problem: Parameter bild wird ungeprüft in den dynamisch zusammengesetzten Shell Befehl eingefügt Durch Ausnutzung von Metazeichen der Shell, die z.B. die Ausführung mehrere Kommandos in einer Zeile erlauben, ist es möglich beliebige Kommandos auszuführen bild=;touch /tmp/i-was-here; Fazit: Korrekte Behandlung der Parameter durch Typecasting auf Zahlen oder durch Anwendung von escapeshellarg() <?php system("convert ".$_GET['bild'].".jpg ".$_GET['bild'].".png"); ?>

HTML Injection und Cross Site Scripting/XSS (I) XSS wird oftmals als Synonym verwendet für HTML Injection, was nicht ganz korrekt ist Problem: Benutzereingaben die ausgegeben werden, können potentiell auch HTML Tags beinhalten oder HTML Tags mit neuen Attributen ergänzen Die Manipulation des Usernamens erlaubt hier zum Beispiel das Einfügen von Image Tags aber auch von JavaScript in die Ausgabe username= username= alert(document.cookie); <?php echo "Hallo ".$_GET['username']; ?>

HTML Injection und Cross Site Scripting/XSS (II) Was durch XSS zum Beispiel möglich ist Browser des Opfers kann mehr oder weniger komplett ferngesteuert werden (und das unsichtbar) Cookies können unsichtbar ausgelesen werden -> Verlust von Passwörtern, Passworthashes und Session Ids XSS auf Loginseiten kann dazu führen, dass Formularziele umgeschrieben werden XSS auf Loginseiten können genutzt werden, um das Formular automatisch (an ein anderes Ziel) abzuschicken, nachdem FireFox die Passwörter ausgefüllt hat XSS auf Formularseiten kann z.B. zum Spamming oder zum Umgehen von CSRF Schutzmassnahmen genutzt werden Der Inhalt der Seite kann generell komplett mit eigenen News vertauscht werden...

HTML Injection und Cross Site Scripting/XSS (III) Lösungsmöglichkeiten 1.Tags/Tagzeichen/Quotes bereits bei der Eingabe ablehnen (rausfiltern -> nicht beste Praxis) strpos(), strip_tags(), str_replace(),... 2.Tags/Tagzeichen/Quotes bei der Ausgabe behandeln htmlspecialchars(..., ENT_QUOTES) 3.Bestimmte Tags/Tagzeichen/Quotes erlauben strip_tags(..., erlaubte_tags) einfacher BBCode Parser 4.Kompliziertes Parsen des HTML und nur gute Sachen erlauben z.B.: Solche Lösungen gelten nur solange als sicher, bis jemand eine Lücke findet

SQL Injection (I) Nicht Beachtung der SQL Metazeichen kann zur ungewollten Ausführung von SQL Kommandos führen Mutter aller SQL Statements Übermittelt der Nutzer z.B. den Usernamen Admin OR 17>25 /* so wird daraus die SQL Abfrage (wenn magic_quotes_gpc=off) SELECT UserLevel FROM User WHERE Name=Admin OR 17>25 /* AND Password=foobar $name = $_POST['username']; $pwd = md5($_POST['password']);md5 mysql_query($link, "SELECT UserLevel FROM User WHERE Name=$name AND Password=$pwd ");mysql_query

SQL Injection (II) Zur Eliminierung von SQL Injection Problemen sind mehrere Ansätze gebräuchlich Escaping der Anführungszeichen mit DB spezifischen Funktionen addslashes() als Fallback mysql_real_escape_string() escaped z.B. auch noch Zeichen die Escape- Sequenzen in Terminalprogrammen darstellen, so dass durch Anschauen eines Logfiles nicht das Terminalprogramm ferngesteuert werden kann Achtung in MSSQL wird z.B. ein Anführungszeichen durch Verdopplung escaped Explizites Typ-Casting von erwarteten Zahlen SELECT UserLevel FROM User WHERE UserID=.((int)$_POST[id]) Nutzung von Prepared-Statements SQL Statements mit Platzhaltern für die Parameter wird nur einmal analysiert Parameter werden später an das Statement gebunden Keine dynamische Konstruktion des Statements und daher keine Möglichkeit zur Injection Nachteil: Für MySQL wird MySQLi + PHP5 benötigt

Exkurs: magic_quotes_gpc Wenn magic_quotes_gpc aktiviert ist, wird automatisch addslashes() auf alle Parameter angewendet Dies wurde eingeführt um SQL Injection zu erschweren, hat aber das Problem, dass so die Sicherheit der Applikation Konfigurationsabhängig ist (z.B. MSSQL vs. MySQL) Zusätzlich ist es sinnvoll, weitere Zeichen zu escapen, damit z.B. Terminalprogramme nicht durch geloggte Queries aus dem Tritt kommen Tips: Beim Start der Applikation im Falle von magic_quotes_gpc=On das Escaping mit stripslashes() rückgängig machen Per ini_set() magic_quotes_runtime zusätzlich deaktivieren

SQL Injection (III) Mutter aller Queries mit korrektem Escaping Mutter aller Queries als Prepared Statement $name = mysql_real_escape_string($_POST['username'], $link); $pwd = md5($_POST['password']);md5 mysql_query($link, "SELECT UserLevel FROM User WHERE Name=$name AND Password=$pwd ");mysql_query /* prepare statement */ if ($stmt = mysqli_prepare($link, "SELECT Userlevel FROM User WHERE Name=? AND Password=?")) { /* bind parameter to prepared statement */ mysqli_stmt_bind_param($stmt, 'ss', $_POST['username'], md5($_POST['password']));md5 mysqli_stmt_execute($stmt); /* bind variables to prepared statement */ mysqli_stmt_bind_result($stmt, $UserLevel); /* fetch values */ if (mysqli_stmt_fetch($stmt) && $UserLevel == 1) {... } /* close statement */ mysqli_stmt_close($stmt); }

Zusammenfassung 1.Vertraue niemals Daten die einmal beim User waren 2.Sei insbesondere vorsichtig, wenn diese Daten an Subsysteme bzw. an die Ausgabe weitergegeben werden 3.Behandle immer alle Metazeichen bei der Kommunikation mit Subsystemen 4.Lehne Werte die Dir spanisch vorkommen ab und versuche sie nicht zu reparieren 5.Benutze eval() nur, wenn es absolut keine andere Möglichkeit gibt 6.Schreibe Deinen Code unabhängig von Konfigurationsdirektiven wie magic_quotes_gpc, register_globals und allow_url_fopen

Noch Fragen?