it-swarm-eu.dev

Multibyte-Zeichen-Exploits - PHP / MySQL

Könnte mich bitte jemand auf einen Link mit Informationen zu Multibyte-Zeichen-Exploits für MySQL verweisen? Ein Freund machte mich darauf aufmerksam, aber ich konnte im Internet nicht viele Informationen finden.

20
Matthew S

Zusammenfassung. Ja, das Problem ist, dass in einigen Zeichencodierungen (wie UTF-8) ein einzelnes Zeichen als mehrere Bytes dargestellt wird. Einige Programmierer versuchen, die SQL-Injection zu verhindern, indem sie alle einfachen Anführungszeichen in nicht vertrauenswürdigen Eingaben maskieren, bevor sie in ihre SQL-Abfrage eingefügt werden. Viele Standardfunktionen zum Anhalten von Anführungszeichen kennen jedoch die Zeichenkodierung nicht, die die Datenbank verwendet und als Eingabe von Bytes verarbeitet, ohne zu berücksichtigen, dass ein einzelnes Zeichen mehrere Bytes füllen kann. Dies bedeutet, dass die Funktion zum Anhalten von Anführungszeichen die Zeichenfolge anders interpretiert als die Datenbank. Infolgedessen kann es in einigen Fällen vorkommen, dass die Funktion zum Anhalten von Anführungszeichen Teile der Zeichenfolge, die von der Datenbank als Mehrbyte-Codierung eines einzelnen Anführungszeichens interpretiert werden, nicht maskiert. oder könnte versehentlich eine Mehrbyte-Zeichencodierung auf eine Weise auflösen, die ein einfaches Anführungszeichen einführt, wenn eines zuvor nicht vorhanden war. Multi-Byte-Zeichen-Exploits bieten Angreifern daher die Möglichkeit, SQL-Injection-Angriffe auszuführen, selbst wenn der Programmierer der Ansicht ist, dass sie ihren Eingaben in die Datenbank angemessen entkommen.

Die Auswirkung. Wenn Sie vorbereitete/parametrisierte Anweisungen verwenden, um alle Datenbankverbindungen herzustellen, sind Sie sicher. Multi-Byte-Angriffe schlagen fehl. (Abgesehen von Fehlern in der Datenbank und der Bibliothek natürlich. Aber empirisch scheinen diese selten zu sein.)

Wenn Sie jedoch versuchen, nicht vertrauenswürdigen Eingaben zu entkommen und dann mithilfe der Zeichenfolgenverkettung dynamisch eine SQL-Abfrage zu erstellen, sind Sie möglicherweise anfällig für Multi-Byte-Angriffe. Ob Sie tatsächlich anfällig sind, hängt von bestimmten Details der von Ihnen verwendeten Escape-Funktion, der von Ihnen verwendeten Datenbank, der Zeichenkodierung, die Sie mit der Datenbank verwenden, und möglicherweise anderen Faktoren ab. Es kann schwierig sein, vorherzusagen, ob Multi-Byte-Angriffe erfolgreich sein werden. Daher ist das Erstellen von SQL-Abfragen mithilfe der Zeichenfolgenverkettung fragil und wird nicht empfohlen.

Technische Details. Wenn Sie mehr über die Details der Angriffe erfahren möchten, kann ich Ihnen eine Reihe von Links zur Verfügung stellen, die die Angriffe ausführlich erläutern Detail. Es gibt mehrere Angriffe:

  • Grundlegende Angriffe auf z. B. UTF-8 und andere Zeichenkodierungen durch Auffressen zusätzlicher Backslashes/Anführungszeichen, die durch die Anführungszeichenfunktion eingeführt werden: siehe z. B. hier .

  • Hinterhältige Angriffe auf z. B. GBK, bei denen die Anführungszeichenfunktion ausgetrickst wird, um ein zusätzliches Anführungszeichen für Sie einzuführen: siehe z. B. Chris Shifletts Blog , hier oder - hier .

  • Angriffe auf z. B. UTF-8, die das Vorhandensein eines Zitats verbergen, indem eine ungültige nicht-kanonische (überlange) Codierung des einzelnen Zitats verwendet wird: siehe z. B. hier . Grundsätzlich passt die normale Art der Codierung eines einzelnen Anführungszeichens in eine Einzelbyte-Sequenz (nämlich 0x27). Es gibt jedoch auch Mehrbyte-Sequenzen, die die Datenbank möglicherweise als einfaches Anführungszeichen dekodiert und die weder das Byte 0x27 Noch einen anderen verdächtigen Bytewert enthalten. Infolgedessen können Standardfunktionen zum Anhalten von Anführungszeichen diesen Anführungszeichen möglicherweise nicht entkommen.

20
D.W.

Mehrfachbyte-Angriffe sind nicht auf SQL Injection beschränkt. Im Allgemeinen führen Mehrbyte-Angriffe zu einem "Byte-Verbrauch" -Zustand, bei dem der Angreifer Steuerzeichen entfernt. Dies ist das Gegenteil des Klassikers ' or 1=1--, In dem der Angreifer das Steuerzeichen in einfachen Anführungszeichen einführt. Für MySQL gibt es mysql_real_escape_string(), mit dem Probleme bei der Zeichenkodierung behoben werden können. Parametrisierte Abfragebibliotheken wie PDO verwenden diese Funktion automatisch. MySQLi sendet die Parameter der Abfrage tatsächlich als separates Element innerhalb einer Struktur, wodurch das Problem vollständig vermieden wird.

Wenn eine HTML-Seite über Shift-JIS gerendert wird, können Steuerzeichen verwendet werden, um XSS zu erhalten. Ein hervorragendes Beispiel hierfür finden Sie in " A Tangled Web " (fantastisches Buch!) Auf Seite 207:

<img src="http://fuzzybunnies.com/[0xE0]">
...this is still a part of the mkarup...
...but the srever dosn't know...
" onload="alert('this will execute!')"
<div>
...page content continues...
</div>

In diesem Fall ist 0xE0 ein spezielles Byte, das den Beginn eines 3-Byte-Symbols anzeigt. Wenn der Browser dieses HTML rendert, wird das fließende "> Verwendet und in ein einzelnes Shift-JIS-Symbol umgewandelt. Wenn der Angreifer die folgende Eingabe mithilfe einer anderen Variablen steuert, kann er einen Ereignishandler einführen, um die Codeausführung zu erhalten.

5
rook