Sicherheit in CONTENTSERV ab CS11 Frank Ipfelkofer 24.11.2010.

Slides:



Advertisements
Ähnliche Präsentationen
Entwicklung UnivIS-Anbindung auf Basis von PHP und DOM-XML
Advertisements

Dynamische Seiten mit Dreamweaver Zugriff auf (mysql) Datenbank mit PHP.
Kapselung , toString , equals , Java API
Datenbankzugriff im WWW (Kommerzielle Systeme)
eXist Open Source Native XML Database
Seite 1Maria, Philipp, Herbert Seite 1 Fitnessplaner Ziele: >Fitnessplaner für Onlinebetrieb >Registrierung >individuelle Trainingsplanerstellung.
Java 2 Enterprise Edition (J2EE)
FH-Hof Einbindung von JavaScript Anweisungen
Java: Dynamische Datentypen
DOM (Document Object Model)
Dynamische Webseiten mit PHP
Datenbankanbindung mit ASP Wilhelm-Schickard-Schule Tübingen
XHTML 1.1 C. Nimz Abstrakte Module XHTML 1.1 C. Nimz Was ist ein abstraktes Modul? Definition eines XHTML-Moduls in spezieller leichter.
Oracle PL/SQL Server Pages (PSP). © Prof. T. Kudraß, HTWK Leipzig Grundidee: PSP – Internet-Seiten mit dynamischer Präsentation von Inhalten durch Einsatz.
Oracle WebServer - Einführung. © Prof. T. Kudraß, HTWK Leipzig Oracle Web Application Server HTML WebServer ® File system Static HTML PL/SQL Packages.
Modularisierungstechniken
Technik Gestaltung Navigation Daten. Übersicht Client Webbrowser InternetServer.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Einführung MySQL mit PHP
Seite Common Gateway Interface. Konzepte. Übersicht 1Einleitung 2Was ist CGI? 3Wozu wird CGI verwendet? 4Geschichtlicher Überblick 5Grundvoraussetzungen.
FH-Hof HTML - Einführung Richard Göbel. FH-Hof Komponenten des World Wide Webs WWW Browser HyperText Transfer Protocol (HTTP) via Internet WWW Server.
YouTube5 .0 Projektpräsentation
Welche Funktion hat die php.ini? -Beinhaltet wichtige Einstellungen für PHP. Genannt seien hier u.a. der Speicherort von Cookies, Parameter der Kompilierung,
SQL PHP und MySQL Referat von Katharina Stracke und Carina Berning
Java programmieren mit JavaKara
Herzlich Willkommen… welcome… soyez la bienvenue….
Wir bauen uns eine Webapplikation!
Grundlagen der sicheren PHP Programmierung Parametermanipulationen und Injektionslücken Stefan Esser Hardened-PHP Project.
JavaScript.
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
PHP und MYSQL am Organisatorisches Der komplette Kurs im Schnelldurchgang Bewertung von wichtig und unwichtig Historisch Kulturwissenschaftliche.
Typo 3. INSTALLATION TYPO3 INSTALLTOOL EXTENSIONS UND TEMPLATES INSTALLATION TEMPLAVOILA USERMANAGEMENT Inhalt:
Wird ganz am Anfang der HTML-Datei geschrieben Doctype html public bedeutet, dass man sich auf die Öffentlichkeit der html-dtd bezieht Html ist die meist.
Sesame Florian Mayrhuber
Folgendes kann missbraucht werden: formulare unverschlüsselte login-informationen ungeschützte includes SQL-injection reto ambühler
XML-Serverpages Vortrag im Rahmen des Seminars XML-Technologien Tobias Faessler.
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Dynamische Datentypen
Daniel Franke Tim Benedict Jagla Matthias Thimm
Vom Kontext zum Projekt V Carina Berning Sabrina Gursch Pierre Streicher Intelligente Dateisysteme.
Wie man Webanwendungen vor Angriffen schützen kann
PHP Basic.
Oliver Spritzendorfer Thomas Fekete
Dynamische Webseiten-Generierung
Einführung in PHP.
Einführung in PHP 5.
Webseiten mit PHP, SQL, XML und Webservices Anhand praktischer Beispiele.
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
AUGE e.V. - Der Verein der Computeranwender Eine eigene Foto-Homepage auf auge.de Peter G. Poloczek M5543.
PHP: Operatoren und Kontrollstrukturen
Vortrag: Frames & Javascript.
Daniel Franke Tim Benedict Jagla Matthias Thimm.
Formulare in HTML.
Compact Survey Language Dokumentation: csl-survey.de/doku.pdf Team: Kasimir Blust, Laura Seidler.
Blockseminar Allgemeine Technologien II Dozent: P. Sahle März 2009 PHP in HTML Referentin: Angela Brinck.
Formulare Vanessa Kogelbauer.
CODA - Installation Installation der Binärdateien –Venus: Client-Programm –Vice: Server-Programm –Für Windows existiert eine Alpha-Version (Coda Client.
Quelle: xkcd.com SQL Injections.
TypoScript.
Formulare Maya Kindler 6c. Allgemein Vom client zum Server form tag eröffnet ein Formular Input tag eröffnet ein Formularfeld.
Rechen- und Kommunikationszentrum (RZ) Sicherheitsorientierte Webentwicklung am Beispiel der Matse-Dienste Jan-Frederic Janssen.
J.GehlenDept. of Medical Informatics 1 Department of Medical Informatics, Uniklinik RWTH Aachen, Germany Sichere Mobile Datenerfassung.
Tutorium Software-Engineering SS14 Florian Manghofer.
© Raphael Volz 2001 Slide 1 Zope Grundlagen Seminar – Praktikum Knowledge Portals Raphael Volz.
Einführung in die Programmierung
 Präsentation transkript:

Sicherheit in CONTENTSERV ab CS11 Frank Ipfelkofer

TOP 10 Sicherheitsrisiken ( A1: Injection A2: Cross-Site Scripting (XSS) A3: Broken Authentication and Session Management A4: Insecure Direct Object References A5: Cross-Site Request Forgery (CSRF) A6:Security Misconfiguration A7: Insecure Cryptographic Storage A8: Failure to Restrict URL Access A9: Insufficient Transport Layer Protection A10: Unvalidated Redirects and Forwards

Injection - Probleme Eingabeparameter werden ungeprüft und nicht escaped übergeben: Systemaufrufe: Exec („ls“. $_GET[„folderName“]); folderName=„/|rm –r“ PHP-Aufrufe: Include($_GET[„file“]);&file=„/etc/...“ Eval($_GET[„phpCode“]); Dateioperation: FileXXX($GET[„file“]), Unlink($_GET[„file“]),... Datenbank SQL Injection: ‘SELECT * FROM WHERE ID = “‘.$id.’ “‘ id= 0“ OR 1=1 “

Injection - Absicherung Alle Request-Parameter mittels CSSecurity.xml schützen Dynamische Parameter vermeiden und auf jeden Fall escapen: ’...AND ID = “ ‘.Database::quote($id) Keine dynamischen Includes (wenn dann unbedingt geschützt) Wenn möglich keinen dynamischen PHP-Code ausführen. CSSecurity::evalCommand($phpCode, $context = array()) verwenden (könnte zentral abgesichert werden – ist aber kein 100% Schutz) CSFileUtils nutzen für Dinge wie readfile, fopen,... Prozesse über CSSystemUtils::executeCommand ausführen...

Cross-Site Scripting (XSS), Cross-Site Request Forgery (CSRF) Per Javascriptcode COOKIES auslesen bzw. Code ausführen, z.B. im Sessioncontext irgendwelche Aktionen ausführen. foo= ' 〉〈 script 〉 document.location= ' bin/cookie.cgi?foo='+document.cookie 〈 /script 〉 echo $_GET[‚title‘]; title = alert(„attack“) Universelles Angriffspattern ( ';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))/ /--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>=&{}

Cross-Site Scripting (XSS), Cross-Site Request Forgery (CSRF) – Absicherung Alle Ausgaben mit CS::htmlentities() verwandeln echo CS::htmlentities($_GET[‚title‘]); Dynamische Parameter mit HTML-Eingabe vermeiden CSSecurity.xml nutzen Schnellabsicherung: CSSecurity.xml verwenden

Insecure Direct Object References Failure to Restrict URL Access Rechteprüfung von Objekten ist nicht ausreichend. Gib mir alle Objekte oder zeige Objekt XYZ an. showProduct&ProductID=2showProduct=5 Ob Seiten aufgerufen werden dürfen wird nur an der Stelle überprüft, an dem Links erstellt werden. Wenn dieser Link bekannt ist, kann man auch ohne das Recht die Seite sehen, z.B. früher beim Rolleneditor

Insecure Direct Object References Failure to Restrict URL Access Objektrechteprüfung sollten bewusst bedacht werden - ist z.B. in der Standard-API bei Massenanfragen wie getChildren und search schon der Fall – aber nicht bei Einzelabfragen CSPdm::getProduct(). Seiten, die sensible Daten beinhalten oder ändern können, sollten direkt zu Beginn überprüfen, ob ein Benutzer das Recht hat, auf diese zuzugreifen. CSSecurity.xml mit verwenden

Unvalidated Redirects and Forwards Seiten könnten geschützt sein, z.B. durch CSSecurity.xml, ZBV,... Wenn man diese jedoch direkt inkludiert, (bzw. über redirects aufruft) kann diese Sicherung umgangen werden Include(„.../popups/“.$_GET[„file“]);

Unvalidated Redirects and Forwards - Absicherung s. Injection: keine oder nur abgesicherte dynamische Includes oder redirects verwenden

Absicherung mit der CSSecurity.xml CSSecurity.xml – Dateien können an allen Stellen eingebunden werden, die: direkt über &forward= inkludiert werden ein Template einer Story im CMS sind Entweder platziert man eine Absicherung direkt neben der Datei oder in einem Überordner

Beispiel einer CSSecurity.xml gui/dialogs/RenameFile.php...

Aufbau der CSSecurity.xml Security ist das Root-Element und kann beliebig verschachtelt werden, wenn z.B. Variablen oder Rechte in einem Ordner definiert sind, gelten sie für alle Unterordner. Includes enthält die Pfade aller erlaubten Dateien (relativ zu der CSSecurity.xml – Datei) Variables definiert alle erlaubten Variablen Rights definiert welche Rechte ein Benutzer haben muss, damit er die definierten Pfade verwenden darf.

Includes und Path Elemente Path enthält die Pfade zu den Dateien, die mit forward oder in einem CMS-Template eingebunden werden dürfen. Pfade sind relativ zu der CSSecurity.xml Der Platzhalter * darf verwendet werden, sollte aber vermieden werden, da damit wieder unerlaubte Zugriffe ermöglicht werden könnten.

Variables - Elemente Variables definiert, welche Variablen durchgelassen werden. Alle Variablen, die dort nicht erlaubt sind, werden aus allen REQUEST- Variablen entfernt. Das Attribut name definiert den Namen von erlaubten Attributen: Mehrere können durch | getrennt werden Platzhalter * ist erlaubt (aber auch hier mit Vorsicht genießen) Reguläre Ausdrücke möglich (Beginnt mit „/“): name="/^Text[0-9]+$/" Mit type kann man die Variable auf get oder post beschränken Mit pattern kann man einen regulären Ausdruck angeben, auf den die Variable zutreffen muss

Unterelemente von Variables konvertiert den Wert in eine Zahl oder entfernt die Variable erlaubt nur unkritischen Text, d.h. keine Größer- /Keinerzeichen oder Anführungszeichen überprüft, ob ein Boolean ist („true“, „1“, „on“, „0“,...) und gibt diesen Wert zurück – ansonsten wird die Variable entfernt entfernt die Variable immer jagt den übergebenen Text immer, durch CS::htmlentitites, so dass hiermit z.B. Titel an Dialoge übergeben werden könnten, die direkt ausgegeben werden. erlaubt jegliche Eingabe. Ist somit ein möglicher Angriffspunkt. Lässt sich aber leider nicht überall umgehen (Inputs, die HTML enthalten können)

Unterelemente von Variables- Teil 2 Dateinamen können über geschützt werden Mit werden relative Pfade erlaubt, die nur in Unterverzeichnisse oder../{PROJEKT} oder../admin zeigen dürfen. (Keine führenden Slashes, Doppelpunkte, “../“, etc. Eine bestimmte Anzahl von Werten kann in Listen definiert werden: bar bar2

Unterelemente von Variables- beste Sicherheit erlaubt nur Variablen die geschützt sind mittels: ‘&'.CSSecurityUtils::getSecuredURLParameter('uwaUrl', $uwaURL)  &uwaUrl=portal%2FCSStudioWidget.php&d18=a3 erlaubt die Variable nur, wenn alle aus in einer komplett geschützten URL unverändert vorhanden sind: CSSecurityUtils::getSecuredURL('forward.php?foo1=bar&foo2=bar‘) Weitere nicht geschützte dürften hinten hinzugefügt werden. Formulare können bei Erstellung mit einer CSGuiForm geschützt werden.

Vordefinierte Variablen Mit können schon einmal definierte Variablen wiederverwendet werden. XXX zeigt auf einen globale ID: XXX zeigt auf eine mit definierte Definition innerhalb derselben Datei XXX zeigt auf eine mit definierte Definition innerhalb einer anderen Datei refid=“modules/pdm/CSSecurity.xml#foo“

Beispiel: admin/dialogs/CSSecurity.xml RecordInputDialog.php......

Absicherung von JSON-Strings Auch JSON-Objekte können abgesichert werden: JSON beginnt dabei die Variable und wird beim Fehler komplett entfernt. Object definiert ein Objekt Arrays brauchen in ihren Elementen kein name Attribute {ID:0, Dateien:[{ID:2, Pfad=„volumes/datei.txt“, Dateien:[{...}] }] }

Rechtevergabe Mit kann man Rechte definieren, die erfüllt sein müssen, damit ein Benutzer den Include sehen darf (Failure to Restrict URL Access) Darin kann man zwei Arten von Rechten definieren: if (!($record = CS::getRecord(getStringVariable('Class'))) return „no record!“;

Unterelemente von Variables- mit Rechten Auch einzelne Variablen können mit Rechten abgesichert werden

Prinzipielle Sicherheitsüberlegungen Wenn man Absicherungen erstellt, sollte man versuchen Whitelisten zu verwenden und keine Blacklisten, da man leicht irgendwas übersieht: Beispiel: /ˆ[a-zA-Z0-9_]*$/ und nicht /ˆ[ˆ<>]*$/‘ Wenn möglich sollte man Daten über POST übertragen, da diese ein wenig sicherer sind. Upload von Dateien nur in Ordner (oder Volumes), die gegen direkten Zugriff geschützt sind (z.B. mit.htaccess), so dass man dort keine Skripte ausführen darf.

Prinzipielle Sicherheitsüberlegungen – Teil 2 Alle Einstiegspunkte (außerhalb den definierten) sind über.htaccess unterbunden worden (im admin und im Projekt), d.h. alle PHP-Dateien außer index.php im Projekt sind verboten und werden immer über die index.php angesprochen werden. Anfragen auf folgende Dateiendungen werden durchgelassen: css|js|gif|jpg|png|swf|htm|txt Folgende PHP-Dateien sind Sicherheitsgeprüft und dürfen direkt aufgerufen werden (der Rest nur über abgesicherte Includes): blank.editor.php | loading.php | FileServer.php | forward.php | ImageServer.php | index.php | login.php | install.php | internalforward.php | loading.php | ping.php | portal.php core/extensions/skin/CSSkinImage.php | classes/utils/CSAjaxAction.php

Wie (de-)aktiviert man die Sicherheit In admin.local/conf eine Datei Security.ini anlegen: debug_security_warnings = on (Produktiv: off) use_security_xml = on check_security_path = ignore(Produktiv: on) check_security_variables = exception (oder Produktiv: remove) check_security_rights = full In CS11.1 ist ein Editor dafür geplant. Hilfsskript: admin/forward.php?forward=core/extensions/security/CSSecurityCreator. php analysiert die Debugdatei (data/logs/debug/requests.csv) und gibt alle darin enthaltenen Includes und Variablen als XML aus.

Beispiel der CSSecurityCreator.php Ausgabe

Zusammenfassung Optimal wäre es alle URLs mit CSSecurity::getSecurityURL() zu schützen und mit überprüfen. Ist aber teilweise aufwendiger und geht nicht für dynamische Variablen Formulare mit der CSGuiForm aufbauen Ansonsten für alle Templates, forward-URLs und Projektmodule alle erlaubten Variablen mit CSSecurity.xml versehen Alles andere über.htaccess schützen Zentrale Methoden verwenden: CSSecurityUtil::evalCommand CSystemUtils::executeCommand CSFileUtils::readFile, CSFileUtils:...