Seite 1 von 2

in mysql abfrage befehle einschleusen?

Verfasst: 06.04.2006 16:04
von mgutt
ich habe mal gelesen, dass wenn man seine formulardaten nicht richtig schützt, bevor sie in die mysql abfrage kommen, dann könnte man in der abfrage einen falschen code ausführen.

z.b. wenn man einen passwortschutz hat, könnte man die id des users mit "OR ..." füllen um so ohne passwort die seite sehen zu können.

das stört mich nur bedingt, aber kann man auf diese art auch lösch befehle ausführen? also in einem select dann noch einen alter oder drop befehl? das geht doch nicht?!

wenn doch, wie sollte man ids oder namensfelder genau filtern vor der übergabe an die datenbank?

Verfasst: 06.04.2006 16:10
von larsneo
bei den klassischen JOIN exploits in mysql>4 wird in der tat 'nur' das SELECT auf weitere felder/tabellen ausgeweitet. in verbindung mit beschreibbaren verzeichnissen kann sich daraus aber ein 'lustiges' exploit durch gepipte ausgabe von db-inhalten (respektive ein remote code upload) ergeben.
nebenbei kann man durch blind sql natürlich auch die user-db etc auslesen um an kennwörter etc. zu kommen.

generell kann aber jedes sql-statement das ungeprüft variablen aus dem GPC nutzt mißbraucht werden, um schadcode einzuschleusen - bei SELECTS genauso wie bei INSERT und DELETE...

wenn es dich aber schon nicht stört, dass durch fehlende/fehlerhafte input validierung daten ausgelesen werden können, macht das den kohl auch nicht mehr fett :roll:

Verfasst: 06.04.2006 16:20
von mgutt
mir geht es nur darum, dass man nicht nachher in einen select befehl eine drop oder alter unterbringen kann um die daten zu löschen.

wenn derjenige nur daten sieht ist mir das wurscht, da für dieses projekt keinen wichtigen daten ausgelesen werden können.

als beispiel:

Code: Alles auswählen

$sql = "SELECT * FROM tabelle WHERE id=$id";
und wenn ich $id nicht schütze, dass dann nicht irgendwas in dieser richtung gemacht werden kann:

Code: Alles auswählen

$sql = "SELECT * FROM tabelle WHERE id=1"; $sql="DROP DATABASE datenbank";
also dass man die variable mit dem füllt:

Code: Alles auswählen

1"; $sql="DROP DATABASE datenbank
ich will es jetzt nicht testen, aber könnte das passieren?

Verfasst: 06.04.2006 17:00
von fanrpg
Also das ist schon möglich zum Beispiel so:

Code: Alles auswählen

$sql = "SELECT * FROM tabelle WHERE id=$id";
In $id könnte er so alles möglich einschleuse z.B

Code: Alles auswählen

$sql = "SELECT * FROM tabelle WHERE id= 0 OR 1=1; DROP TABLE tabelle --";
Das reicht schon um was zu löschen das geht ohne Probleme hilfreich dagegen wäre
mysql_real_escape_string() bzw. mysql_escape_string().
Oder man bau sich das halt nach..

Verfasst: 06.04.2006 17:24
von mgutt
ich kann doch aber id einfach mit "intval" prüfen oder?

und wenn nicht intval, dann fehler oder so. das ist glaube ich auch der weg, der hier bei phpbb genutzt wird. oder prüft der hier immer alle variable beziehungsweise "escaped" sie?

Verfasst: 06.04.2006 17:27
von fanrpg
intval reicht an sich das macht alles zum typ integer und daher sind das Zahlen intval reicht fuer zahlen vollkommen.

0; SELECT *...
Würde zu einer einfachen 0

So als Beispiel aber alles andere ausser Zahlen escaped phpBB normalerweise schön und gut.

Verfasst: 06.04.2006 17:42
von mgutt
Weißt Du zufällig wo phpBB das macht? Ich denke da gibts eine Funktion für, dann kann ich mir da was abschauen.

Verfasst: 06.04.2006 17:57
von fanrpg

Code: Alles auswählen

str_replace("\'", "''", $sql);
#

und s. common.php nach

Code: Alles auswählen

//
// addslashes to vars if magic_quotes_gpc is off
// this is a security precaution to prevent someone
// trying to break out of a SQL statement.
//

Verfasst: 06.04.2006 18:30
von S2B
fanrpg hat geschrieben:Also das ist schon möglich zum Beispiel so:

Code: Alles auswählen

$sql = "SELECT * FROM tabelle WHERE id=$id";
In $id könnte er so alles möglich einschleuse z.B

Code: Alles auswählen

$sql = "SELECT * FROM tabelle WHERE id= 0 OR 1=1; DROP TABLE tabelle --";
Das reicht schon um was zu löschen das geht ohne Probleme [...]
Ich dachte immer, das wäre nicht möglich, weil per mysql_query() nur ein Query ausgeführt werden kann!?

Verfasst: 06.04.2006 18:43
von fanrpg
Kommt auf dem Server an, ich hatte mal einen da konnte ich auch problemlos 10 Querys in einem Befehl ausführen auf anderen wiederum nicht.