„SQL Injection“ – Versionsunterschied
Erscheinungsbild
[ungesichtete Version] | [ungesichtete Version] |
Inhalt gelöscht Inhalt hinzugefügt
Zwobot (Diskussion | Beiträge) K Head - Bot-unterstützte Begriffsklärung: Java |
redirect auf SQL-Injektion |
||
Zeile 1: | Zeile 1: | ||
#REDIRECT [[SQL-Injektion]] |
|||
'''SQL Injection''' (zu deutsch deutsch ''SQL Injektion'') bezeichnet das Ausnutzen einer [[Computersicherheit]]s-Lücke. Der Angreifer versucht [[SQL]] Abfragen zu manipulieren. Hierzu wird über die Applikation, die den Zugriff auf die [[Datenbank]] bereitstellt, [[SQL]] Statments einzufügen. |
|||
Oft zu finden sind [[SQL]] Injection Lücken in [[CGI]] Scripten, aber auch Programme die andere Daten, etwa Webseiteninhalte oder [[E-Mail]]s in SQL Datenbanken eintragen sind anfällig. Es wird versucht, weitere SQL Anforderungen einzuschleußen oder die Abfragen so zu manipulieren, dass man zusätzliche Daten erhält. Manche Datenbanksysteme bieten auch die Möglichkeit Zugriff auf eine Shell zu erhalten, womit der ganze Server kompromitierbar wird. |
|||
SQL Injection Bugs treten auf, wenn eine Applikation SQL Abfragen an den Server weiterreicht, ohne benutzerveränderbare [[Parameter]] mit [[Fluchtzeichen]] zu versehen. So sollten z.B. die Zeichen ' ; " durch \' \; \" ersetzt werden. |
|||
== Beispiele == |
|||
Auf einem [[Webserver]] findet sich ein Script zum Anzeigen von Artikeln: |
|||
http://webserver/cgi-bin/find.cgi?ID=42 |
|||
Dieses Script führt folgende SQL Abfrage aus: |
|||
SELECT text FROM WHERE artikel ID=42 |
|||
Ruft nun ein Angreifer folgende [[URL]] ab |
|||
http://webserver/find.cgi?ID=42;UPDATE%20USER%20SET%20TYPE="admin"%20WHERE%20ID=23 |
|||
Führt das Script zwei Anweisungen aus: |
|||
SELECT text FROM artikel WHERE ID=42; UPDATE user set type="admin" where id=23 |
|||
SQL Injection kann leicht durch bereits vorhandene Funktion verhindert werden. In [[Java (Programmiersprache)|Java]] wird zu diesem Zweck die ''PreparedStatement'' Klasse verwendet. |
|||
Anstatt |
|||
Connection con = (acquire Connection) |
|||
Statement stmt = con.createStatement(); |
|||
ResultSet rset = stmt.executeQuery("SELECT * FROM users WHERE name = '" + userName + "';"); |
|||
sollte folgendes verwendet werden |
|||
Connection con = (acquire Connection) |
|||
PreparedStatement pstmt = con.prepareStatement("SELECT * FROM users WHERE name = ?"); |
|||
pstmt.setString(1, userName); |
|||
ResultSet rset = stmt.executeQuery(); |
|||
In [[PHP]] wird zu diesem Zweck die Funktion [http://www.php-homepage.de/manual/function.mysql-escape-string.php mysql_escape_string()] verwendet. |
|||
Anstatt |
|||
$abfrage = "SELECT loginname, password FROM users WHERE loginname = '".$_POST['loginname']."'"; |
|||
$query = @mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!"); |
|||
sollte folgendes verwendet werden |
|||
$abfrage = "SELECT loginname, password, rights FROM members WHERE loginname = '".mysql_escape_string($_POST['loginname'])."'"; |
|||
$query = @mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!"); |
|||
''Siehe auch'' [[Cross-Site Scripting]] |
|||
== Weblinks == |
|||
* [http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf Beginning SQL Injection Attacks] |
|||
* [http://www.derkeiler.com/Mailing-Lists/securityfocus/secprog/2001-07/0001.html Abusing Poor Programming Techniques in Webserver Scripts via SQL Injection] |
|||
* [http://www.nextgenss.com/papers/advanced_sql_injection.pdf Advanced SQL Injection Attacks] |
|||
[[en:SQL Injection]] |
Version vom 12. Juli 2004, 12:40 Uhr
Weiterleitung nach: