- Offizieller Beitrag
Themenschwerpunkt Oktober/November 2005: SQL-Injection - die große Gefahr
Wie leicht es möglich sein kann zu Administratoren-Rechten zu kommen.
Folgende Themen werden behandelt
- Was ist eine SQL-Injection
- Wie entstehen solche Sicherheitslücken
- Was kann man durch solche Sicherheitslöcher an Schaden anrichten?
- technischer Hintergrund
Eine SQL Injection ist ein von mehreren Arten, um das Burning Board oder andere Open Source Produkte anzugreifen. Bei einer unsauberen Programmierung von Hacks kann unter Umständen das komplette Forum gefährdet sein.
Angenommen, ein Programmcode für eine neue Registration lautet:
mysql_query("INSERT INTO benutzer (isadmin,username,password) VALUES (0,'".$_POST['username']."','".$_POST['password']."')");
Bei einer Registration wird im Textfeld der ganz normale Benutzername eingegeben.
Bei Passwort allerdings benutzt der böswillige User folgende "SQL Injection":
xyz'),(1,'Username','xyz
Dieses Passwort würde zwar auch einen User-Namen anlegen, gleichzeitig jedoch auch einen Administrator-Namen, da hier die Variable 1 vergeben ist. Das Passwort wäre bekannt (xyz) und man könnte nun allerlei Späße treiben.
Durch die SQL Injection sähe die Abfrage nämlich so aus:
mysql_query("INSERT INTO benutzer (isadmin,username,password) VALUES (0,'username','xyz'),(1,'Username','xyz')");
So legt man unbekannt einen neuen Administrator an.
Man kann sich jedoch ganz einfach vor diesen Fällen schützen.
Beitragen können dazu die PHP -Funktionen addslashes() und intval()
addslashes = add slashes = Füge Backslashes hinzu
intval = integer value = Ganzzahl Wert
Das sähe in einem Programmcode so aus:
mysql_query("INSERT INTO benutzer (isadmin,username,password) VALUES (0,'".addslashes($_POST['username'])."','".addslashes($_POST['password'])."')");
Somit wird das Script unschädlich gemacht da addslashes zu jedem "' (Hochkomma)", "\" und "" (Anführungszeichen)" ein Backslash (\) voranstellt und die Datenbankabfrage somit umkehrt:
INSERT INTO benutzer (isadmin,username,password) VALUES (0,'Benutzername','xyz\'),(1,\'Username\',\'xyz')
Der Benutzer hätte dann das Passwort "xyz'),(1,'Username','xyz"
Die Funktion intval() verwandelt Zahlen in Ganzzahlen um. Die Funktion wird eher dazu gebraucht, wenn Integer Werte übertragen werden, z.B. Thread-IDs, etc.
Wie oben beschrieben, funktioniert das Ganze nur mit Open Source Produkten, bzw. den Produkten, bei welcher der Angreifer Einsicht auf den Quellcode hat (war beim Burning Board ja der Fall ist)
Ebenso anfällig können phpBB, PHP Nuke, PHP kit, etc. sein.
[B]weiterführende Links:
» Wikipedia zum Thema Passwörter
Autor: Dominik