SQL Injection

sd12

Legendäres Mitglied
Ich werde noch wahnsinnig.

Hab mir für eine neue App gute Vorsätze genommen und möchte MySQL Injection verhindern.

Ich krieg es mit einem "INSERT INTO" nicht hin.

Nun hab ich einen Verdacht...

Ist es möglich, dass die Gefahr von SQL Injection nur bei "SELECT" Abfragen besteht?

Wenn ja, hab ich 3 Stunden verblödet, wenn nein, wer kann mir ein Beispie machen?
 
Zum Lesen:

Datenbank-Architektur

Zu Sql-Injektionen Punkt 6. Man sieht: Auch gespeicherte Prozeduren können - fehlerhaft verwendet - Sql-Injektionen ermöglichen.

Und das ist befehlsunabhängig - jeder Sql-Befehl, der ohne Prüfung aus Nutzereingaben zusammengebaut wird, kann die letzte Aktion gewesen sein.

PS: Dabei werkele ich gerade auf meinem MS-SqlServer dick herum - und lese nix in Foren.
 
Erstmal überprüfen ob sich der Wert einer Variable, die du für das Statement verwendest, plausibel ist.

Dann PDO (PHP5) mit Prepared Statements benutzen.
 
CODE
$varname = mysql_real_escape_string( $_POST['varname'] );
mysql_query( "INSERT INTO tblname SET varname='$varname';" );

 
Ich habs mit einer Funktion gmacht, die ich mal irgendwo gefunden habe:

CODE
function quote_smart($value)
{
// stripslashes, falls nötig
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}

// quotieren, falls kein integer
if (!is_numeric($value)) {
$value = "" .mysql_real_escape_string($value). "";
}

return $value;
}



Ich hoffe das ist sicher, denn so ganz sicher bin ich mir nicht
biggrin.gif
 
QUOTE (Joel Janser @ Sa 22.4.2006, 10:07)
CODE
$varname = mysql_real_escape_string( $_POST['varname'] );
mysql_query( "INSERT INTO tblname SET varname='$varname';" );



Genau so hab ich es versucht...

Ich glaube einfach das ganze falsch zu verstehenen...

Wenn $varname als Inhalt "'\" hat was wird dann in die DB gschrieben?

Ich gehe davon aus, dass er "\'\\" in die DB schreiben soll...

...aber er schreibt "'\"...

Ist vielleicht liegt da mein Denkfehler?
 
QUOTE (Benedikt @ So 23.4.2006, 15:36)
QUOTE (Joel Janser @ Sa 22.4.2006, 10:07)
CODE
$varname = mysql_real_escape_string( $_POST['varname'] );
mysql_query( "INSERT INTO tblname SET varname='$varname';" );



Genau so hab ich es versucht...

Ich glaube einfach das ganze falsch zu verstehenen...

Wenn $varname als Inhalt "'\" hat was wird dann in die DB gschrieben?

Ich gehe davon aus, dass er "\'\\" in die DB schreiben soll...

...aber er schreibt "'\"...

Ist vielleicht liegt da mein Denkfehler?

Ja, dein denkfehler...
rolleyes.gif

\" muss ja nicht escaped werden: ist es ja schon. Und 2x escapen würde nichts bringen, oder?
 
QUOTE (Nils Caspar @ So 23.4.2006, 16:40) Ja, dein denkfehler...
rolleyes.gif

\" muss ja nicht escaped werden: ist es ja schon. Und 2x escapen würde nichts bringen, oder?

Aber dasselbe passiert z.B. mit 'INSERT

da müsste doch
\'INSERT in die DB...
 
Du musst auch schauen, ob die Magic Quotes [1] aktiv sind oder nicht (Standardeinstellung: aktiv), wenn diese aktiv sind wird automatisch ein addslashes [2] auf den übergebenen Variablen durchgeführt.

Wenn also Magic Quotes aktiv sind, musst du erst stripslashes ausführen und dann erst mysql_real_escape_string [3]. Die Funktion addslashes und mysql_real_escape_string sind nicht identisch, da mysql_real_escape_string einige Zeichen mehr escaped als addslashes.


Letztendlich ist es aber bei SQL-Injection nicht unbedingt mit einer solchen Funktion alleine getan. [4] Hier kommt es auf das entsprechende Hintergrundwissen und die eigene Erfahrung an. Von enormen Vorteil ist es natürlich, wenn man entweder die Programmiersprache sehr gut kennt, oder zumindestens ein sehr gutes Nachschlagewerk kennt und richtig Programmieren gelernt hat (, damit meine ich, dass man die Fähigkeit für ein entsprechend logisches Denken besitzt bzw. entwickelt hat und ein grundlegenes Wissen über die Grundlagen der Programmierung hat - Kontrollstruktoren, Schleifen, Bit-Operationen usw).



MfG Sascha Ahlers
 
QUOTE Wenn $varname als Inhalt "'\" hat was wird dann in die DB gschrieben?


Es ist völlig uninteressant, was in die Datenbank geschrieben wird. Entscheidend ist, daß die Befehlslogik (egal, ob Select oder Insert) nicht verändert und kein eigener Befehl angehängt wird.
 
QUOTE (Malte Landwehr @ So 23.4.2006, 17:28)Vielleicht würde dir auch der CrackerTracker von CBACK weiterhelfen?
Der verhindert unteranderem SQL-Injections.


@Malte Landwehr: Soll das ein Scherz sein?

Was soll an diesem Code


CODE $cracktrack = $_SERVER['QUERY_STRING'];
$wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20',
'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm',
'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20',
'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite', '%20like', 'like%20',
'$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id',
'/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python',
'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '.pl', '/usr/X11R6/bin/xterm', 'lsof%20',
'/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
'file\://', 'window.open', '<script>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe',
'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
'<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=');

$checkworm = str_replace($wormprotector, '*', $cracktrack);

if ($cracktrack != $checkworm)
{
$cremotead = $_SERVER['REMOTE_ADDR'];
$cuseragent = $_SERVER['HTTP_USER_AGENT'];

die( "Attack detected! <br /><br /><b>Dieser Angriff wurde erkannt und blockiert:</b><br />$cremotead - $cuseragent" );
}


eine Sql-Injektion verhindern? Das ist ein bloßes Filtern nach einigen typischen Begriffen. Abgesehen davon kann man Sql-Injektionen auch per POST-Daten einschleusen.
 
QUOTE (jAuer @ So 23.4.2006, 17:40) @Malte Landwehr: Soll das ein Scherz sein?

Was soll an diesem Code eine Sql-Injektion verhindern? Das ist ein bloßes Filtern nach einigen typischen Begriffen. Abgesehen davon kann man Sql-Injektionen auch per POST-Daten einschleusen.

Ich habe von Programmieren ungefähr soviel Ahnung wie eine Giraffe vom Autofahren.
Aber in der Beschreibung von dem Programm steht halt "bringt das Schutzsystem vor SQL Injections".
Und die phpBB-Security Programme des Autors sind recht weit vervreitet. Da habe ich in meinem jugendlichen Leichtsinn eben angenommen, dass auch drinn ist was drauf steht.
 
QUOTE (Malte Landwehr @ So 23.4.2006, 18:28)Aber in der Beschreibung von dem Programm steht halt "bringt das Schutzsystem vor SQL Injections".

Ja, das hatte ich auch gelesen. Na ja, der Verfasser hat wohl in Marketing eine 1 und in Programmieren eine 6, bei mir ist das so in etwa umgekehrt.


QUOTE Und die phpBB-Security Programme des Autors sind recht weit vervreitet.


Die meisten phpBB-Verwender dürften ziemlich wenig Ahnung haben, also glauben sie das alles eben und meinen, sich damit etwas gutes zu tun. Ich weiß schon, weshalb ich oben einen Link zu einem eigenen Artikel gepostet habe.

Und bei einem Angebot wie dem meinigen, wo sich Nutzer über den Browser eigene Sql-Abfragen (einschließlich Unterabfragen und Verwendung von Textkonstanten - 'test') erstellen dürfen, darf ich natürlich nicht alle Sql-Schlüsselwörter verbieten.

Richtig interessant wird das Problem der Injektionen erst, wenn Nutzer Unicode-Zeichen verwenden und dann etwas durchschlüpft - etwa ein 'Insert' mit einem türkischen İ (İ = 'Latin Capital Letter I with dot above').
 
QUOTE (jAuer @ So 23.4.2006, 19:43) Richtig interessant wird das Problem der Injektionen erst, wenn Nutzer Unicode-Zeichen verwenden und dann etwas durchschlüpft - etwa ein 'Insert' mit einem türkischen İ (İ = 'Latin Capital Letter I with dot above').

zum guten Glück geht es nicht um solch sensitive Daten, welche einen solchen Aufwand rechtfertigen würden...

übrigens:
magic_quotes_gpc Off Off

Meine Frage:
Fängt mein oben geposteter Schnipsel die wichtigsten Injektionen ab?
 
Bei Sql-Injektionen ist es wichtig, daß man das Prinzip versteht und seine eigene Anwendung dann auf alle Stellen abklopft, wo Benutzereingaben verarbeitet werden.

QUOTE (Benedikt @ So 23.4.2006, 20:03)zum guten Glück geht es nicht um solch sensitive Daten, welche einen solchen Aufwand rechtfertigen würden...


Das Argument ist strukturell falsch: Eine gehackte Anwendung läßt sich vielfach mißbrauchen, bsp. als Mailspamschleuder. Ein Server im Web, auf dem man anonym tun und lassen kann, was man will und für den offiziell jemand anderes verantwortlich ist ... ist doch wunderbar - da muß man sich nicht für irgendwelche Daten auf diesem Server interessieren. Und wenn jemand aus dem Ausland den Server knackt, benötigt er keinerlei Deutschkenntnis, um die Daten vielleicht lesen zu können.


QUOTE (Benedikt @ So 23.4.2006, 20:03)Fängt mein oben geposteter Schnipsel die wichtigsten Injektionen ab?


Keine Ahnung, ich verwende kein PHP und weiß deshalb nicht, was die obige Funktion macht. Und Zahlen muß man ohnehin gesondert behandeln, auch da lassen sich Texte anfügen.
 
Zurück
Oben