Ich teste die Widerstandsfähigkeit gegen Injektionsangriffe auf eine SQL Server-Datenbank.
Alle Tabellennamen in der Datenbank sind Kleinbuchstaben, und die Sortierung unterscheidet zwischen Groß- und Kleinschreibung ( Latin1_General_CS_AS) .
Die Zeichenfolge, die ich senden kann, muss in Großbuchstaben geschrieben werden und darf maximal 26 Zeichen lang sein. Daher kann ich keine DROP TABLE senden, da der Tabellenname in Großbuchstaben geschrieben ist und die Anweisung daher aufgrund der Sortierung fehlschlagen würde.
Also - was ist der maximale Schaden, den ich mit 26 Charakteren anrichten kann?
BEARBEITEN
Ich weiß alles über parametrisierte Abfragen und so weiter. Stellen wir uns vor, dass die Person, die das Front-End entwickelt hat, das die Abfrage zum Senden erstellt, in diesem Fall keine Parameter verwendet hat.
Ich versuche auch nicht, etwas Schändliches zu tun, dies ist ein System, das von jemand anderem in derselben Organisation erstellt wurde.
quelle
Antworten:
Einfach:
Oder ich denke in diesem Fall wäre es
Wählen Sie Variationen aus.
Es ist sehr wahrscheinlich, dass Sie dies jetzt auf Ihrem aktuellen System testen können, aber eine Reihe kleiner Änderungen in der Datenbank im Laufe der Zeit können Ihre Tests ungültig machen. Die Zeichenfolge könnte sich ändern, jemand könnte eine gespeicherte Prozedur in Kleinbuchstaben erstellen, die destruktiv sein kann - alles. Man kann niemals mit hundertprozentiger Sicherheit sagen, dass es keinen zerstörerischen Angriff mit 26 Charakteren gibt, den jemand erstellen könnte.
Ich schlage vor, dass Sie einen Weg finden, den Entwickler dazu zu bringen, die grundlegenden Best-Security-Praktiken des Industriestandards zu befolgen , wenn auch nur zu Ihrem eigenen Vorteil, da jemand, von dem ich annehme, zumindest teilweise verantwortlich ist, falls Sicherheitsverletzungen auftreten.
Bearbeiten:
Und aus Bösartigkeit / Spaß könnten Sie versuchen, jedes Ablaufverfolgungsflag zu aktivieren . Das wäre interessant zu beobachten. Fühlt sich an wie ein Blogbeitrag, den Brent Ozar machen würde ...
quelle
SET LOCK_TIMEOUT 0;
,SET LANGUAGE Malaysian;
,SET ANSI_NULLS OFF:
...SET
nur Sitzungseinstellungen betroffen sind, wie werden Satabase- und Servereinstellungen geändert (ALTER DATABASE ...;
?),DROP DATABASE ..;
Würde dies mehr Schaden verursachen, wenn dies erfolgreich war;)Der
SHUTDOWN
Befehl oderKILL
Befehl (wählen Sie eine Zufallszahl über 50 aus) dauert beide deutlich weniger als 26 Zeichen, obwohl das Konto, das die Anwendungsabfragen ausführt, hoffentlich nicht über ausreichende Berechtigungen verfügt, um diese auszuführen.quelle
Sie können eine Tabelle erstellen, die Sie dann füllen, bis das Ende der Zeit oder der Speicherplatz abläuft, je nachdem, was zuerst eintritt.
quelle
while 1=1 insert t values('')
is 30 ...create table x(i int)
=>while 1=1 insert t select 0
is 27x:insert t select 0 GOTO x
ist aber genau 26.Abhängig von Ihrer Definition des Schadens können Sie Folgendes ausführen: WAITFOR DELAY '23: 59 'Um wirklich böse zu sein, können Sie ein Auslastungstest-Tool verwenden, um dies von 32.768 Clients auszuführen.
quelle
Variation basierend auf der Antwort von @ MikaelEriksson und der Antwort von @ MartinSmith auf meinen ersten Kommentar:
Anfangs hatte ich versucht, eine WHILE-Anweisung auszuführen, aber das Beste, was ich tun konnte, waren 27 Zeichen:
Aber Martin wies auf GOTO hin:
GOTO ... die Wurzel allen Übels und der Schöpfer einer Endlosschleifen-Einfügeanweisung in 26 Zeichen.
Vor diesem Hintergrund ... könnte es vorteilhaft sein, CHAR (99) anstelle von int zu verwenden, da dies mehr Speicherplatz beanspruchen würde. Andere Optionen verwenden entweder längere Namen und überschreiten das Limit von 26 Zeichen ... oder belegen weniger Speicherplatz pro Zeile.
Vollständiger Testcode:
quelle
set @S = 'x:insert t;select 0;GOTO x';
für die zukünftige Kompatibilität Ihres Injektionsangriffs;);
s hinzugefügt ... die zweite ist in Ordnung - ersetzt ein Leerzeichen und ist funktionsfähig, wenn sie nicht benötigt wird. Das erste unterbricht die Abfrage - trennt die INSERT-Anweisung von der SELECT-Anweisung.Abhängig davon, wie schädlich Sie einen Stromausfall finden. :-)
Dazu muss xp_cmdshell auf dem Server aktiviert sein, was bei den letzten Versionen von SQL Server nicht der Fall ist. Außerdem muss das Dienstkonto über das Recht zum Herunterfahren verfügen, über das es möglicherweise verfügt oder nicht.
Das Aktivieren von xp_cmdshell überschreitet wahrscheinlich die maximal zulässige Länge von 26 Zeichen. Würden Sie mehrere Injektionen erlauben?
quelle