Security-Webinar September 2015 Dr. Christopher Kunz, filoo GmbH Ihr Webinar-Team _ Referent: Dr. Christopher Kunz _ CEO Hosting filoo GmbH / TK AG _ Promotion IT Security _ Vorträge auf Konferenzen _ Autor von Artikeln & Büchern _ Moderation: Sibylle Blöchl _ Marketing Thomas-­‐Krenn.AG _ Sammelt Fragen / Feedback Security-Webinar September 2015 filoo GmbH _ Wir sind die Hosting-Tochter der ThomasKrenn.AG _ Sicheres, hochperformantes Hosting in Frankfurt _ Mitarbeiter in Gütersloh und Freyung _ Primärer Rechenzentrumsstandort Frankfurt _ Tier3, ISO 27001 _ Fläche in zwei Brandabschnitten _ Managed Services _ Planung & Deployment _ Security Services _ Systemadministration Security-Webinar September 2015 Agenda _ Security im letzten Monat _ BGP Hijacking und SSL-­‐Zertifikate _ Sichere E-­‐Mail: Neues vom BSI und anderen _ Einbruch im Firefox-­‐Bugtracker _ SQL Injection _ Was ist SQLi? _ Betroffene Systeme & Auswirkungen _ Schutz gegen SQL Injection Security-Webinar September 2015 BGP Security _ Das Internet ist ein Netz von Netzwerken _ Diese verwenden zum Routen BGP _ „Announcement“, welche Netze über Provider X erreicht werden _ An Provider dieses Providers („Upstream“) _ An andere Provider („Peers“) _ An Kunden („Downstream“) _ BGP ist nicht sehr gut gesichert _ Announcements können gefälscht werden _ Das heißt Prefix-­‐Hijacking Security-Webinar September 2015 BGP und SSL _ Man kann mit BGP Prefix-­‐Hijacks SSL-­‐Zertifikate erschleichen 1. Man wähle ein Opfer, eine Ziel-­‐Region (Land, Provider, o.ä.), eine CA in der Zielregion 1. Z.B. Türkei und „Turktrust“ 2. Man hijacke das Netzprefix des Opfers in der Ziel-­‐Region 3. Man beantrage ein Zertifikat für www.zieldomain.de 1. Verifikation z.B. per Mail an zieldomain.de -­‐> umgeleitet! 4. Verifikation abfangen und Zertifikat erhalten 5. Prefix-­‐Hijack zurückziehen 6. Gültiges Zertifikat bleibt! Security-Webinar September 2015 Neues zu sicherer E-Mail _ Kennen Sie das hier noch? Security-Webinar September 2015 Aus EMIG wird DANE _ E-­‐Mail Made in Germany wurde stark beworben _ Konsortium aus 1&1 (GMX, web.de), Telekom (T-­‐Online, Strato) _ „Walled Garden“ mit Insellösung für die Konsortialteilnehmer _ Dritte (=wir) blieben außen vor _ Das BSI gibt nun Richtlinien für sichere Mail heraus _ Verschlüsselung, Authentifizierung, DNSSEC, DANE _ BSI TR-­‐03108 _ Und siehe da, GMX und Web.de öffnen sich Security-Webinar September 2015 Einbruch in Firefox Bugtracker _ Angreifer hat sich Zugriff auf Bugtracker von Firefox verschafft _ Dort sind alle gemeldeten Fehler verzeichnet _ Auch sicherheitsrelevante _ Dadurch: Sicherheitskritischer Fehler bekannt geworden _ Angreifer haben maßgeschneiderten Exploit geschrieben _ Fazit: Auch „Randsysteme“ können sehr gefährlich sein Security-Webinar September 2015 SQL Injection _ Top-­‐1 Securityproblem laut OWASP _ https://www.owasp.org/index.php/Top_10_2013-­‐Top_10 _ Grundprinzip: Manipulation von Eingabedaten _ Hier: Eingabedaten, die an Datenbanksystem übergeben werden _ Angriff gegen Anwendung und Datenbankserver _ Angriff findet „auf dem Server“ statt _ MySQL, Oracle, MSSQL, postgreSQL etc. betroffen Security-Webinar September 2015 SQL Injection _ Vom Angreifer kontrollierter String wird Teil eines SQL Statements _ Der Nutzer kann das Statement (und damit die Ergebnisse) kontrollieren _ Auswirkungen _ Datendiebstahl _ Ausführung von Exploit-­‐Code _ Denial of Service Security-Webinar September 2015 SQL Injection Beispiel _ Prüfung eines Login-­‐Formulars _ SELECT FROM WHERE AND Username, UserID Users Username = '" . $_POST['user'] . "' Password = '" . $_POST['pass'] . "'"; _ User / Passwort kommen aus Web-­‐Formular _ Werden also vom Angreifer kontrolliert Security-Webinar September 2015 SQL Injection Beispiel _ So soll es eigentlich aussehen: _ Username = chris, Paßwort = test123456 _ SELECT FROM WHERE AND Username, UserID Users Username = 'chris' Password = 'test123456'; _ Es wird geprüft, ob Username und Paßwort passen _ Wenn nicht, keine Rückgabe -­‐> login fehlgeschlagen _ Rückgabewert: User-­‐ID des Nutzers „chris“ _ Login nur als dieser Nutzer möglich Security-Webinar September 2015 SQL Injection Beispiel _ Setze Username wie folgt: _ Username = „admin' or '1'='1“, Paßwort = „“ _ Resultierendes SQL Statement: SELECT FROM WHERE AND Username, UserID Users Username = 'admin' or '1'='1' Password = ''; _ „or 1=1“ ist immer wahr _ Resultat: User-­‐ID des Admins wird zurückgeliefert _ Paßwortabfrage wird umgangen _ Angreifer ist als „admin“ eingeloggt Security-Webinar September 2015 Etwas komplexer... _ Query zum Auslesen von Content im CMS _ Übergabeparameter: Content-­‐ID (numerisch) _ SELECT FROM WHERE id, beschr, category inhalt id = " . $_GET['id']; _ ID kommt aus der URL _ Wird vom Angreifer kontrolliert Security-Webinar September 2015 Etwas komplexer... _ Legitimer Fall: Setze Content-­‐ID auf numerischen Wert _ id = 12 _ SELECT FROM WHERE id, beschr, category inhalt id = 12 _ Rückgabe: Eine Zeile mit Content-­‐ID, Beschreibung, Kategoriename und Inhalt Security-Webinar September 2015 Etwas komplexer... _ Setze nun id wie folgt: _ id= "999 UNION SELECT username,password,1 FROM users WHERE username='admin'" _ Resultierende Abfrage: _ SELECT id, beschr, category FROM inhalt WHERE id = 999 UNION SELECT username,password,1 FROM users WHERE username='admin' _ Rückgabe: Zeile mit Zugangsdaten! Security-Webinar September 2015 Schutz vor SQL Injection _ Inhalte ordentlich maskieren! _ Viele Sprachen stellen Funktionen zur Verfügung _ Beabsichtigte Werte-­‐Scopes prüfen _ Eine Zahl ist eine Zahl und sollte nie ein String sein _ Casting in Ziel-­‐Typ _ Prepared Statements nutzen, wo verfügbar Security-Webinar September 2015 Escaping und Casting _ PHP-­‐Funktion mysqli_real_escape_string() _ Versieht folgende Zeichen mit einem \: \n \r \, ' " \0x0a, \0x00 _ PHP-­‐Typecasting: _ $content_id = (int) $_GET['content_id']; Security-Webinar September 2015 Escaping und Login-SQL _ Setze Username wie folgt: _ Username = „ admin' or '1'='1“, Paßwort = „“ _ Zusätzlich: mysqli_real_escape_string() _ Resultierendes SQL Statement: SELECT FROM WHERE AND UserID Users Username = ' admin\' or \'1\'=\'1 ' Password = ''; _ Resultat: Keines! _ Benutzername admin\' or \'1\'=\'1 existiert nicht! Security-Webinar September 2015 Casting und Content-SQL _ Setze nun id in der URL wie vorher: _ id= "999 UNION SELECT username,password,1 FROM auth WHERE username='admin‘“ _ Nun aber: $id = (int) $_GET['id']; _ Resultierende Abfrage: _ SELECT id, beschr, category FROM inhalt WHERE id = 999 _ Rückgabe: Maximal eine Zeile (Inhalt-­‐ID 999)! Security-Webinar September 2015 Vorschau _ Nächster Termin: 21.10.2015 _ Ich freue mich auf Ihre Themenvorschläge! Security-Webinar September 2015 Vielen Dank _ Ich freue mich auf Ihre Themenvorschläge und Fragen! _ Kontaktdaten: _ E-­‐Mail: [email protected] _ Telefon: 05241/86730-­‐0 _ Besuchen Sie filoo! _ https://www.filoo.de/ _ http://twitter.com/filoogmbh Security-Webinar September