SQL Injection Diskussion zu "MySQL Rückgabewert inkorrekt"

tklustig

Erfahrenes Mitglied
Wie soll über die URL Leiste ein Query eingeschmuggelt werden können? Ich nehme prinzipell keine $_GET Parameter als Query-Anhang auf! Is' alles $_POST bzw. $_REQUEST
 

StormChaser

Mitglied
@tklustig: Ich hoffe, Du bist noch jung und hast ein starkes Herz, denn sonst könnte es dich aus dem Sessel pusten, wenn ich dir jetzt sage, dass $_POST-Daten gefaked werden können.
 

ComFreek

Mod | @comfreek
Moderator
ALLES, was extern herkommt, kann gefaked werden.
Und es hat nicht nur etwas mit Sicherheit zu tun: du läufst auch große Gefahr, invalide SQL Queries aufzubauen, wenn die Daten etwa Single Quotes oder gar Leerzeichen enthalten. Es ist einfach semantisch inkorrekt in einen SQL Query String Daten zu interpolieren. Befehle (das Query) und Daten achtlos zu mischen sollte man normalerweise nie tun. Das führt gerade dazu, dass Daten als Befehle missbraucht werden können. Ein Beispiel von Betriebssystemen, wie die Separation unterstützt wird: In Betriebssystemen werden Seiten von Prozessen (Speicherabschnitte vereinfacht gesagt), die Daten enthalten, auch so geflagged, dass sie *nicht* ausgeführt werden können. Andersherum werden Seiten, die ausfühbaren Code enthalten, auch als read-only geflagged.


Übrigens subsumiert $_REQUEST auch $_GET, von daher stimmt (deine sowieso fehlerbehaftete) Argumentation leider auch nicht.

PS: Damit deine originale Frage nicht untergeht, habe ich mal die Beiträge in ein neues Thema verschoben.
 
Zuletzt bearbeitet:

tklustig

Erfahrenes Mitglied
Ich bin wohl etwas begriffsstutzig. An einem Beispiel würde ich wohl besser kapieren, was ihr meint. Wenn ich als Abfrage nur $_POST nehme, wie könnte an dem von mir veröffentlichten Code eine SQL Injection herbeigeführt werden? Ich hab's probiert - was immer ich mittels ?=value versuche, einzuschmuggeln hat keinerlei Effekt auf den Datenbankserver. Im übrigen enthält diese Datenbank nur eine einzige Tabelle. Die Tabellen anderer Datenbanken auf dem Server entsprechen alle der dritten Normalform.
 

StormChaser

Mitglied
Aus deinem Code:

$sql = 'DELETE FROM temperaturs WHERE id=' . $_REQUEST["anzahlItems"];

Da Du die empfangenen Daten direkt für eine Datenbankabfrage einsetzt, wirst Du früher oder später, aber ganz sicher irgendwann jemanden einladen, Schadcode einzuschleusen.

Ein Beispiel, wie so etwas aussehen könnte, werde ich jetzt aber aus ziemlich bekannten Gründen hier nicht veröffentlichen. Allerdings dürften dazu einige allgemeine Infos zu finden sein, wenn man sich für die Sicherheit interessiert.

Als kleiner Merksatz:
Jede Benutzereingabe ist fehler- oder schadhaft, bis eine Prüfung das Gegenteil bewiesen hat.
 

ComFreek

Mod | @comfreek
Moderator
Ein Beispiel, wie so etwas aussehen könnte, werde ich jetzt aber aus ziemlich bekannten Gründen hier nicht veröffentlichen.
Warum? ;) Die Info gibt's sowieso zuhauf im Internet und ein System, dessen Sicherheit auf Unkenntnis von seiner Strukturm ist generell unsicher. ("Kerkhoff'sches Prinzip")

$_POST lässt sich halt nicht so einfach mit einem Browser bearbeiten. Entweder holst du dir ein Addon für deinen Browser (z. B. Postman) oder nutzt einfach sowas wie curl oder eine Programmiersprache mit Internetlib deiner Wahl.

Ich kann später mal ein konkretes Beispiel raussuchen.
 

StormChaser

Mitglied
Ich verstehe dich wohl falsch, oder willst Du ein Beispiel bringen, wie man eine SQL-Injection o. ä. per POST durchführt ?

Dass sich $_POST nicht so einfach im Browser bearbeiten lässt dürfte gerade die, die das wollen, nicht wirklich davon abhalten, ihr Unwesen zu treiben. Und nur wegen der paar, die das tatsächlich tun, macht man sich ja die Mühe, die Scripte so sicher wie möglich zu machen.
 

tklustig

Erfahrenes Mitglied
Ich möchte ein Beispiel, wie man meinen Code angreifen könnte. Ob über $_POST oder über $curl oder sonstwie ist irrelevant. Ich möchte mit meinen eigenen Augen sehen, dass jemand meine Querys manipulieren kann, egal wie...
P.S.: Der Code ist im übrigen online. Die IP wäre 77.20.7.167, der DNS Name wäre tklustig.ddns.net. Es wird nix verchlüsselt(http://). Wenn jemand nachweisen kann, dass er ungewollte Querys absetzten kann, nur zu. Ich habe ein Backup der Datenbank, die Records können gelöscht werden(was mit der Onlineversion regulär nicht funktioniert)
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
(was mit der Onlineversion regulär nicht funktioniert)
Das scheint eine serverseitige Sperre mit einer mir unbekannten Bedingung zu sein. Auch wenn total unsicherer Code hinter einer sicheren Sperre verankert ist, heißt das niemals, dass das System gut oder sicher ist. Durch Umbauten kann die anfängliche Sperre unbemerkt entfernt oder entkräftet werden. Und dein Skript bricht trotzdem mit einem Fehler ab, wenn Quotes Teil deiner Eingabe sind.

Ich möchte mit meinen eigenen Augen sehen, dass jemand meine Querys manipulieren kann, egal wie...
Aber wenn du uns nicht glaubst, kannst du ganz einfach nach "SQL Injection Example" googeln ;)

$sql = 'DELETE FROM temperaturs WHERE id=' . $_REQUEST["anzahlItems"];
Oder konkret: Rufe dein Skript mal mit folgendem Wert für anzahlItems auf:
Das wird in DELETE FROM temperaturs WHERE id=id resultieren, d.h. alles löschen. Alternativ könntest du auch beliebige SQL-Kommandos hinzufügen. Je nach Rechte des Benutzers kannst du so beliebige Dateien lesen, überschreiben usw.

oder willst Du ein Beispiel bringen, wie man eine SQL-Injection o. ä. per POST durchführt ?
Ja, das wollte ich.

Und nur wegen der paar, die das tatsächlich tun, macht man sich ja die Mühe, die Scripte so sicher wie möglich zu machen.
Ich möchte betonen, dass das Skript im verlinkten Thread nicht nur unsicher, sondern auch inkorrekt ist. Inkorrekt im dem Sinne, dass es eben abbricht, wenn die Eingabe Quotes o. Ä. enthält.

Übrigens empfiehlt es sich auch nicht eine öffentliche phpinfo() anzuzeigen.