Mehrere mySQL Befehle per mysql_query()?

ddhb

Mitglied
Hallo!

Ist es eigentlich möglich per mysql_query() mehrer mySQL Befehle an die Datenbank zu senden?
Also soetwas wie folgendes
PHP:
mysql_query("SELECT name FROM table; UPDATE table SET name='ddhb'");

Denn ich habe mich etwas mit SQL-Injections beschäftigt und soetwas ähnliches wie das Beispiel 27-2 von http://de.php.net/manual/de/security.database.sql-injection.php auf die Beine gestellt. allerdings funktioniert das Beispiel bei mir nicht, da ich einen SQL Error erhalte wenn ich mein obriges Beispiel teste.

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '; UPDATE table SET name='ddhb'' at line 1
 
Ist es eigentlich möglich per mysql_query() mehrer mySQL Befehle an die Datenbank zu senden?
Nein, mit einer Abfrage AFAIK nicht.
Also soetwas wie folgendes
PHP:
mysql_query("SELECT name FROM table; UPDATE table SET name='ddhb'");
Warum nicht einfach so:
PHP:
$res1 = mysql_query("SELECT name FROM table");
mysql_free_result($res1);
$res2 =mysql_query("UPDATE table SET name='ddhb'");
mysql_free_result($res2)
 
Weil ich über eine SQL-Injection die ich auf meiner Homepage habe, eben diese einfache SELECT Anweisung, eine UPDATE Anweisung einfügen möchte.

Du musst dir vorstellen das ich keinen Zugriff auf die PHP Datei habe, sondern nur eine Abfrage wie diese
PHP:
SELECT name FROM ddhb WHERE name='Externe Variable'
Und über die Externe Variable würde ich jetzt gerne zu Testzwecken eine UPDATE Anweisung machen, damit ich per SQL-Injection die Datenbank ändern kann.
 
Hallo!
Nein, mit einer Abfrage AFAIK nicht.
Wie kommst Du zu dieser Erkenntnis?
Das Stichwort SQL-Injection ist schon gefallen. ;)
In der Reihenfolge schlägt aber die Abfrage (SELECT) fehl, da nur auf den letzten Rückgabewert zugegriffen werden kann.
Wenn also zuerst UPDATE und dann SELECT ausgeführt wird, kann der Inhalt der Tabelle auch ausgegeben werden.
Ob das UPDATE allerdings erfolgreich war, kann nicht festgestellt werden.
Es sei denn man führt anschliessend ein SELECT durch und überprüft die Daten.

@ddhb, ich denke Du wirst hier keine "Anleitung" dazu bekommen wie Du eine SQL-Injection durchführst.
Schliesslich lässt es sich nicht überprüfen ob die Datenbank wirklich Dir gehört.

Gruss Dr Dau
 
Ähm nur so ne Frage, wenn es sich um eine MySQL-Datenbank handelt ist es doch eh nicht möglich eine SQL-Injection zu machen, weil meines Wissens nach diese nur einen SQL-Befehl abarbeiten und der Zweite wird verworfen.

Bitte verbessert mich, wenn ich mich täusche!

Gruß.
 
Bitte verbessert mich, wenn ich mich täusche!
Du täuscht Dich..... siehe meine vorherige Erklärung. ;)
Wenn MySQL den 2. SQL Befehl verwerfen würde, dann bräuchte es ganz sicher nicht die Funktion mysql_real_escape_string() geben..... denn diese ist ja dazu da, um zusätzlich eingeschläuste Querys (z.b. über die URL oder ein Formular) "unschädlich" zu machen.
 
Hallo!
Wie kommst Du zu dieser Erkenntnis?
Das Stichwort SQL-Injection ist schon gefallen. ;)
In der Reihenfolge schlägt aber die Abfrage (SELECT) fehl, da nur auf den letzten Rückgabewert zugegriffen werden kann.
Wenn also zuerst UPDATE und dann SELECT ausgeführt wird, kann der Inhalt der Tabelle auch ausgegeben werden.
Ob das UPDATE allerdings erfolgreich war, kann nicht festgestellt werden.
Es sei denn man führt anschliessend ein SELECT durch und überprüft die Daten.

@ddhb, ich denke Du wirst hier keine "Anleitung" dazu bekommen wie Du eine SQL-Injection durchführst.
Schliesslich lässt es sich nicht überprüfen ob die Datenbank wirklich Dir gehört.

Gruss Dr Dau
Also würde das Beispiel auf php.net auch nicht funktionieren? Denn dort wird danach ebenfalls eine UPDATE Anweisung gestartet.

Ich will ledeglich probieren wie sich eine ungeschützte Variable auswirken kann. Aber soetwas funktioniert ja dann wohl doch nicht, oder täusche ich mich da?
 
so ne sql injection is doch sinnlos. Machs doch einfach so:

mal auf meiner Clanpage:
http://mythclan.my.funpic.de/index....assword,1,1,1 from webs_user where userID=1/*

hohl dir die md5 hash (des 32 zeichen Teil)
geh auf dc3.dl.am => Tools => MD5-Cracker => tipp die Hash ein und lass sie cracken.

logg dich mit dem admin account ein (meist userID 1) und hohl dir ein db backup. Ändere es und lad es mit dem admin account hoch.

http://mythclan.my.funpic.de/admin/database.php?action=write&userID=1

für DB backup
 
Hallo,

Du täuscht Dich..... siehe meine vorherige Erklärung. ;)
Wenn MySQL den 2. SQL Befehl verwerfen würde, dann bräuchte es ganz sicher nicht die Funktion mysql_real_escape_string() geben..... denn diese ist ja dazu da, um zusätzlich eingeschläuste Querys (z.b. über die URL oder ein Formular) "unschädlich" zu machen.
Nein, du täuschst dich. [phpf]mysql_real_escape_string[/phpf] dient nicht dazu, das Einfügen zusätzlicher Anfragen zu unterbinden. Vielmehr kann man mit dieser Funktion verhindern, dass die Anfrage ungewollt modifiziert wird.

[phpf]mysql_query[/phpf] kann tatsächlich nur eine einzige Anfrage abarbeiten (inkl. zugehöriger Unterabfragen natürlich). So steht's ja auch im Handbuch (Hervorhebung von mir):
http://de.php.net/manual/de/function.mysql-query.php hat gesagt.:
mysql_query() sendet eine Anfrage an die zur Zeit aktiven Datenbank, […]

Grüße,
Matthias
 
Zurück