Suche…


Einführung

SQL-Injection ist ein Versuch, auf die Datenbanktabellen einer Website zuzugreifen, indem SQL in ein Formularfeld eingefügt wird. Wenn ein Webserver keinen Schutz vor SQL-Injection-Angriffen bietet, kann ein Hacker die Datenbank dazu bringen, den zusätzlichen SQL-Code auszuführen. Durch Ausführen ihres eigenen SQL-Codes können Hacker den Zugriff auf ihr Konto verbessern, die privaten Informationen einer anderen Person anzeigen oder andere Änderungen an der Datenbank vornehmen.

Beispiel einer SQL-Injektion

Angenommen, der Aufruf des Login-Handlers Ihrer Webanwendung sieht folgendermaßen aus:

https://somepage.com/ajax/login.ashx?username=admin&password=123

Jetzt lesen Sie in login.ashx diese Werte:

strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");

und fragen Sie Ihre Datenbank ab, um festzustellen, ob ein Benutzer mit diesem Kennwort vorhanden ist.

Sie konstruieren also eine SQL-Abfragezeichenfolge:

txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";

Dies funktioniert, wenn der Benutzername und das Passwort kein Angebot enthalten.

Wenn jedoch einer der Parameter ein Zitat enthält, sieht die an die Datenbank gesendete SQL folgendermaßen aus:

-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";

Dies führt zu einem Syntaxfehler, da das Anführungszeichen nach d in d'Alambert die SQL-Zeichenfolge beendet.

Sie können dies korrigieren, indem Sie Anführungszeichen in Benutzernamen und Kennwort verwenden, z.

strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");

Es ist jedoch sinnvoller, Parameter zu verwenden:

cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";

cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);

Wenn Sie keine Parameter verwenden und vergessen, das Anführungszeichen in einem der Werte zu ersetzen, kann ein böswilliger Benutzer (auch als Hacker bezeichnet) SQL-Befehle in Ihrer Datenbank ausführen.

Wenn ein Angreifer beispielsweise böse ist, setzt er / sie das Kennwort auf

lol'; DROP DATABASE master; -- 

und dann sieht die SQL so aus:

"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";

Leider ist dies gültiges SQL, und die DB führt das aus!

Diese Art von Exploit wird als SQL-Injection bezeichnet.

Es gibt viele andere Möglichkeiten, die ein böswilliger Benutzer tun könnte, beispielsweise die E-Mail-Adresse jedes Benutzers zu stehlen, das Passwort von jedem zu stehlen, Kreditkartennummern zu stehlen, Daten in Ihrer Datenbank zu stehlen usw.

Aus diesem Grund müssen Sie immer Ihre Zeichenfolgen entziehen.
Die Tatsache, dass Sie dies früher oder später vergessen werden, ist genau der Grund, warum Sie Parameter verwenden sollten. Denn wenn Sie Parameter verwenden, wird Ihr Programmiersprachen-Framework alle erforderlichen Fluchtwege für Sie ausführen.

einfache Injektionsprobe

Wenn die SQL-Anweisung folgendermaßen aufgebaut ist:

SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);

Ein Hacker könnte dann Ihre Daten abrufen, indem er ein Kennwort wie pw' or '1'='1 . Die resultierende SQL-Anweisung lautet:

SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'

Dieser wird die Passwortprüfung für alle Zeilen in der Tabelle Users durchlaufen, da '1'='1' immer true ist.

Um dies zu verhindern, verwenden Sie SQL-Parameter:

SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow