Frage zu SQL Injections

port29

deus.Server
Hallo Leute,

ein Programmierer hat folgendes in seinem Quellcode stehen:

Code:
$game = $HTTP_POST_VARS['game'];
$result = $DB->query('update gamelist set lastping = '.$time.' where creator = "'.$game.'"');

Wenn ich das richtig sehe, dann ist das Query doch eine potentielle Sicherheitslücke, da der gesamte Input ungeprüft an den SQL Server geschickt wird. Ich muss zugeben, ich habe in meiner Praxis so etwas noch nie gemacht, aber die Theorie ist doch die, dass ich einfach aus einem Query zwei mache.

Code:
curl -d "command=state&game=%22 ; drop table ss;--"  http://xxx/battle/api.php

Ich habe auf dem Server mal zwischenzeitlich mal ein echo des ganzen Strings eingefügt und habe gesehen, dass vor dem von mir eingefügten Anführungszeichen (%22) ein Backslash steht. Ich kann mir aber nicht vorstellen, dass es trotzdem keine Möglichkeit für eine Injection gibt, oder?
 
Entscheident ist, wurden die Variablen innerhalb des querys zuvor irgendwo via mysql_real_escape_string oder sinngemäß gleichem bearbeitet...
Falls ja dann ist die ganze geschichte schon relativ sicher, womöglich gibt es irgendwo noch ne lücke.
Man kann ja schließlich nie sagen das etwas 100%ig sicher ist....
 
Nein, das wurden sie nicht. Aber dennoch kriege ich keine SQL Injection durch.

Das Problem ist, ich kann nicht einfach nur sagen: Dududu böser Programmierer, da muss die Eingabe zunächst durch mysql_escape_string durch, bevor die an den MySQL Server durchgereicht wird.

Ich muss es auch an einem Praxisbeispiel vorführen. Und das klappt leider nicht.
 
Das liegt an der Arbeitsweise von [phpf]mysql_query[/phpf]. Es wird immer nur EIN Query gesendet, auch wenn z. B. eine SQL Injektion versucht mehrere einzuschleusen.

Es geht eher um die Veränderung der Logik des Query.

Simples Beispiel was glaube ich auch nicht so funktioniert (leider keine Testmöglichkeit vorhanden).

PHP:
$abfrage = "SELECT spalte1
            FROM tabelle
            WHERE spalte2 = '".$_POST['spalte2Wert']."'";
$query = mysql_query($abfrage) or die("Datenbankabfrage ist fehlgeschlagen!");

Würden wir jetzt hier folgendes per Formular senden:

Sähe das Query plötzlich so aus:

SQL:
SELECT spalte1
FROM tabelle
WHERE spalte2 = 'abc' OR 1 = '1'
Somit wäre das Query IMMER wahr. Bei einem Login könnte das fatal sein.
 
Hi,
das funktioniert schon, ich habe das mal bei mir Lokal getestet:
SQL:
SELECT *
FROM benutzer
WHERE benutzername = 'abc' OR 1 = '1'
liefert alle Datensätze.
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich das richtig sehe, würde Dein Skript beim Injection-Angriff von Felix sämtliche lastping-Einträge überschreiben - was als Praxisbeispiel ausreichen muss. :eek:
 
Ja, aber leider funktioniert auch das nicht:

Code:
core battle # curl -d "command=state&game=sss%22 or 1=1 ;--"  http://xxxxx/api.php

update gamelist set lastping =  where creator = "sss\" or 1=1 ;--"

Es wird irgendwie immer ein Slash vor das Anführungszeichen gesetzt..
 
Das liegt an der Eingabe über die Kommandozeile. Wenn Du Deine Daten über ein HTML-Formular schickst, funktionierts.
 
Das funktioniert leider auch nicht:

Ich verwende jetzt folgenden Code hier:

Code:
<input type="hidden" name="game" value='sss" or 1=1 ; select "'>
<input type="hidden" name="command" value="state">

Wenn ich ein echo auf dem Server mit dem Query ausführe, dann bekomme ich folgendes zurück:

Code:
update gamelist set lastping = 1214582338 where creator = "sss\" or 1=1 ; select \""
 
Keine Ahnung ob das jetzt weiter hilft...
PHP:
        if(get_magic_quotes_gpc()){
            $_POST = array_map("addslashes", $_POST);
        }
 
Zurück