Press "Enter" to skip to content

Prinzip von Code Injection. Beispiele für SQL und HTML.

Als Injection wird das Einfügen fremden Codes zu einem bereits bestehenden Programmcode bezeichnet. Injection ist also eine Manipulation bestehender Programmierung. Mittels Code Injection wird dabei neuer Programmcode injectiert, also eingefügt und sogar bestehender Programmcode so manipuliert, dass dieser nicht mehr das macht, was er eigentlich sollte.

Damit eine Injection funktioniert, muss eine Schwachstelle existieren. Diese Schwachstelle besteht darin, dass zum Beispiel unerwünschte Eingaben, also manipulierte Daten, wie schädigender Code nicht ausreichend gefiltert werden und ohne Prüfung abgespeichert oder ausgeführt wird.

Verwundbare Beispielanwendung mit PHP:

https://github.com/JavanXD/html-injection-sample

HTML-Injection / Cross-Site Scripting

HTML wird verwendet um den Inhalt von Webseiten grafisch darzustellen. JavaScript ist die Programmiersprache, die verwendet wird, um Inhalte und Objekte während der Laufzeit, also dynamisch zu erstellen, verändern oder entfernen.

Die Anfälligkeit zur Code Injection hängt vom verwendeten Browser, den ausgeführten Plugins und Addons, sowie der Webseite selbst ab.

Eine JavaScript Injection findet vom User selbst, zum Beispiel in der Eingabe von Formulardaten, die Parameter der POST/GET Methoden statt oder in der Adressleiste des Browsers, die das Ausführen von JavaScript ermöglicht und auch von der Webseite selbst, wenn sie den fremden Code ausführt. Man unterscheidet hier also zwischen lokalen, reflektiertem und persistenten Cross-Site Scripting.

Auch Add-ons sind eine nicht zu unterschätzende Schadcode Quelle, da sie es ermöglichen die Inhalte von jeder aufgerufenen Webseite zu manipulieren.

Beispiele zur Anwendung von Cross-Site-Scripting mittels JavaScript:

Verwundbares Beispielskript: Download HTML-Injection.php

Die PHP-Datei kann auf einem Webserver beispielsweise mit Hilfe von Xampp oder Wamp ausgeführt werden. Anhand von 4 Filtern wird unzureichende Validierungen aufgezeigt.

  • Beispiel 1: Eingabe von Text in das Input-Feld
    Beispielvektor: „Hey, ich bin 100 Jahre alt.”
    Die clientseitige Validierung hat Regeln, die diese Eingabe verhindern.
  • Beispiel 2: Eingabe des Textes über den GET Parameter in der URL-Adressleiste.
    Sogenanntes Request-Tampering: Die clientseitige Formularvalidierung wird umgangen.
  • Beispiel 3: Die Eingabe von HTML Tags wie „<script>alert(1);</script>”.
  • Beispiel 4: Die Eingabe von JavaScript Code wie „” /><marquee> Injection Angriff </marquee> <script>confirm(2);</script>“.

  • Beispiel 5: Das Weiterschicken eines Links, der bei Ausführung im Hintergrund unerkannt Code ausführt mit „?parameter=” /><body onload=”javascript:alert(1);”“. Ein solcher Angriffsvektor kann auch für weitere Angriffe, wie Cross-Site-Request-Forgery (CSRF) oder Open-Redirect ausgenutzt werden.

Erklärung zu den Beispielen:

  • Beispiel 1
    • Demonstriert, dass Eingaben im Browser, also clientseitig überprüft werden.
  • Beispiel 2
    • Zeigt auf, dass das Überprüfen der Eingaben im Browser allein nicht ausreicht.
  • Beispiel 3/4/5
    • Erfolgreicher XSS-Angriff. JavaScript Codes können bei nicht ausreichender Filterung ausgeführt werden.

Jüngster Fall einer HTML-Injection

April 2015 wurde bei der chinesischen Suchmaschine badu, die vergleichbar große Nutzerzahlen wie Google aufweist, eine Javascript Funktion injectiert, die einen Seitenaufruf auf einer anderen Webseite ausführt, dadurch konnte von Hackern gezielt ein Ddos Angriff ausgeführt werden um andere Server zum Überlauf zu zwingen.

SQL-Injection

SQL (=Structured Query Language) ist eine Datenbanksprache und dient zur Verwaltung von Datenbanken. Mittels SQL Querys lassen sich Einträge in eine Datenbank eintragen, lesen und löschen. SQL Querys können je nach Version auch Funktionen ausführen.

Anwendung eines gewöhnlichen SQL-Querys

Suchen wir auf einem Onlineshop nach dem Produkt Rasenmäher, geben wir auf der Webpräsenz des Shops im Such Formular “Rasenmäher” ein.

Mittels PHP kann ein solcher Fall so umgesetzt werden:

$parameter = $_REQUEST[‘produktname’];

$query1 = “SELECT * FROM produkte WHERE name LIKE ‘$parameter’ ORDER BY name”;

Anwendung einer SQL-Injection

Wird wie in diesem Fall die Variable im Query nicht ausreichend geprüft kann dort auch über eine Variable übermittelter, also möglicherweise fremder SQL-Code ausgeführt werden.

Entspräche die Variable $parameter dem Inhalt “Rasenmäher’ OR ‘Handschuhe” würde der Query ohne Fehlermeldung ausgeführt, aber die Ausgabe würde auch die Handschuhe enthalten.

Wichtig ist, dass die Syntax des SQL Querys stimmt, damit kein Fehler ausgegeben wird. Würde der Shop Betreiber nämlich “ als Anführungszeichen verwenden und nicht wie im Beispiel ‘ so muss das Gegenstück zum Schließen des Textbereichs identisch sein.

Gängige Methode zur Verhinderung von SQL-Injection

Die Programmiersprache PHP bietet dazu die Methode mysql_real_escape_string() um Daten bevor sie als Query ausgeführt werden zu maskieren. Denn wenn vor einem Anführungszeichen ( “ oder ‘ ) ein Backslash ( ) steht, so ist dieses Anführungszeichen nicht Teil des auszuführenden Programmcodes.

$parameter = mysql_real_escape_string($_REQUEST[‘produktname’]);

$query2 = “SELECT * FROM produkte WHERE name LIKE ‘$parameter’ ORDER BY name”;

Diese Maskierung reicht leider nicht aus um SQL Funktionen wie sleep() durch den Variableninhalt “%’ AnD sLeep(3) ANd ‘1%” auszuschließen. Eine Abfrage mit diesem Inhalt stoppt die Datenbank für drei Sekunden und verhindert daher weitere Abfragen, wenn die maximalen gleichzeitigen Verbindungen aufgebraucht sind. Somit also eine bestehende Schwachstelle in der IT-Sicherheit zum aufhängen von Servern.

Trotz Vorsicht und Wissen werden ständig große Firmen Opfer dieser Schwachstelle. Deshalb ist man dabei die alte mysql Version in zukünftigen PHP Versionen (5.6.6) abzuschaffen.

Durch einen Umstieg auf die neuere Erweiterung mysqli zur Datenbankverwaltung entfällt das zusätzliche Überprüfen der Variablen.

Leave a Reply

Your email address will not be published. Required fields are marked *