it-swarm.com.de

Verhindert der schreibgeschützte Zugriff auf die Datenbank die SQL-Injection?

Ich habe eine Web-API, die über eine schreibgeschützte Verbindung eine Verbindung zu meinem SQL Server herstellt, und möchte technisch versierten Benutzern meiner API die Eingabe einer SQL where-Klausel auf dem Querystring ermöglichen. Ich möchte im Grunde nur das anheften, was sie in die select-Anweisung eingeben.

Verhindert eine schreibgeschützte Verbindung zur Datenbank mit den geringsten Berechtigungen (Auswahlfähigkeit nur für eine Tabelle) alle Injection-Angriffe?

51
Aaron

Nein. Möglicherweise verwechseln Sie die SQL-Injection mit der Dateninjektion. schreibgeschützte Tabellen verhindern die SQL-Injection nicht und tun bestenfalls nur wenig, um ihre Auswirkungen zu begrenzen.

SQL-Injection bedeutet einfach die Fähigkeit, SQL-Code zu injizieren. Während schreibgeschützte Tabellen möglicherweise die Fähigkeit einschränken, Daten in die Tabelle einzufügen, haben sie keinen Einfluss auf die Fähigkeit:

  • Lesen Sie aus anderen Datenbanken oder Tabellen, wenn dies nicht zulässig ist
  • Lesen Sie aus Systemtabellen oder führen Sie andere Systemabfragen aus, die schwer zu verbieten sind
  • Schreiben Sie übermäßig komplexe Abfragen, die ein DoS ausführen
  • Daten mit DNS exfiltrieren
  • Zugriff auf lokale Dateien (z. B. utl_file in Oracle)
  • Greifen Sie auf das Netzwerk des DB-Servers zu (z. B. utl_http in Oracle).
  • Führen Sie beliebigen Code auf dem Server über DB-Funktionspufferüberläufe aus.
  • Unter Advanced SQL Injection in Oracle-Datenbanken finden Sie einen ausführlichen Überblick über alle möglichen Dinge, über die Sie sich Sorgen machen müssen (und erkennen, dass andere Datenbanken ihre Entsprechungen haben).

Wenn du

ich möchte im Grunde nur das anheften, was sie in die Anweisung select eingeben.

dann gestatten Sie dem Angreifer ausdrücklich, eines dieser Verfahren auszuprobieren.

Jetzt können Sie sicherlich Dinge tun, um dies zu begrenzen. Sie können Anführungszeichen und Trennzeichen für SQL-Anweisungen nicht zulassen. Sie können jede Eingabe zulassen, die nicht [A-Za-z0-9"=] Ist (oder für Ihre Datenbank effektiv gleichwertig ist). Wenn Sie diesen Weg jedoch beschreiten , sollten Sie Ihre Anwendung besser korrekt schreiben : Stellen Sie eine umfangreichere Abfrageoberfläche bereit, in der Sie die zu überprüfenden Schlüssel anbieten Anschließend führen Sie die vom Benutzer eingegebenen Werte korrekt in Anführungszeichen.

109
gowenfawr

Nein, triviales Beispiel

EXEC ('SELECT COUNT(*) 
       FROM table 
       WHERE UserName =''''' + @UserName + ''''' AND Password = '''''[email protected]+'''''')

Setzen Sie @Password auf a' OR 1=1;--

Und Ihr Passwort wird umgangen

13
Akash

Verhindert eine schreibgeschützte Verbindung zur Datenbank mit den geringsten Berechtigungen (Auswahlfähigkeit nur für eine Tabelle) alle Injection-Angriffe?

Mit SQL Injection kann ein Angreifer eine vorhandene Anweisung so ändern, dass sie unbeabsichtigte Aktionen verursacht. Diese Aktionen können Änderungen an der Datenbank oder die Codeausführung auf dem System sein, aber auch einfach die Rückgabe von Daten, die dies nicht tun sollten, oder ein Denial-of-Service durch Ausführen ressourcenhungriger Vorgänge.

Wenn Sie die Abfragen auf die Auswahl nur für eine bestimmte Tabelle beschränken, wird die Auswirkung möglicherweise begrenzt, aber Sie können wahrscheinlich weiterhin einen Denial-of-Service verursachen. Abhängig davon, wo die Ergebnisse der Abfrage verwendet werden, können Sie das Anwendungsverhalten ändern, indem Sie unerwartete Ergebnisse zurückgeben.

12
Steffen Ullrich

Ganz und gar nicht. SQL-Injection-Fehler treten nicht auf dem SQL Server, sondern auf der Webanwendungsebene auf. Wenn die Webanwendung für die SQL-Injection sensibel ist, bleibt sie unabhängig von der Zugriffsebene auf die Datenbank sinnvoll.

Das von Ihnen erwähnte Prinzip des geringsten Privilegs führt jedoch dazu, dass jemand, der es schafft, eine SQL-Injection in der Webanwendung auszunutzen, nur Lesezugriff auf den Datenbankinhalt erhält und den Datenbankinhalt oder die Datenbankstruktur nicht ändern kann .

0
WhiteWinterWolf