|_|0|_|
|_|_|0|
|0|0|0|

Be-Paranoid.net

SQL-Injection

Orginal Version | Artikel editieren | Versionen anzeigen | Bottom
Letzte Änderung: 31.03.2008, 20:07

Inhaltsverzeichnis



Einführung Top



In letzter Zeit häufen sich die Meldungen über SQL-Injection Lücken in bekannte OpenSource Projekten. Viele Entwickler sind sich überhaupt nicht bewusst, dass die Strings, die sie dem SQL Query übergeben nicht unbedingt sicher sein müssen. Dieses Tutorial behandelt SQL-Injection in MySQL Datenbanken.

In MySQL-Queries werden oft irgendwelche Variablen (meistens Integer) übergeben, die entweder per URL, oder POST-Formular, oder GET-Formular übergeben werden. Diese Variablen können, wenn sie nicht ordentlich überprüft werden den query manipulieren.

Natürlich braucht man Kenntnisse über die Datenbank, damit man einen erfolgreichen SQL-Injection Angriff überhaupt durchführen kann, aber "security by obscurity" ist nicht die Technik die ich bevorzuge.

Angriffsmöglichkeiten von SQL-Injections Top



Hier sind einige Beispiele, was ein Angreifer durch SQL-Injection erreichen könnte:






Das sind natürlich nur ein paar Beispiele, der Kreativität ist praktisch keine Grenze gesetzt...

Szenarien Top



Hier sind einige Beispiele, die die unzureichende Überprüfung der Input-Variablen erläutern, und dem Angreifer Vorteile bringen:




Gegenmaßnahmen Top



Die wichtigste Verteidigung gegen Mysql-Injections ist das überprüfen der Eingangsvariablen. Des weiteren können Strings, die nicht escaped sind, wie im letzten Kapitel gezeigt, Probleme bereiten. Hier sind einige Maßnahmen gegen Mysql Injection aufgelistet:









Abfrageklasse Top



Da das sicherste Mitel gegen SQL-Injections Typkontrolle ist, basteln wir uns eine Klasse (Idee stammt von Hanse), die eine strenge Typenkontrolle macht:

Datei sec.inc:

Code:


<?php

class Sec
{
        function MakeMysqlSecure($Variable, $Type, $Min = 0, $Max = 10000)
        {
                switch($Type)
                {
                        case 'int':
                                settype($Variable, 'Integer');

                                if($Variable < $Min || $Variable > $Max)
                                        $Variable = 0;
                        break;

                        case 'string':
                                $Variable = mysql_real_escape_string($Variable);
                        break;

                        case 'float':
                                settype($Variable, 'float');

                                if($Variable < $Min || $Variable > $Max)
                                        $Variable = 0;
                        break; 

                        case 'bool':  
                                settype($Variable, 'boolean');
                        break;

                        default:
                                return 0;
                }

                return $Variable;
        }

        function MakeMysqlArraySecure($Variable, $Type, $Min = 0, $Max = 10000)
        {
                foreach ($Variable as $key => $value)
                        $Variable[$key] = Sec::MakeMysqlSecure($value ,$Type, $Min, $Max);

                return $Variable;
        }

        function Get($Variable, $GetType = 'Get', $Type = 'int', $Min = 0, $Max = 100000)
        {
                switch($GetType)
                {
                        case 'Post':
                                $Variable = $_POST[$Variable];
                        break;
                        case 'Get':
                                $Variable = $_GET[$Variable];
                        break;
                        default:
                                return 0;
                }

                $Variable = Sec::MakeMysqlSecure($Variable, $Type, $Min, $Max);

                return $Variable;
        }
}
?>



Eine einfache, zentrale Struktur führt oft zu einer besseren Sicherheit, hier sehen wir wie einfach die Klasse angewendet werden kann:

Code:


$ArticleID      = Sec::Get('articleid');
$Page           = Sec::Get('page');
$Blubbfish      = Sec::Get('name','Post','string');

$Test = 'sdfdsf1234';
Sec::MakeMysqlSecure($Test, 'int', 16, 100);



weiteres Beispiel:

Code:


$secure = new Sec();

$text1 = $secure->Get('text1','Post','string');
$text2 = $secure->Get('text2','Post','string');


Die Klasse ist natürlich noch nicht perfekt, und kann beliebig ausgebaut werden.

mod_security Top



Als zusätzliche Massnahme gegen SQL-Injection kann ModSecurity als Erweiterung für den Apache verwendet werden. Unter anderem werden MySQL Anweisungen aus dem Link gefiltert.

Weblinks Top







Ich meine es ist keine sogute Idee des hier so ungeschützt zu lassen da kann ja jeder Hanz Kunz i-was hinschreiben !!!

Orginal Version | Artikel editieren | Versionen anzeigen | Top
Letzte Änderung: 31.03.2008, 20:07