it-swarm-eu.dev

SQL-Injection mit AND 1 = 1

Bitte erläutern Sie die Bedeutung von "AND 1 = 1 "in einem SQL-Injection-Angriff. Es ist aus einer Übung an meiner Universität.

select * from user where id = 'smith'' AND 1=1;--  and birthdate = 1970;

oder

select * from user where id = 'smith' and birthdate = 1970 AND 1=1;--;
20
Alex

Die spezifische Frage ist SQL-Injection mit AND 1 = 1 und nicht OR 1 = 1. Hier gibt es einen großen Unterschied in dem, worüber das OP fragt. Wenn ich Ihr Lehrer wäre und Sie mir die Antwort von Jonathan Müller geben würden, würden Sie eine schlechte Note bekommen, da Sie die Frage nicht verstehen.

AND 1 = 1 wird normalerweise in Blind SQL Injections verwendet. In diesem Fall müssen Sie anhand des Ergebnisses der Anwendung zwischen einem wahren und einem falschen Zustand bestimmen, um das tatsächliche Ergebnis zu ermitteln. Sie erhalten keine Daten, die im Ergebnis aufgeführt sind. Das einzige, was zurückgegeben wird, ist ein Änderungszustand.

Wenn Sie versuchen, eine Blind SQL-Injection mit OR 1 = 1 auszunutzen, schlagen Sie fehl, da die primäre Verwendung von OR 1 = 1 darin besteht, immer ein true zu erstellen Anweisung, um die meisten Daten aus der Datenbank herauszuholen oder eine echte Anweisung zu erzwingen, wenn ein Anmeldeskript ausgenutzt wird.

Ein praktisches Beispiel für einen blinden SQL-Exploit:

Wir verwenden unser Beispiel: http://www.site.com/news.php?id=7 Testen wir es: http://www.site.com/news.php ? id = 7 und 1 = 1 <--- das ist immer wahr und die Seite wird normal geladen, das ist ok.

http://www.site.com/news.php?id=7 und 1 = 2 <--- Dies ist falsch. Wenn also Text, Bild oder Inhalt auf der zurückgegebenen Seite fehlen Dann ist diese Site anfällig für Blind-SQL-Injektionen.

Ein weiteres Beispiel, in dem Sie versuchen, die MySQL-Version herauszufinden:

http://www.site.com/news.php?id=7 und Teilzeichenfolge (@@ version, 1,1) = 4 Dies sollte TRUE zurückgeben, wenn die Version von MySQL 4 ist. Ersetzen 4 mit 5, und wenn die Abfrage TRUE zurückgibt, ist die Version 5.

Beispiele aus: http://www.exploit-db.com/download_pdf/14475

34
Chris Dale

Normalerweise würde der Ausdruck "OR 1 = 1 '" sein. Der Grund ist, wenn ein Programmierer Parameter (wie Benutzer-ID) nicht richtig verarbeitet, könnte ein Angreifer einen OR 1=1 Verwenden, um alle Daten in der Tabelle zurückzugeben.

Angenommen, wir möchten Details zu einem Benutzer namens Smith erhalten. Die Abfrage könnte select * from user where id = '?' Sein, wobei das Fragezeichen durch einen Parameter aus der Benutzereingabe ersetzt wird. Wenn der Angreifer smith' OR 1=1-- Bestanden hätte, wäre die resultierende SQL select * from user where id = 'smith' OR 1=1--'. In diesem Fall wird das zweite einfache Anführungszeichen aus der ursprünglichen Abfrage übersprungen, da es Teil eines Kommentars ist und die Abfrage alle Daten in der Benutzertabelle zurückgibt.

15
JonathanMueller

Stellen Sie sich diese Abfrage irgendwo in Ihrem App-Code vor, um ein (etwas triviales) Beispiel für die SQL-Injektion zu geben ...

select 1 from user where name='[NAME]' and password='[PASS]'

nachdem Malicious Guy die oben genannten Parameter auf seine Auswahl gesetzt hat, erhalten Sie:

select 1 from user where name='admin' --' and password='[PASS]'
 unter Verwendung der folgenden ausgewählten, nicht bereinigten Werte: 
 [NAME] = '-' und password = '[PASS]' 
 Der Wert der Variablen [PASS] ist unwichtig 

Unter der Annahme, dass die Abfrage eine 1 für den Erfolg und einen leeren Satz für einen ungültigen Benutzer oder einen ungültigen Pass zurückgeben soll, wird fälschlicherweise eine 1 zurückgegeben, sodass sich dieser böse Benutzer als "Administrator" -Konto anmelden kann.

0
Garrett