Wie überprüfen Sie Ihre URL auf SQL Injection Attacks?

8

Ich habe einige versuchte SQL-Injection-Angriffe auf einer meiner Websites gesehen. Es kommt in Form einer Abfragezeichenfolge, die das "Cast" -Schlüsselwort und eine Reihe von Hexadezimalzeichen enthält, die, wenn sie "dekodiert" werden, eine Injektion von Banneranzeigen in die DB sind.

Meine Lösung besteht darin, die vollständige URL (und die Parameter) zu scannen und nach dem Vorhandensein von "cast (0x") zu suchen und nach einer statischen Seite zu suchen.

Wie überprüfen Sie Ihre URLs auf SQL Injection-Angriffe?

    
Guy 03.09.2008, 19:28
quelle

10 Antworten

2

Ich denke, es hängt davon ab, auf welcher Ebene Sie SQL Injection überprüfen / verhindern wollen.

Auf der obersten Ebene können Sie URLScan oder einige Apache Mods / Filter (jemand hilft mir hier) verwenden, um die eingehenden URLs auf den Webserver selbst zu überprüfen und Anfragen, die einem bestimmten Muster entsprechen, sofort zu löschen / ignorieren.

>

Auf UI-Ebene können Sie den Eingabefeldern, die Sie einem Benutzer geben, einige Validatoren zuweisen und maximale Längen für diese Felder festlegen. Sie können auch bestimmte Werte / Muster nach Bedarf auflisten.

Auf Codeebene können Sie, wie oben erwähnt, parametrisierte Abfragen verwenden, um sicherzustellen, dass String-Eingaben als reine String-Eingaben eingehen und nicht versuchen, T-SQL- / PL-SQL-Befehle auszuführen.

Sie können es auf mehreren Ebenen tun, und die meisten meiner Sachen haben Datum die zweiten beiden Probleme, und ich arbeite mit unseren Server Admins, um die Top-Layer-Sachen an Ort und Stelle zu bekommen.

Stimmt das eher mit dem, was Sie wissen wollen?

    
Dillie-O 03.09.2008, 21:34
quelle
23

Ich nicht.

Stattdessen verwende ich parametrisierte SQL-Abfragen und verlasse mich auf die Datenbank, um meine Eingabe zu bereinigen.

Ich weiß, das ist ein neuartiges Konzept für PHP-Entwickler und MySQL-Benutzer, aber Leute, die echte Datenbanken verwenden, machen das schon seit Jahren so.

Zum Beispiel (mit C #)

%Vor%     
FlySwat 03.09.2008 19:32
quelle
4

Dies.

edit: MSDNs Muster & amp; Praxisleitfaden zur Verhinderung von SQl-Injektionsangriffen. Kein schlechter Ausgangspunkt.

    
Will 03.09.2008 19:36
quelle
3

Ich nicht. Es ist der Zweck der Datenbankzugriffsebene, sie zu verhindern, nicht die URL-Zuordnungsebene, um sie vorherzusagen. Verwenden Sie vorbereitete Anweisungen oder parametrisierte Abfragen und machen Sie sich keine Sorgen mehr über SQL-Injection.

    
John Millikin 03.09.2008 19:32
quelle
1

Es gibt verschiedene Möglichkeiten, einen SQL Injection-Angriff entweder über eine Abfragezeichenfolge oder ein Formularfeld auszuführen. Das Beste, was Sie tun müssen, ist, Ihre Eingaben zu bereinigen und sicherzustellen, dass Sie nur gültige Daten akzeptieren, anstatt zu versuchen, Dinge, die möglicherweise schlecht sind, zu verteidigen und zu blockieren.

    
chs 03.09.2008 19:33
quelle
1
  

Was ich nicht verstehe ist, wie die Beendigung der Anfrage, sobald eine SQL-Injection in der URL erkannt wird, nicht Teil einer Verteidigung sein soll?

     

(Ich behaupte nicht, dass dies die gesamte Lösung ist - nur ein Teil der Verteidigung.)

  • Jede Datenbank hat ihre eigenen Erweiterungen für SQL. Sie müssen die Syntax tief verstehen und mögliche Angriffe für verschiedene Abfragetypen blockieren. Verstehen Sie die Regeln für die Interaktionen zwischen Kommentaren, Escapezeichen, Anführungszeichen usw. für Ihre Datenbank? Wahrscheinlich nicht.
  • Auf der Suche nach festen Saiten ist zerbrechlich. In Ihrem Beispiel blockieren Sie cast(0x , aber was, wenn der Angreifer CAST (0x verwendet? Sie könnten eine Art Pre-Parser für die Abfrage-Strings implementieren, aber es müsste einen nicht-trivialen Teil des SQL analysieren. SQL ist bekanntlich schwer zu parsen.
  • Es verwässert die URL-Dispatch-, View- und Datenbank-Layer. Ihr URL-Dispatcher muss wissen, welche Sichten SELECT , UPDATE usw. verwenden und muss wissen, welche Datenbank verwendet wird.
  • Es erfordert eine aktive Aktualisierung des URL-Scanners. Jedes Mal, wenn eine neue Injektion entdeckt wird - und glauben Sie mir, es wird viele geben - Sie müssen es aktualisieren. Im Gegensatz dazu ist die Verwendung passender Abfragen passiv und wird ohne weitere Sorgen Ihrerseits funktionieren.
  • Sie müssen darauf achten, dass der Scanner niemals seriöse URLs blockiert. Vielleicht werden Ihre Kunden niemals einen Benutzer namens "cast (0x") erstellen, aber nachdem Ihr Scanner komplex genug wird, wird "Fred O'Connor" den "unterminated single quote" Check auslösen?
  • Wie von @chs erwähnt, gibt es mehr Möglichkeiten, Daten in eine App zu bekommen als die Abfragezeichenfolge. Sind Sie bereit, jede Sichtweise zu testen, zu der% c0_de% ediert werden können? Jedes Formularfeld und Datenbankfeld?
John Millikin 03.09.2008 21:42
quelle
1
%Vor%     
nono 03.12.2008 17:18
quelle
0

Danke für die Antworten und Links. Übrigens benutzte ich bereits parametrisierte Abfragen und deshalb war der Angriff ein "versuchter" Angriff und kein erfolgreicher Angriff. Ich stimme Ihren Vorschlägen zur Parametrisierung von Abfragen voll und ganz zu.

Der MSDN-Post-Link erwähnt als Teil des Ansatzes, der Teil meiner derzeitigen Strategie ist, die "Beschränkung der Eingabe". Es erwähnt auch, dass ein Nachteil dieses Ansatzes darin besteht, dass Sie einige der gefährlichen Eingaben übersehen können.

Die bisher vorgeschlagenen Lösungen sind gültig, wichtig und Teil der Verteidigung gegen SQL-Injection-Angriffe. Die Frage nach "Eingrenzen der Eingabe" bleibt offen: Was können Sie sonst in der URL als erste Verteidigungslinie suchen?

    
Guy 03.09.2008 19:53
quelle
0
  

Was können Sie sonst in der URL als erste Verteidigungslinie suchen?

Nichts. Beim Scannen von URLs auf gefährliche Zeichenfolgen kann keine Abwehr gefunden werden.

    
John Millikin 03.09.2008 19:57
quelle
0
  

Nichts. Beim Scannen von URLs auf gefährliche Zeichenfolgen kann keine Abwehr gefunden werden.

@John - können Sie das ausarbeiten?

Was ich nicht verstehe ist, wie die Beendigung der Anfrage, sobald eine SQL-Injection in der URL erkannt wird, nicht Teil einer Verteidigung sein soll?

(Ich behaupte nicht, dass dies die gesamte Lösung ist - nur ein Teil der Verteidigung.)

    
Guy 03.09.2008 21:07
quelle

Tags und Links