Coders Conquer Security: Share & Learn Series - Code Injection

Veröffentlicht am 16. Mai 2019
von Jaap Karan Singh
FALLSTUDIE

Coders Conquer Security: Share & Learn Series - Code Injection

Veröffentlicht am 16. Mai 2019
von Jaap Karan Singh
Ressource anzeigen
Ressource anzeigen

Code-Injection-Angriffe gehören zu den häufigsten und auch gefährlichsten Angriffen, denen viele Websites und Anwendungen ausgesetzt sind. Sie variieren sowohl in Bezug auf die Raffinesse als auch auf die Gefahr, die von ihnen ausgeht, aber fast jede Website oder Anwendung, die Benutzereingaben akzeptiert, kann anfällig sein. In der Tat ist diese Art von Angriff eine, mit der sich fast jeder Cybersecurity-Verteidiger irgendwann in seiner Karriere auseinandersetzen muss, und das wahrscheinlich mehrmals.

Ein Code-Injection-Angriff kann immer dann erfolgen, wenn eine Anwendung oder Website Eingaben von Benutzern akzeptiert. Dies kann so einfach sein wie die Bereitstellung einer Suchfunktion oder die Aufforderung an einen Benutzer, seine Identifikationsdaten einzugeben. Der Angriff erfolgt, wenn ein böswilliger Benutzer anstelle einer normalen Texteingabe Code in das offene Feld eingibt. Ihr Ziel ist es, den Server dazu zu bringen, die Eingabe für gültigen Code zu halten und dann beliebige Funktionen auszuführen, die der Angreifer wünscht.

Während Code-Injection-Attacken extrem häufig vorkommen, sind auch die verfügbaren Verteidigungsmaßnahmen, mit denen sie gestoppt werden können, entsprechend. In dieser Folge lernen wir:

  • Wie sie funktionieren
  • Warum sie so gefährlich sind
  • Wie Sie Abwehrmaßnahmen ergreifen können, um sie zu stoppen.

Wie verwenden Angreifer Code Injection?

Obwohl sich die spezifischen Details über Code-Injection-Angriffe je nach verwendeter Programmiersprache ändern, kann jede App oder Website anfällig sein, solange sie einem Benutzer die Eingabe von Daten ermöglicht. Code-Injection-Angriffe wurden bereits für SQL, HTML, XML, CSS und jede andere gängige Programmiersprache ausgelöst.

Zunächst muss ein Angreifer verwundbaren Code innerhalb einer Anwendung finden, normalerweise an einer Stelle, an der Benutzer ihre eigenen Eingaben machen können. Dieser Code nimmt zum Beispiel die PHP-Funktion eval() und gibt sie an einen Benutzer weiter, um sie zu ändern, ohne irgendeine Art von Validierung der Rückgabezeichenfolge.

$myvar = "varname";
$x = $_GET[arg];
eval("\$myvar = \$x;");

Ein geschickter Angreifer könnte leicht eine eigene Zeichenkette an die eval-Funktion anhängen und sogar Systembefehle ausführen, wenn er möchte.

/index.php?arg=1; system(id)

Es ist wichtig zu beachten, dass Code-Injection-Angriffe zwar das Senden von Systembefehlen beinhalten können, aber nicht nur darauf beschränkt sind. Tatsächlich sind Hacker bei Code-Injection-Angriffen nur durch die Funktionalität der Sprache selbst begrenzt. In unserem Beispiel könnte ein Angreifer das Zielsystem so programmieren, dass es fast alles tut, was das PHP-Framework erlaubt.

Warum sind Code-Injection-Angriffe so gefährlich?

Code-Injection-Angriffe sind je nach Geschick des Angreifers potenziell extrem gefährlich. Sie können alles tun, was die Programmiersprache zulässt, was sie auf die gleiche Stufe wie die Programmierer der App stellt. Ein Angreifer könnte praktisch seine eigene App schreiben und sie innerhalb der Zielumgebung ausführen lassen.

Auch weniger erfahrene Angreifer können gefährlich sein. Anstatt ihre eigene Anwendung oder Code-Strings zu schreiben, können sie dem Zielsystem einfach befehlen, vorprogrammierte Malware zu akzeptieren und zu installieren. Dies könnte zu einer Verunstaltung der Website, zu Ransomware-Angriffen oder sogar zur Grundlage für eine Phishing-Kampagne werden, die sich gegen die Benutzer der Website richtet.

Meistens werden Code-Injection-Angriffe verwendet, um Dinge wie Benutzerlisten und Passwörter zu stehlen oder um wertvolle Informationen über ein System zu erhalten, das für weitere Kompromittierungen vorgesehen ist. Aber seien Sie gewarnt: Ein geschickter Programmierer kann mit einem Code-Injection-Angriff fast alles erreichen. Deshalb ist es so wichtig, dass jede potenzielle Instanz davon entdeckt und aus Ihrer Umgebung entfernt wird.

Vertrauen Sie niemandem! (Oder zumindest, nicht Benutzer)

Bei der Beseitigung von Schwachstellen, die durch Code-Injection-Angriffe entstehen, sollte man als erstes überall dort nachsehen, wo Benutzereingaben verlangt oder zugelassen werden. Alles, was von einem Benutzer eingegeben wird, ist unter keinen Umständen vertrauenswürdig. Wenn Sie Benutzereingaben ohne Filterung oder Prüfung zulassen, laden Sie Angreifer im Grunde dazu ein, Ihr System oder sogar Ihr Netzwerk mit einem Freischuss zu kompromittieren.

Obwohl es nicht immer möglich ist, ist der beste Weg, Code-Injection-Angriffe zu vereiteln, zu verhindern, dass Funktionen ausgeführt oder Benutzereingaben direkt interpretiert werden. Vielleicht kann man den Benutzern eine Auswahl an statischen Optionen geben, anstatt ihnen freie Hand bei der Eingabe ihrer eigenen Abfragen zu lassen, wobei die Anwendung so programmiert ist, dass sie nur diese begrenzten Auswahlmöglichkeiten als gültig akzeptiert. Das ist vielleicht nicht immer sinnvoll, aber wo es möglich ist, kann es Code-Injektionen verhindern, bevor sie beginnen.

Für Bereiche, in denen Benutzer ihre eigenen Eingaben machen müssen, müssen diese Daten streng kontrolliert werden. Die Annahme, dass alles ein potenzieller Angriff ist, ist ein guter Ansatzpunkt. Die Durchsetzung von Richtlinien mit geringsten Privilegien, wie z. B. Benutzerzugriff nur zum Lesen, sowohl auf der Client- als auch auf der Serverseite, kann die Ausführung des meisten Codes verhindern.

Die andere gute Verteidigung besteht darin, anwendungsweite Filter und Sanitization für alle Benutzereingaben zu implementieren. Entwickler sind sich der Code-Injection-Angriffe schon seit Jahren bewusst, und es gibt Bibliotheken mit bewährten Filtern für jedes Framework und jede Sprache. Wenn Sie diese Filter anwenden, stellen Sie sicher, dass Sie dies nicht nur auf die offensichtlichen Benutzereingabebereiche oder gegen allgemeine Parameter wie Get- und Post-Befehle tun, sondern auch gegen Cookies und HTTP-Header.

Anwenden einer Korrektur für Code Injection

Wenn Sie unnötige Benutzereingabebereiche aus Ihrer Umgebung entfernen, die Prinzipien der geringsten Privilegien durchsetzen und die neuesten Filter- und Bereinigungs-Tools verwenden, um potenzielle Angriffe zu untersuchen und zu erkennen, können Sie diese gefährliche Schwachstelle ausschalten. Die Einstellung, Benutzereingaben niemals zu vertrauen, wird Ihnen auch in Zukunft gute Dienste leisten. Wenn Sie all das tun, können Sie dieser gefährlichen Art von Angriffen einen Schritt voraus sein.

Als weitere Lektüre können Sie einen Blick auf den OWASP-Artikel über Code-Injektion werfen. Sie können Ihr neu erworbenes Verteidigungswissen auch mit der kostenlosen Demo der Plattform Secure Code Warrior testen, die Cybersecurity-Teams zu den ultimativen Cyber-Kriegern ausbildet. Um mehr über die Beseitigung dieser Schwachstelle und eine Schurkengalerie anderer Bedrohungen zu erfahren, besuchen Sie den BlogSecure Code Warrior .

Stellen Sie sich der Code-Injektion, genau jetzt. Nehmen Sie die Herausforderung auf unserer gamifizierten Trainingsplattform an: [Hier starten]

Ressource anzeigen
Ressource anzeigen

Autor

Jaap Karan Singh

Sie wollen mehr?

Tauchen Sie ein in unsere neuesten Erkenntnisse über sichere Kodierung im Blog.

Unsere umfangreiche Ressourcenbibliothek zielt darauf ab, die menschliche Herangehensweise an eine sichere Weiterbildung im Bereich der Programmierung zu stärken.

Blog ansehen
Sie wollen mehr?

Holen Sie sich die neuesten Forschungsergebnisse zur entwicklergesteuerten Sicherheit

Unsere umfangreiche Ressourcenbibliothek ist voll von hilfreichen Ressourcen, von Whitepapers bis hin zu Webinaren, die Ihnen den Einstieg in die entwicklungsorientierte sichere Programmierung erleichtern. Erforschen Sie sie jetzt.

Ressourcendrehscheibe

Coders Conquer Security: Share & Learn Series - Code Injection

Veröffentlicht am 16. Mai 2019
Von Jaap Karan Singh

Code-Injection-Angriffe gehören zu den häufigsten und auch gefährlichsten Angriffen, denen viele Websites und Anwendungen ausgesetzt sind. Sie variieren sowohl in Bezug auf die Raffinesse als auch auf die Gefahr, die von ihnen ausgeht, aber fast jede Website oder Anwendung, die Benutzereingaben akzeptiert, kann anfällig sein. In der Tat ist diese Art von Angriff eine, mit der sich fast jeder Cybersecurity-Verteidiger irgendwann in seiner Karriere auseinandersetzen muss, und das wahrscheinlich mehrmals.

Ein Code-Injection-Angriff kann immer dann erfolgen, wenn eine Anwendung oder Website Eingaben von Benutzern akzeptiert. Dies kann so einfach sein wie die Bereitstellung einer Suchfunktion oder die Aufforderung an einen Benutzer, seine Identifikationsdaten einzugeben. Der Angriff erfolgt, wenn ein böswilliger Benutzer anstelle einer normalen Texteingabe Code in das offene Feld eingibt. Ihr Ziel ist es, den Server dazu zu bringen, die Eingabe für gültigen Code zu halten und dann beliebige Funktionen auszuführen, die der Angreifer wünscht.

Während Code-Injection-Attacken extrem häufig vorkommen, sind auch die verfügbaren Verteidigungsmaßnahmen, mit denen sie gestoppt werden können, entsprechend. In dieser Folge lernen wir:

  • Wie sie funktionieren
  • Warum sie so gefährlich sind
  • Wie Sie Abwehrmaßnahmen ergreifen können, um sie zu stoppen.

Wie verwenden Angreifer Code Injection?

Obwohl sich die spezifischen Details über Code-Injection-Angriffe je nach verwendeter Programmiersprache ändern, kann jede App oder Website anfällig sein, solange sie einem Benutzer die Eingabe von Daten ermöglicht. Code-Injection-Angriffe wurden bereits für SQL, HTML, XML, CSS und jede andere gängige Programmiersprache ausgelöst.

Zunächst muss ein Angreifer verwundbaren Code innerhalb einer Anwendung finden, normalerweise an einer Stelle, an der Benutzer ihre eigenen Eingaben machen können. Dieser Code nimmt zum Beispiel die PHP-Funktion eval() und gibt sie an einen Benutzer weiter, um sie zu ändern, ohne irgendeine Art von Validierung der Rückgabezeichenfolge.

$myvar = "varname";
$x = $_GET[arg];
eval("\$myvar = \$x;");

Ein geschickter Angreifer könnte leicht eine eigene Zeichenkette an die eval-Funktion anhängen und sogar Systembefehle ausführen, wenn er möchte.

/index.php?arg=1; system(id)

Es ist wichtig zu beachten, dass Code-Injection-Angriffe zwar das Senden von Systembefehlen beinhalten können, aber nicht nur darauf beschränkt sind. Tatsächlich sind Hacker bei Code-Injection-Angriffen nur durch die Funktionalität der Sprache selbst begrenzt. In unserem Beispiel könnte ein Angreifer das Zielsystem so programmieren, dass es fast alles tut, was das PHP-Framework erlaubt.

Warum sind Code-Injection-Angriffe so gefährlich?

Code-Injection-Angriffe sind je nach Geschick des Angreifers potenziell extrem gefährlich. Sie können alles tun, was die Programmiersprache zulässt, was sie auf die gleiche Stufe wie die Programmierer der App stellt. Ein Angreifer könnte praktisch seine eigene App schreiben und sie innerhalb der Zielumgebung ausführen lassen.

Auch weniger erfahrene Angreifer können gefährlich sein. Anstatt ihre eigene Anwendung oder Code-Strings zu schreiben, können sie dem Zielsystem einfach befehlen, vorprogrammierte Malware zu akzeptieren und zu installieren. Dies könnte zu einer Verunstaltung der Website, zu Ransomware-Angriffen oder sogar zur Grundlage für eine Phishing-Kampagne werden, die sich gegen die Benutzer der Website richtet.

Meistens werden Code-Injection-Angriffe verwendet, um Dinge wie Benutzerlisten und Passwörter zu stehlen oder um wertvolle Informationen über ein System zu erhalten, das für weitere Kompromittierungen vorgesehen ist. Aber seien Sie gewarnt: Ein geschickter Programmierer kann mit einem Code-Injection-Angriff fast alles erreichen. Deshalb ist es so wichtig, dass jede potenzielle Instanz davon entdeckt und aus Ihrer Umgebung entfernt wird.

Vertrauen Sie niemandem! (Oder zumindest, nicht Benutzer)

Bei der Beseitigung von Schwachstellen, die durch Code-Injection-Angriffe entstehen, sollte man als erstes überall dort nachsehen, wo Benutzereingaben verlangt oder zugelassen werden. Alles, was von einem Benutzer eingegeben wird, ist unter keinen Umständen vertrauenswürdig. Wenn Sie Benutzereingaben ohne Filterung oder Prüfung zulassen, laden Sie Angreifer im Grunde dazu ein, Ihr System oder sogar Ihr Netzwerk mit einem Freischuss zu kompromittieren.

Obwohl es nicht immer möglich ist, ist der beste Weg, Code-Injection-Angriffe zu vereiteln, zu verhindern, dass Funktionen ausgeführt oder Benutzereingaben direkt interpretiert werden. Vielleicht kann man den Benutzern eine Auswahl an statischen Optionen geben, anstatt ihnen freie Hand bei der Eingabe ihrer eigenen Abfragen zu lassen, wobei die Anwendung so programmiert ist, dass sie nur diese begrenzten Auswahlmöglichkeiten als gültig akzeptiert. Das ist vielleicht nicht immer sinnvoll, aber wo es möglich ist, kann es Code-Injektionen verhindern, bevor sie beginnen.

Für Bereiche, in denen Benutzer ihre eigenen Eingaben machen müssen, müssen diese Daten streng kontrolliert werden. Die Annahme, dass alles ein potenzieller Angriff ist, ist ein guter Ansatzpunkt. Die Durchsetzung von Richtlinien mit geringsten Privilegien, wie z. B. Benutzerzugriff nur zum Lesen, sowohl auf der Client- als auch auf der Serverseite, kann die Ausführung des meisten Codes verhindern.

Die andere gute Verteidigung besteht darin, anwendungsweite Filter und Sanitization für alle Benutzereingaben zu implementieren. Entwickler sind sich der Code-Injection-Angriffe schon seit Jahren bewusst, und es gibt Bibliotheken mit bewährten Filtern für jedes Framework und jede Sprache. Wenn Sie diese Filter anwenden, stellen Sie sicher, dass Sie dies nicht nur auf die offensichtlichen Benutzereingabebereiche oder gegen allgemeine Parameter wie Get- und Post-Befehle tun, sondern auch gegen Cookies und HTTP-Header.

Anwenden einer Korrektur für Code Injection

Wenn Sie unnötige Benutzereingabebereiche aus Ihrer Umgebung entfernen, die Prinzipien der geringsten Privilegien durchsetzen und die neuesten Filter- und Bereinigungs-Tools verwenden, um potenzielle Angriffe zu untersuchen und zu erkennen, können Sie diese gefährliche Schwachstelle ausschalten. Die Einstellung, Benutzereingaben niemals zu vertrauen, wird Ihnen auch in Zukunft gute Dienste leisten. Wenn Sie all das tun, können Sie dieser gefährlichen Art von Angriffen einen Schritt voraus sein.

Als weitere Lektüre können Sie einen Blick auf den OWASP-Artikel über Code-Injektion werfen. Sie können Ihr neu erworbenes Verteidigungswissen auch mit der kostenlosen Demo der Plattform Secure Code Warrior testen, die Cybersecurity-Teams zu den ultimativen Cyber-Kriegern ausbildet. Um mehr über die Beseitigung dieser Schwachstelle und eine Schurkengalerie anderer Bedrohungen zu erfahren, besuchen Sie den BlogSecure Code Warrior .

Stellen Sie sich der Code-Injektion, genau jetzt. Nehmen Sie die Herausforderung auf unserer gamifizierten Trainingsplattform an: [Hier starten]

Wir bitten Sie um Ihre Erlaubnis, Ihnen Informationen über unsere Produkte und/oder verwandte Themen der sicheren Codierung zuzusenden. Wir werden Ihre persönlichen Daten immer mit äußerster Sorgfalt behandeln und sie niemals zu Marketingzwecken an andere Unternehmen verkaufen.

Senden
Um das Formular abzuschicken, aktivieren Sie bitte "Analytics"-Cookies. Sie können die Cookies wieder deaktivieren, sobald Sie fertig sind.