EN

Beispiele für Code Injection und wie man sie verhindert

In diesem Artikel:

Das Online Web Application Security Project (OWASP) hilft Organisationen bei der Verbesserung ihrer Sicherheitslage, indem es Richtlinien anbietet, die auf realen Szenarien und auf Open-Source-Projekten basieren. Unter den verschiedenen Bedrohungen betrachtet OWASP Code Injection als einen allgemein bekannte Bedrohung, bei der Angreifer Fehler bei der Eingabevalidierung ausnutzen, um Schadsoftware in eine Anwendung einzuschleusen.

In diesem Artikel wird untersucht, wie ein Code-Injection-Angriff durchgeführt wird, welche Arten von Angriffen es gibt und wie Software-Teams ihre Webanwendungen vor Injection-Fehlern schützen können.



Was ist eine Code Injection?

Hacker nutzen Code-Injection-Schwachstellen, um Schadsoftware in einen Quellcode einzubetten, der von der Anwendung interpretiert und ausgeführt wird. Bei der böswilligen Injektion nutzen die Angreifer aus, dass diese Systeme einen Teil eines Codesegments unter Verwendung externer Daten konstruieren, wobei eine ausreichende Eingabevalidierung fehlt. Der bösartige Code ist in der Regel so aufgebaut, dass er den Datenfluss kontrolliert, was zu einem Verlust der Vertraulichkeit und einer eingeschränkten Verfügbarkeit der Anwendung führt.

Angreifer erkennen Fehler bei der Validierung von Benutzereingaben, wie z. B. Dateiformat, zulässige Zeichen und die Menge der erwarteten Daten, und nutzen diese als Grundlage für die Entwicklung von Schadsoftware. OWASP stuft Injection-Schwachstellen als Nummer eins ein, wobei ihre Erkennbarkeit von leicht bis komplex reicht. Auch wenn dies alarmierend klingt, sind Injection-Schwachstellen mit den richtigen Methoden und rechtzeitiger Erkennung mäßig schwer auszunutzen. 

Code Injection vs. Code Injection-Technik

Obwohl sie oft verwechselt werden, unterscheidet sich eine Code Injection von einer Command Injection-Schwachstelle. Code Injection ist eine Sammlung von Techniken, die es einem böswilligen Benutzer ermöglichen, seinen beliebigen Code in die Anwendung einzuschleusen und auszuführen. Code Injection ist auf Zielsysteme und -anwendungen beschränkt, da die Wirksamkeit des Codes auf eine bestimmte Programmiersprache beschränkt ist. 

Bei Command Injection hingegen werden Schwachstellen in der Anwendung ausgenutzt, um die Funktionalität der Anwendung zu erweitern, damit sie beliebige Befehle ausführen kann. Bei der Befehlsinjektion geben Angreifer unsichere Eingaben in die System-Shell ein, um Betriebssystembefehle in der anfälligen Anwendung auszuführen.

Wie Code Injection funktioniert

Bei Code Injection, auch bekannt als Remote Code Execution oder Code Evaluation, wird eine ausführbare Datei oder ein Skript mit bösartigem Code verändert. Hacker untersuchen die Anwendung zunächst auf Angriffsflächen, die nicht vertrauenswürdige Daten annehmen und zur Ausführung von Programmcode verwenden können. Dazu gehören direkte Eingaben wie Datei-Uploads, Formularfelder oder andere Datenquellen wie Cookies und Query-String-Parameter. Die Einführung von Code besteht typischerweise aus einer direkten Verkettung von Zeichenketten, der PHP-Funktion eval() oder deren Äquivalent in einer anderen Sprache. Ein erfolgreicher Exploit gewährt Angreifern Zugriff auf den serverseitigen Interpreter der Anwendung. Die Angreifer können Systemaufrufe verwenden, um Befehle auf dem Server auszuführen und für eine tiefere Ausnutzung weiter einzudringen.

Code Injection – Art der Angriffe

Die Arten von Code-Injection-Angriffen unterscheiden sich je nach der Programmiersprache, die zur Entwicklung des Quellcodes der Anwendung verwendet wurde, und dem bösartigen Code des Angreifers. In diesem Abschnitt werden einige gängige Kategorien von Code-Injection-Schwachstellen/-Angriffen untersucht.

Client-seitige Code Injection

Bei der clientseitigen Injektion nutzen Hacker Schwachstellen in Anwendungen aus, bei denen die Eingabevalidierung im Browser durchgeführt wird, bevor die Daten an den Server gesendet werden. Solche Angriffe umfassen:

SQL-Code Injection (SQLi)

SQL wird in modernen Anwendungen häufig zum Aufbau von Datenstrukturen und zur Abfrage von Datensätzen verwendet. Angreifer zielen auf verwundbare Konfigurationsdetails in relationalen Datenbankmanagementsystemen, um den Datenbankserver einer Webanwendung mit bösartigen SQL-Anweisungen zu kontrollieren. Diese Anweisungen ändern SQL-Abfragen und gewähren Hackern Zugriff auf wichtige Daten wie Anmeldedaten und Konfigurationsinformationen der Anwendung. 

Python-Code Injection

Mit Python erstellte Anwendungen, Skripte, die Ausdrücke von Benutzern akzeptieren und deren Eingaben auswerten, können zum Einschleusen von bösartigem Code verwendet werden. Nehmen wir zum Beispiel ein einfaches Taschenrechnerskript, das Ausdrücke bei der Eingabe des Benutzers akzeptiert und auswertet:

compute = input('\nYour expression? => ')
if not compute:
print ("No input")
else:
print ("Result =", eval(compute))

Ein regulärer mathematischer Ausdruck wie 5*6 liefert das erwartete Ergebnis, nämlich 30. Angenommen, der Zielprozess hat Zugriffsrechte auf bösartige Eingaben wie _import__(‚os‘).system(‚rm -rf /‘) im Eingabeformular. In diesem Fall werden alle Dateien und Verzeichnisse, die sich im Ordner des Skripts befinden, gelöscht. 

HTML-Code-Einschleusung/Cross-Site-Scripting

Angreifer nutzen häufig HTML-Code-Injection-Schwachstellen, um die Interaktion von Benutzern mit einer Webanwendung zu beeinträchtigen. Dabei fügt der Hacker bösartigen HTML-Code in eine vertrauenswürdige Website ein, die dann nicht vertrauenswürdige Skripte im Browser des Endbenutzers ausführt. Da der Browser das bösartige Skript nicht erkennt, kann der Angreifer auf Sitzungs-Tokens, Cookies und andere wichtige Daten zugreifen, die der Browser speichert. 

Server-seitige Code Injection

Bei der serverseitigen Code Injection werden Schwachstellen in Anwendungen ausgenutzt, die Benutzereingaben auf der Serverseite validieren. Dazu gehören:

PHP-Code Injection

Einige in PHP erstellte Webanwendungen können eine unsichere Funktion enthalten, die es Angreifern ermöglicht, einen Teil oder die gesamte Software zu kontrollieren. Diese Schwachstellen ermöglichen es Hackern, den Verlauf der Code-Ausführung zu ändern, indem sie Teile einer Eingabezeichenfolge modifizieren. Der folgende Code verarbeitet Benutzereingaben mit der Funktion php eval():

//The URL to access this https://codeinjection.crashtest-security.com/index.php?arg=1
        $x = $_GET['arg'];
        eval($x);

Die Angreifer können dann alle auf dem Server laufenden Dienste aufzählen, indem sie die URL abfragen:

https://codeinjection.crashtest-security.com/index.php?arg=1; system('id')

Serverseitige Javascript-Injektion

Es ist relativ einfach, eigenen Javascript-Code auf einer Website einzufügen und zu verwenden, indem man entweder eine Cross-Site-Scripting-Schwachstelle findet oder Code in die Adressleiste einfügt. Während es in der Entwicklerkonsole oft als Debugging-Mechanismus verwendet wird, können Angreifer Javascript-Injection-Schwachstellen nutzen, um Angriffe zu inszenieren, Registrierungsformulare zu kapern, Zugangsdaten zu erlangen und die Systemverfügbarkeit zu gefährden.

Beispiele für Code-Injection-Angriffe

Obwohl Code-Injection-Angriffe weit verbreitet sind und jedes Unternehmen von solchen Schwachstellen betroffen ist, werden im Folgenden einige bekannte Code-Injection-Angriffe aus der jüngsten Vergangenheit aufgeführt:

Der Ghostshell-Angriff

Ghost Shell, eine Gruppe von Cybersecurity-Aktivisten, legte über 30 Millionen Kontodaten offen, indem sie SQL-Injection und schlecht konfigurierte PHP-Skripts ausnutzte. Bei den Hacks, die auf Regierungs- und Bildungseinrichtungen abzielten, wurden zahlreiche Datenbanken von verschiedenen Servern mit fehlerhaften Authentifizierungsmechanismen heruntergeladen. Mithilfe von Port-Scanning-Tools gelang es den Hackern, Server ausfindig zu machen, auf denen wichtige Datenbanken gehostet wurden, und die Daten dann hochzuladen, um das Bewusstsein für die Fehlkonfiguration der Cybersicherheit zu schärfen.

Einbruch in die Schuldenverwaltung der türkischen Regierung

RedHack, eine türkische Hackergruppe, behauptete, in die Website der Sonderverwaltung der Provinz Istanbul (ios.gov.tr) eingedrungen zu sein, um die Schulden der Bürger bei Versorgungsunternehmen zu begleichen. Sie nutzten ein einfaches SQL-Injektionsskript, um die Anmeldeseite der Website zu umgehen und Zugang zu Administrator- und Endbenutzerkonten zu erhalten.

Injektionsangriffe auf Geräte mit Harvard-Architektur

Cybersecurity-Forscher der Cornell University haben bewiesen, dass Pufferüberlauftechniken verwendet werden können, um Code in eingebettete Geräte einzuschleusen, die auf dem CPU-Design der Harvard-Architektur basieren. Diese Geräte verfügen über einen begrenzten Speicher, so dass sie nur kleine Pakete verarbeiten können. Mithilfe verschiedener Programmschwachstellen haben die Forscher bewiesen, dass es möglich ist, permanenten Code in Sensoren einzuschleusen, um die vollständige Kontrolle über den Host-Prozess zu erlangen. 

Wie man Code-Injection-Angriffe erkennt und verhindert

Solange Angreifer die Einstellungen des serverseitigen Interpreters ausnutzen können, indem sie bösartige Daten senden, kann fast jede Dateneingabeschnittstelle als Vektor für Code-Injection-Angriffe dienen. Diese Angriffe sind weit verbreitet, da Angreifer Zugang zu Fuzzern und Scannern haben, die Code-Injection-Fehler finden. Die geschäftlichen Auswirkungen solcher Angriffe können je nach den offengelegten Daten und den von der Software implementierten Geschäftsfunktionen von leicht bis schwerwiegend reichen. Daher ist es äußerst wichtig, falsche Serverkonfigurationen zu korrigieren, nicht vertrauenswürdige Datenquellen zu vermeiden und andere Injektionsvektoren zu beseitigen. 

Best Practices zur Verhinderung von Code-Injection-Angriffen

Auch wenn die Anwendungsfälle in den einzelnen Unternehmen unterschiedlich sind, gibt es doch einige Best Practices zur Beseitigung von Code-Injection-Fehlern in modernen Webanwendungen.

  1. Whitelisting für die Eingabevalidierung verwenden – Whitelisting ist einfacher einzurichten und gibt den Sicherheitsteams eine strengere Kontrolle darüber, welche Daten oder Eingabearten die Anwendung verarbeiten kann, wodurch das Risiko, dass ein Angreifer bösartigen Code ausführt, verringert wird.
  2. Kodierung von HTML-Ausgaben – Sicherheitsteams sollten die kontextbezogene Ausgabekodierung nutzen, um bösartige Eingaben in sicherere Repräsentanten umzuwandeln, bei denen Benutzerdaten zwar angezeigt, aber nicht als Code ausgeführt werden können.
  3. Verwendung eines statischen Typsystems zur Durchsetzung der Sprachentrennung – Mit statischen Typsystemen können Teams deklarative Kontrollprüfungen ohne zusätzlichen Laufzeit-Overhead entwickeln. 
  4. Einsatz von parametrisierten Abfragen und kriterienbasierten APIs zur Interpretation von Benutzerdaten-Strings – Damit wird sichergestellt, dass APIs keine anderen als die angegebenen String-Werte akzeptieren. Außerdem betrachten parametrisierte Abfragen die Eingaben bösartiger Befehle als String und nicht als SQL-Befehl.  
  5. Vermeiden Sie die Verwendung unsicherer Funktionen im Quellcode – Es ist wichtig, bei der Entwicklung von Quellcode alle anfälligen Code-Evaluierungskonstrukte zu vermeiden. Entwickler sollten stattdessen sichere, dedizierte, sprachspezifische Funktionen verwenden, um vom Benutzer bereitgestellte Eingaben zu verarbeiten.
  6. Verwenden Sie das HttpOnly-Flag für Cookies, um die clientseitige Skriptinteraktion zu deaktivieren – Wenn der Server das HttpOnly-Flag für jedes von ihm erstellte Cookie setzt, gibt er an, dass das Cookie nicht von der Clientseite aus zugänglich sein soll. Die Cookies können daher nicht an Dritte weitergegeben werden, selbst wenn HTML-Injection-Fehler vorliegen.
  7. Verwendung von SCA-Tools zum Auffinden und Beheben von Problemen – Teams sollten automatische Tools zur statischen Codeprüfung einrichten, um Injektionsvektoren im Quellcode zu finden und zu beseitigen.
  8. Vermeiden Sie Javascript-Code-Serialisierung – Entwickler verwenden Code-Serialisierung, um Eingabedaten in eine Reihe von regulären Funktionen und Ausdrücken umzuwandeln. Einige Versionen von Javascript-Serialisierungspaketen können nicht ordnungsgemäß gegen nicht vertrauenswürdige Zeichen in regulären Ausdrücken reinigen. Als beste Praxis wird empfohlen, die Serialisierung zu vermeiden, wenn sie nicht unbedingt notwendig ist.

Zusammenfassung

Injektionsangriffe stehen an dritter Stelle der OWASP Top 10 Schwachstellen und an sechster Stelle der Common Weakness Enumeration Liste.  Es überrascht nicht, dass solche Schwachstellen weit verbreitet sind, vor allem in älteren Anwendungen, die nicht mit bewährten Sicherheitsverfahren entwickelt wurden.

Code-Injection-Fehler sind eine der häufigsten Schwachstellen bei Malware-Angriffen, da sie dazu verwendet werden können, auf geschützte Daten zuzugreifen, sich unbefugten Zugriff zu verschaffen oder die Berechtigungen zu erweitern. Aufgrund der Auswirkungen und des Schweregrads der Angriffe müssen Sicherheitsteams eine angemessene Validierung der Benutzereingaben sicherstellen, um die Einschleusung von Schadcode zu verhindern.

Erhalten Sie jetzt kostenlos einen schnellen Sicherheitsbericht für Ihre Website

Wir analysieren derzeit http://example.com
Wir scannen derzeit http://example.com
Status des Scans: In Bearbeitung
Scan target: http://example.com/laskdlaksd/12lklkasldkasada.a
Datum: 27/05/2022
Crashtest Security Suite prüft auf:
Information disclosure Known vulnerabilities SSL misconfiguration Open ports
Scanauftrag ausfüllen
Bitte geben Sie Ihre Daten ein, um die schnelle Sicherheitsüberprüfung zu erhalten.
Ein Sicherheitsspezialist analysiert gerade Ihren Scan-Bericht.
Bitte geben Sie Ihre Telefon-/Handynummer an, damit wir Ihre Identität überprüfen können:
Ihren Bericht anfordern
Vielen Dank.
Wir haben Ihren Antrag erhalten.
Sobald Ihr Sicherheitsaudit fertig ist, werden wir Sie benachrichtigen.