Frage:
Würde das Entfernen von Leerzeichen in einer Zeichenfolge vor SQL-Injection schützen?
XaolingBao
2016-06-21 09:47:13 UTC
view on stackexchange narkive permalink

Ich war neugierig, ob es möglich ist, sich vor einem SQL-Injection-Angriff zu schützen, indem alle Leerzeichen aus einer String-Eingabe entfernt werden.

Ich habe SQL-Injection unter OWASP nachgelesen. Aber sie erwähnen nichts über das Entfernen von Leerzeichen, also war ich neugierig, warum es funktionieren würde oder nicht?


Ich habe mir diese Frage angesehen, welche fragt nach trim , und die oberste Antwort lautet wie folgt:

Nein, das Hinzufügen eines Trims verhindert nicht die SQL-Injektion. trim entfernt nur Leerzeichen an der Außenseite Ihrer Zeichenfolge.

  Wählen Sie * aus einer Tabelle aus, wobei der Name '%' + @ SearchString + '%'  

Wenn Sie @SearchString so etwas wie

  '' Update aTable gehalten haben, setzen Sie someColumn = 'JackedUpValue', wobei someColumn wie ' 

Wenn Sie dann Füge alles zusammen und führe es dynamisch aus.

  Wähle * aus einer Tabelle, wobei Name wie '%' aktualisiert wird. aTable set someColumn = 'JackedUpValue', wobei someColumn wie '%'  

Wenn Sie jedoch diese Suchzeichenfolge verwendet haben

  update aTable set someColumn = 'JackedUpValue', wobei someColumn wie  
ist

und führen Sie die in dieser Frage gezeigte Operation aus. Würden Sie nicht

  updateaTablesetsomeColumn = 'JackedUpValue'wheresomeColumnlike  

was sollte nicht ausgeführt werden, oder?

Ich bin gespannt, ob es irgendeine Form von SQL-Injection gibt, die dies verhindern könnte. Gibt es ein Wort gefährliche Befehle? Wenn dies besiegt werden kann, würde das Entfernen von Leerzeichen zumindest ein wenig zur Verteidigung beitragen?

Hinweis: Ich stelle diese Frage nur aus Neugier, nicht um die Verwendung zu umgehen die "richtigen" Methoden der SQL Injection Prevention.

Aber welchen Zweck würde dies erfüllen?Ihr primäres Ziel ist das Sammeln von Eingaben, Ihr zweites ist das Verhindern der SQL-Injection.Entweder muss Ihre Eingabe Leerzeichen beibehalten (damit Sie dies nicht tun können) oder nicht (in diesem Fall entfernen Sie sie einfach).Sie selbst sagen, dass dies nicht Ihre einzige Verteidigung sein wird. Richten Sie also eine angemessene Verteidigung ein und vergessen Sie diesen „Trick aus Sicherheitsgründen“.
Dies ist ein gelöstes Problem - parametrisieren Sie einfach alle Ihre Abfragen
Könnte ich einen Tabulator anstelle eines Leerzeichens verwenden?
Schön zu sehen, dass der neue HBGary kommt.Sehr "vorausschauende" Leute ;-)
@JanDoggen Ich frage nur ein "Was-wäre-wenn ...". In meinem Fall benötige ich keine Leerzeichen. Deshalb frage ich, ob das Entfernen von Leerzeichen funktionieren würde.Ich bin auch neugierig, ob ich die Eingabe nur für einen bestimmten Bereich von ASCII- / Unicode-Zeichen bereinigt habe, um besser zu schützen, da es anscheinend viele Leerzeichen-Unicode-Zeichen gibt ...
Obwohl es sich um eine gültige theoretische Frage handelt, hat sie absolut keine praktische Relevanz.Es gibt eine bombensichere Methode zur Sicherung gegen SQL-Injection, die normalerweise sogar einfacher ist als jede alternative Desinfektion.Verwenden Sie das einfach, ohne fragen zu müssen, ob eine alternative Technik tatsächlich alle Ihre Grundlagen abdeckt.
Es ist seltsam, dass ich nach all diesen Upvotes jetzt anfange, Downvotes zu bekommen. Ich wünschte, die Leute würden zumindest kommentieren, warum ... Vielleicht meine Bearbeitung ???
"Ich schlage nicht vor, dass dies meine einzige Verteidigungsform ist, sondern nur neugierig, wo diese Form der" Verteidigung "in das Spektrum von gut bis nutzlos passt." Sie sollten nicht in Betracht ziehen, sie als irgendeine Form der Verteidigung zu verwenden.Als eine Frage, die nur auf wissenschaftlicher Neugier beruht, ist daran jedoch nichts auszusetzen.
Das Entfernen von Backslashes, einfachen und doppelten Anführungszeichen würde höchstwahrscheinlich die SQL-Injection verhindern.Es ist auch praktisch, NULs zu entfernen, um Fehler beim Parsen von Abfragen zu vermeiden.Aber die einfach zu wartende, am wenigsten überraschende Lösung besteht natürlich darin, Abfrageargumente separat zu übergeben (und ihre Position in der Abfrage mit "?" Zu markieren), sodass sich der Datenbank-Client-Treiber um das Escape oder die Verwendung eines ORM kümmert.
@XaolingBao Ich habe nicht genügend Repräsentanten, um abzustimmen, aber ich würde es tun, wenn ich könnte, denn die Frage scheint nur zu lauten: „Ich weiß, dass es all diese richtigen Methoden gibt, die ich verwenden könnte, aber kann ich stattdessen einfach diese faule verwenden, dielähmt, was meine Benutzer eingeben können, und lässt es offensichtlich aus, fast alle Situationen abzudecken, wenn ich tatsächlich realen SQL-Code und erweiterte Zeichensätze in Betracht ziehe? '
Verwenden Sie, wie bereits erwähnt, immer parametrisierte Abfragen.Lebe einfach unter der Annahme, dass nicht parametrisiertes SQL immer ausgenutzt wird, denn ehrlich gesagt gibt es so viele Möglichkeiten, es zu missbrauchen, dass es unmöglich ist, sich vor allen zu schützen.Betrachten Sie als einfaches Beispiel, dass Sie Zahlen herausfiltern und der Angreifer aus irgendeinem Grund eine '3' in seiner Abfrage benötigt.Was macht er?`FLOOR (PI ())`.
@XaolingBao Ich vermute, die Abstimmungen sind, weil es, wie oft als Antwort auf diese Frage angegeben, ein gelöstes Problem ist
@Jasper Ich hatte diesen Pat bearbeitet, bevor ich Ihren Kommentar gesehen habe, um ein bisschen mehr Sinn zu machen, aber ja, ich denke nicht darüber nach, es sei denn, es hat funktioniert, also werde ich diesen Teil bearbeiten, um klarer zu machen, dass ich nur hinschaueDies aus hypothetischer Sicht, und wie Sie sagten "wissenschaftliche Neugier"
@underscore_d Ich erwähnte, dass ich die richtigen Prozeduren verwende. Dies ist nur eine hypothetische Frage, um zu sehen, was wäre, wenn ich Leerzeichen entfernen würde, und dies nicht als Mittel, um SQL Injection zu besiegen, es sei denn, es funktionierte sehr gut.
Sechs antworten:
wireghoul
2016-06-21 10:40:22 UTC
view on stackexchange narkive permalink

Nein. Das Entfernen von Leerzeichen würde die SQL-Injection nicht verhindern, da es viele andere Möglichkeiten gibt, den Parser dazu zu bringen, Ihre Eingabe zu verarbeiten. Schauen wir uns ein Beispiel an. Stellen Sie sich vor, Sie hätten eine URL, bei der die vom Benutzer eingegebene Eingabe in einer Abfrage unsicher verwendet wurde:

http: //example/index.php? Id = 1 => SELECT * von Seite mit id = 1

In Ihrem Beispiel würde der Angreifer Leerzeichen verwenden:

http: //example/index.php? id = 1% 20oder% 201 = 1 => SELECT * von Seite mit id = 1 oder 1 = 1 .

Durch Entfernen der Leerzeichen wird die Injektion in eine Zeichenfolge reduziert.

Stellen wir uns nun vor, der Angreifer hat eine andere Form von Leerzeichen verwendet, z. B. Tabulatoren:

http: //example/index.php? id = 1% 09or% 091 = 1 => SELECT * von Seite mit id = 1 oder 1 = 1 .

Das Entfernen der Leerzeichen würde weiterhin die Injektion ermöglichen.

Abhängig von der verwendeten Technologie könnte der Angreifer die Leerzeichen durch / ** / % 00 % 09 % 0a % 0d oder eine beliebige Anzahl von Unicodes, die eine Tokenisierung durch den SQL-Parser verursachen. Während das referenzierte Beispiel mehr als nur Leerzeichen entfernt hat, nutzt das oben genannte Beispiel SQL-Kommentare, um die Tokenisierung zu verursachen, bei der es sich nicht um Leerzeichen handelt. Sie wären immer noch anfällig.

Die einzige zuverlässige Möglichkeit, die SQL-Injection zu verhindern, ist die Verwendung parametrisierter Abfragen.

Vielen Dank für die interessante Antwort, aber an welchem Punkt würde sich diese URL in die Abfrageanweisung ändern und warum könnten Sie die Leerzeichen an diesem Punkt nicht entfernen?Dies scheint auch nur URLs zu betreffen, oder kann dies auch in Anwendungen verwendet werden?Ich bin mir nicht sicher, ob in der Anwendung etwas wie '\ n' ein Leerzeichen erzeugen würde, nachdem versucht wurde, Leerzeichen aus einem String zu entfernen ... Ich bin auch neugierig, ob Sie dem Folgenden zustimmen, dass Injektionen nicht so groß sindein Deal und ein "Ding der Vergangenheit?"Ich glaube, alle meine Abfragen sind vorbereitete Anweisungen / parametrisiert.Vielen Dank.
Es ist ein allgemeines Webbeispiel, weil Sie auf owasp verwiesen haben."Stellen Sie sich vor", wie die Benutzereingabe in die Abfrage gelangt ist.Wie SQL-Injektionen auftreten, ist eine ganz andere Frage als bei Ihrem OP.Methoden zum Ausnutzen von SQL-Injektionen sind überall dort anwendbar, wo SQL-Injektionen auftreten, sei es eine Windows-Anwendung, ein FTP-Server, ein Musik-Player-Plugin oder eine Webseite.SQL-Injection ist ein aktuelles Problem, und während Entwickler sich dessen immer mehr bewusst werden, ist es immer noch eine häufige Erkenntnis.
Ich verstehe, ich habe mir das nicht richtig angesehen und nicht bemerkt, dass Sie nur id = 1 oder andere Befehle ausführen können, die so waren.Ich dachte mir, dass eine Anwendung möglicherweise besser vor einem Angriff schützen kann als eine URL-Abfrage, bin mir aber nicht sicher, wie das im Vergleich funktioniert.Ich muss diese ID = 1 und 1 = 1 Geschäft nachschlagen. Vielen Dank.
+1 für "*** Der einzige zuverlässige Weg, um eine SQL-Injection zu verhindern, ist die Verwendung parametrisierter Abfragen ***" - anscheinend können wir dies nicht genug wiederholen!
@TobySpeight, außer es scheint, dass einige behaupten, dass parametrisierte Abfragen nicht vor allen Formen von SQL Injection schützen?
Ich weiß nicht einmal, warum die Leute weiterhin versuchen, die SQL-Injection ohne parametrisierte Abfragen zu lösen, als hätten sie noch nie von ihnen gehört.Es bringt mich dazu, mein Gesicht zusammen mit diesem dummen Bobby Tables-Mem durch einen Holztisch zu zerschlagen.
Julie Pelletier
2016-06-21 10:11:12 UTC
view on stackexchange narkive permalink

Wir sind im Jahr 2016! SQL-Injections gehören der Vergangenheit an, sofern Sie keinen unsicheren Code verwenden.

Unabhängig davon, welche Sprache Sie verwenden, verwenden Sie vorbereitete Anweisungen oder eine andere Art der Datenbindung, wenn Sie SQL-Injektionen und alle verhindern möchten.

Vorbereitete Anweisungen trennen die Abfrage von den Daten, sodass die Daten die Abfrage nicht beeinflussen können.

Um Ihre Frage direkt zu beantworten, würde das Entfernen von Leerzeichen die SQL-Injektionen reduzieren (bei Verwendung veralteter Daten) Code und Bibliotheken), würde aber Ihren Eingabetext sicherlich einschränken (keine Leerzeichen).

Kommentare sind nicht für eine ausführliche Diskussion gedacht.Diese Konversation wurde [in den Chat verschoben] (http://chat.stackexchange.com/rooms/41512/discussion-on-answer-by-julie-pelletier-would-removing-spaces-in-a-string-protec).
Anders
2016-06-21 12:45:02 UTC
view on stackexchange narkive permalink

Es würde das Problem begrenzen, aber nicht beseitigen. Stellen Sie sich folgende Situation vor:

  $ un = str_replace ("", "", $ _POST ["Benutzername"]); $ pw = Hash ($ _ POST ["Passwort"]; $ sql = "SELECT * FROM users WHERE Benutzername = '$ un' AND password = '$ pw'";  

Nehmen wir an, ich poste den Benutzernamen admin '- Das würde mich als Administrator anmelden, ohne ein einziges Leerzeichen zu verwenden.

Wie wireghoul hervorhebt, müssten Sie auch andere leere Zeichen wie tab entfernen. Aber als Julie Pelletier weist darauf hin, dass Sie nur vorbereitete Anweisungen verwenden. Der Versuch, clevere Schemata zu entwickeln, um SQLi zu stoppen, ohne dass dies ein unterhaltsames Spiel ist, bietet Ihnen möglicherweise nie die Sicherheit, die vorbereitete Anweisungen bieten nur eine Ablenkung.

Vielen Dank für die Antwort, aber es schien, als könnten Sie kleine Anweisungen eingeben, wie in Wireghouls Antwort, in der er id = 1 sagt, aber nicht sicher, ob sie auf diese Weise Passwörter erhalten könnten, und ich bin gespannt, wo die Eingabe zurückgegeben wird, wenn siehat das in der URL-Zeile?In Ihrem Beispiel mit dem Administrator müssten Sie seine Informationen kennen, um sich anzumelden. Ich bin also etwas verwirrt, was Ihr Beispiel zu zeigen versucht.Ich verwende vorbereitete Anweisungen, bin aber nur hypothetisch neugierig, wie gut das Entfernen von Speicherplatz und andere ähnliche Aufgaben wären ... Danke!
In meinem Beispiel müssen Sie nur einen Benutzernamen (nicht das Kennwort) kennen, um sich als dieser Benutzer anzumelden.Das ist sehr, sehr schlecht.Es gibt viele andere Dinge, die Sie tun könnten.Whireghoul hat einige Beispiele, Jimmy James auch.
"Das ist sehr sehr schlecht" bedeutet das kein Passwort für admin lol?Was genau bedeutet "admin" - "in SQL"?Ja, es scheint, dass es von anderen kleinen Befehlen besiegt würde.Vielen Dank.
Dies ist die SQL, die Sie erhalten: `SELECT * FROM users WHERE Benutzername = 'admin' - AND password = ''`.Da "-" einen Kommentar startet, lautet die ausgeführte Abfrage "SELECT * FROM users WHERE username =" admin ".Der Administrator wird also so zurückgegeben, als ob das Kennwort übereinstimmen würde, obwohl kein Kennwort vorhanden war.
Vielen Dank ... Das macht sehr viel Sinn und ist schmutzig .... :) ... Da ich meine Frage zur Bereinigung von Eingaben so bearbeitet habe, dass nur Zahlen und Buchstaben, dieser Angriff und andere erwähnt werdenmit Zeichen wie `= und %` sollte gestoppt werden, oder?Vielen Dank!
JimmyJames
2016-06-21 18:54:52 UTC
view on stackexchange narkive permalink

Nein . Angenommen, Sie haben dies als SQL:

  "Wählen Sie * aus Personen aus, bei denen last_name = '" + Nachname + "'"  

Wenn ich Folgendes eingebe: 'OR (1 = 1) OR'a' = ' in die Eingabe, in die es umgewandelt wird:

  Wählen Sie * aus Personen aus, bei denen last_name =' 'OR (1 = 1) OR'a '=' ' 

Wird (mindestens) in Oracle und MySQL ausgeführt und gibt alle Zeilen aus der Tabelle zurück.

Kommentare sind nicht für eine ausführliche Diskussion gedacht.Diese Konversation wurde [in den Chat verschoben] (http://chat.stackexchange.com/rooms/41582/discussion-on-answer-by-jimmyjames-would-removing-spaces-in-a-string-protect-aga).
nvuono
2016-06-23 18:09:35 UTC
view on stackexchange narkive permalink

Wenn Sie jedoch diese Suchzeichenfolge verwendet haben

update aTable set someColumn = 'JackedUpValue', wobei someColumn die in dieser Frage gezeigte Operation ausführt, würde dies nicht der Fall sein Sie erhalten

updateaTablesetsomeColumn = 'JackedUpValue'wheresomeColumnlike , die nicht ausgeführt werden sollten, oder?

Wie andere darauf hingewiesen haben, gibt es andere Möglichkeiten Whitespace in verschiedene SQL-Datenbankimplementierungen einbinden, die Sie berücksichtigen müssten, z. B. Registerkarten und \ n (Zeilenumbruch). Fast jedes Datenbankmodul würde gerne Folgendes akzeptieren:

  updateaTablesetsomeColumn = 'JackedUpValue'  

Es kann verschiedene Unicode-Zeichen geben, die aufgrund der Lokalisierungseinstellungen in verschiedenen als Leerzeichen fungieren Datenbanken, aber Sie müssten sich wirklich mit Implementierungsdetails befassen, um das herauszufinden. Es gibt wirklich keinen Grund, all diese Randfälle für das Ersetzen von Zeichenfolgen abzudecken, anstatt nur parametrisierte Abfragen zu verwenden.

user126572
2016-10-06 07:23:28 UTC
view on stackexchange narkive permalink

Hier ist eine Idee. Datenbankserver nehmen die eingehende SQL-Abfrage und führen sie über einen Parser aus, was zu einem Analysebaum führt. Dann verwandeln sie den Baum in einen Plan und führen den Plan aus.

Das Wesentliche bei der Injektion ist, dass der Parser einen Baum erzeugt, der sich von dem vom Programmierer beabsichtigten unterscheidet.

Also das Update ist es, ungewöhnliche Analysebäume erkennen zu können. Gehen Sie nach dem Parsen über den Baum und erstellen Sie eine Zeichenfolge in kanonischer Form abzüglich der Datenwerte. Berechnen Sie einen SHA-Hash der Zeichenfolge. Führen Sie eine Tabelle mit bekannten Hashes für den Anwendungs- / Datenbankbenutzer. Warnen oder abbrechen, wenn der Server einen unbekannten Hash sieht.

Offensichtlich liegt ein Startproblem vor. Der Programmierer müsste also die Anwendung in einem Testmodus ausführen, die Hashes nach ausführlichen Tests extrahieren und den Server beim Start der Anwendung mit den Hashes laden. Aktivieren Sie dann "Abort-on-New-Hash" und es sollte kein SQL-Inject mehr möglich sein.

Wie werden Sie die Daten aus der kanonischen Form entfernen?Wäre das nicht nur ein weiterer Parser, der sich täuschen lässt, dass Daten Code sind?Der Angreifer müsste ein SQLi erstellen und dann einen kanonischen Parser in das Ende / den Anfang der Zeichenfolge irreführen.Das ist problematischer als einfaches SQLi, aber nicht kugelsicher.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...