AFU (20.02.2014), Gangstersheep (25.07.2012), Gurke (08.09.2012), John Gotti (29.09.2014), Minecraft (25.07.2012), Snees (25.07.2012)
-
25.07.2012, 17:33 #1
- Registriert seit
- 15.11.2011
- Beiträge
- 6.081
- Blog Entries
- 5
Thanked 9.119 Times in 2.996 Posts[TuT] Simple SQL-Injection am Beispiel von PHP
Bei einer SQL-Injection werden fremde Daten ungewollt in eine SQL-Datenbankabfrage eingeschleust. Oft ist auch von der Abkürzung SQLi die Rede. Mit der gleich abgekürzten verbesserten (englisch improved) Version von MySQL hat das jedoch nichts zutun.
Viele Seiten verwenden heutzutage Datenbanken zum Speichern von Daten, da man so schnell und einfach Inhalte hinzufügen, entfernen und ändern kann.
U-Labs hat Beispielsweise ebenfalls eine Datenbank, in der die Daten von allen Benutzern sowie sämtliche Threads und Beiträge gespeichert sind.
Das Forensystem generiert also dynamische Datenbankabfragen mit Daten von außen - genau hier besteht potenzielle Manipulationsgefahr.
Um das ganze besser zu verdeutlichen mal ein schlechtes Beispiel:
Wir haben ein einfaches Login-System das auf PHP basiert. Unser Script bekommt per GET die Logindaten bestehend aus Nutzer und Passwort übermittelt.
Es soll prüfen, ob diese Kombination in der Datenbank existiert, wenn ja ist der Nutzer eingeloggt.
Wir basteln also eine dynamische SQL-Query, und prüfen mit mysql_num_rows() ob mindestens 1 Zeile mit den Nutzerdaten in der Datenbank vorhanden ist, dann ist der User eingeloggt.
Der relevante Teil dieses Scripts sieht dann also wie folgt aus:
PHP-Code:$res = mysql_query("SELECT COUNT(*) FROM users WHERE username='" . $_GET['username'] . "' AND password='" . $_GET['password'] . "'");
$rows = mysql_num_rows($res);
if($rows > 0) {
echo 'Eingeloggt.';
}
Ganz einfach: Über $_GET kommen Daten von außen, die ungefiltert in einer dynamisch erzeugten SQL-Query eingesetzt werden.
Daten von außen müssen immer gefiltert werden, da man als Programmierer in der Form oben absolut keinen Einfluss darauf hat, was das für Daten sind.
Natürlich können das gute sein, dass z.B. Dieter als Benutzername und 123456 als Passwort übergeben wird, dann sähe die SQL-Query so aus:
SELECT username FROM users WHERE username='Dieter' AND password='123456'
Da aber wie gesagt nichts gefiltert wird kann man die Query ganz einfach manipulieren und den Login mit ungültigen Daten umgehen:
Nehmen wir mal an username ist wieder Dieter, wir kennen aber das Password nicht.
Also übergeben wir als password folgenden String: bla' OR '1'='1
Damit sieht die Query wie folgt aus (die roten Teile stammen aus der Nutzereingabe von außen):
Code:SELECT username FROM users WHERE username='Dieter' AND password='bla' OR '1'='1'
Wieso? Durch das manipulieren des Password-Parameters wurde die Bedingung der SQL, bei der wir einen Datensatz zurück bekommen, komplett verändert.
Zur Verdeutlichung ist in der Query oben alles rot, was von außen als GET-Parameter dynamisch in die Query eingefügt wird.
Vorher mussten username und password mit den Werten in der Datenbank übereinstimmen, jetzt gibt es 2 Bedingungen: username und password müssen gleich sein ODER '1' ist das gleiche wie '1'.
username und password sind nicht gleich, aber 1=1 ist eine Bedingung die immer zutrifft, in dem Beispiel eben als Strings da sich am Ende noch ein ' befindet.
Da ein ODER dazwischen ist, ist der gesamte Ausdruck gültig wenn nur die 2. Bedingung zutrifft.
Weil 1=1 immer zutrifft liefert uns die Datenbank sämtliche Datensätze die vorhanden sind. Somit ist $rows später auf jeden Fall > 0 und man gilt als eingeloggt, egal was als username und password übergeben wird.
Das hier ist natürlich ein absolut simples Beispiel. Je nachdem wie das Script mit den Daten umgeht und welche Rechte der Datenbankbenutzer hat ist vom auslesen privater Daten wie Passwörter bzw deren Hashes über das gezielte Manipulieren einzelner Daten bis zum kompletten Löschen der Datenbank alles möglich.
Hier wurde das Problem nur am Beispiel von PHP demonstriert.
Andere Weborientierte Sprachen wie Python oder Perl sind davon genau so betroffen, wenn Daten von Außerhalb wie Nutzereingaben nicht richtig bzw gar nicht escaped werden.
Abhilfe kann geschaffen werden, in dem Daten aus externen Quellen wie Benutzereingaben vorher entschärft werden.
Noch besser ist der Einsatz von Pepared Statements, da hier nicht explizit jede einzelne Variable manuell escaped werden muss (und das somit auch nicht vergessen werden kann).
-
The Following 6 Users Say Thank You to DMW007 For This Useful Post:
-
25.07.2012, 17:39 #2
- Registriert seit
- 25.07.2012
- Beiträge
- 4
Thanked 1 Time in 1 PostAW: [TuT] Simple SQL-Injection am Beispiel von PHP
sofern es gestattet ist dein tread zu erweitern poste ich hier 2 videos von mir wo sqli per clicktools aka sql poizon und havij erklärt wird
lücken finden
db auslesen
-
The Following User Says Thank You to verpeilt2007 For This Useful Post:
AFU (20.02.2014)
-
25.07.2012, 17:44 #3
AW: [TuT] Simple SQL-Injection am Beispiel von PHP
Übungen: https://redtiger.dyndns.org/hackit/
LG
-
25.07.2012, 17:46 #4
- Registriert seit
- 25.07.2012
- Beiträge
- 4
Thanked 1 Time in 1 PostAW: [TuT] Simple SQL-Injection am Beispiel von PHP
seite wird bei mir leider geblockt
LibertyGuard
LibertyGuard has detected that you are about to enter a phishing web site.
It is strongly recommended not to enter this phishing web site as it can contain viruses or ask you for your login information.
This is a fake web site created by hackers that wish to gain access to your money.
redtiger.dyndns.org
For more information about LibertyGuard please go to Liberty Reserve website and click on LibertyGuard link.
-
25.07.2012, 17:53 #5
- Registriert seit
- 15.11.2011
- Beiträge
- 6.081
- Blog Entries
- 5
Thanked 9.119 Times in 2.996 PostsAW: [TuT] Simple SQL-Injection am Beispiel von PHP
Ist auf jeden Fall ein Fehlalarm.
Das Hackit ist ziemlich bekannt, gibt es auch schon eine ganze Weile.
Kp wieso das von LibertyGuard als Phishing-Seite erkannt wird.
Entweder die haben eine Auto-Detection die das falsch erkannt hat oder irgendein noob hat die Seite gemeldet und sie wurde ohne Prüfung auf die Blacklist gesetzt.
-
The Following User Says Thank You to DMW007 For This Useful Post:
Gangstersheep (25.07.2012)
-
25.07.2012, 20:01 #6
- Registriert seit
- 26.10.2011
- Beiträge
- 1.195
- Blog Entries
- 2
Thanked 1.596 Times in 725 Posts
-
25.07.2012, 20:30 #7
- Registriert seit
- 15.11.2011
- Beiträge
- 6.081
- Blog Entries
- 5
Thanked 9.119 Times in 2.996 PostsAW: [TuT] Simple SQL-Injection am Beispiel von PHP
Ja ist ein selbst signiertes SSL-Zerifikat, daran kann es natürlich auch liegen.
Ist mir nicht aufgefallen weil ich das Hackit schon länger kenne und daher das Zerifikat schon vor Ewigkeiten mal Akzeptiert habe.
Man kann es aber auch ohne SSL aufrufen: RedTigers Hackit
Dementsprechend kann er ja mal testen, ob die Seite ohne SSL auch geblockt wird.
Ähnliche Themen
-
Movie-Vision.de SQL-Injection
Von Snees im Forum Internet und TechnikAntworten: 0Letzter Beitrag: 30.06.2013, 17:37 -
WordPress Theme gesucht (siehe Beispiel)
Von Devon im Forum Web-ApplicationsAntworten: 3Letzter Beitrag: 18.02.2013, 01:00 -
Simple Pic Bewerten
Von Make-Grafik im Forum ShowroomAntworten: 9Letzter Beitrag: 04.05.2012, 20:23 -
Erweitertes OOP-Beispiel
Von Snees im Forum PHPAntworten: 0Letzter Beitrag: 12.04.2012, 00:56
Stichworte
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.