PHP-commands in Adresszeile verhindern!

  • Wieder mal ein sehr unangenehmes Problem, zu dem ich auch nicht wirklich eine Lösung weiß :-/


    In meinen Weblogs hab ich eben sehr eigenartige Einträge gefunden. Da hat jemand eindeutig versucht, Daten aus unserem Webshop abzufragen.
    Ich hab im logfile jedenfalls tausende Zeilen in folgender Art gefunden:


    PHP
    shop_product.php?id=-999.9 UNION ALL SELECT (SELECT concat(0x7e,0x27,customer.paytype,0x27,0x7e) FROM `webshop`.customer LIMIT 0,1) ,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0x31303235343830303536,0


    Jemand hat also versucht, über die Adresszeile des Browsers Informationen aus der Datenbank abzufragen ..
    Warum bin ich draufgekommen? Wir hatten eine Bestellung, wo sich der Besteller plötzlich gemeldet hat, daß er die gar nicht aufgegeben hatte!


    Jetzt mach ich mir halt sorgen, daß irgendjemand über einen Fehler in PHP (oder in dem Webshop. Den hat vor Jahren mal irgendwer programmiert) an unsere Datenbank rankommt, und damit Schindluder betreibt. Einfach wäre es zu beheben, wenn ich solche SELECT oder andere PHP-Befehle in der Adresszeile einfach deaktivieren könnte!


    Hat dazu jemand einen Tipp?


    EDIT:
    Anscheinend hat da jemand versucht mit dem Tool Havij meine Datenbank zu knacken .. gibts da irgenwas mit dem ich meinen Server davor schützen kann?

  • Das ganze nennt sich "SQL Injection" und ist eine der weitverbreitetsten Sicherheitslücken in datenbankbasierten Web-Applikationen.


    http://en.wikipedia.org/wiki/SQL_injection


    Verhindern kann man die Sache relativ leicht, indem man Datenbank-Queries nicht über String-Concatenation zusammenbaut (wie das leider v.a. in alten Apps gern gemacht wurde), sondern bspw. Prepared Statements nutzt.


    Im Fall einer bestehenden Applikation mit solchen Lücken würde ich diese so schnell als möglich offline nehmen (v.a. wenn in der Datenbank potentiell sensible Daten liegen) und erst nach einer Prüfung & Überarbeitung aller Stellen, an denen Daten "unescaped" an die Datenbank gehen, wieder online stellen.

  • Interessante Geschichte !


    Martin wäre es per PHP und direkte eingabe auch möglich gewesen (vorausgesetzt die bekannte struktur) etwas zu bestellen ohne zu bezahlen ?


    chl diese Prepared Statements werden diese in einer Datei oder ähnliches hinterlegt oder programmiert man diese dirket in die Applikation mit ein ?


    bin nur etwas neugierig :D

  • Nein, bestellen ja, aber bezahlen wird IMMER von nem menschen überprüft .. insofern kriegt jemand, der nix zahlt auch keine ware :-)


    Na ja .. ich hab vorerst mal die ganze IP-Range des Hackers gesperrt (irgendwo in Vietnam .. also eh kein potentieller Kunde *g*) und den Programmierer des Webshops kontaktiert, damit der sich das mal in richtung Sicherheitslücken anschaut ..
    Außerdem hab ich das MySQL-Passwort geändert.


    Mal sehen, was draus wird.

  • Zitat

    Original von Trixter
    Prepared Statements werden diese in einer Datei oder ähnliches hinterlegt oder programmiert man diese dirket in die Applikation mit ein ?


    bin nur etwas neugierig :D


    Prepared Statements kannst du direkt in der Applikation spezifizieren, in PHP5 kann man dafür schön das mysqli Modul nutzen. Die Funktionsweise ähnelt dabei z.B. printf() sofern dir das was sagt...

  • Zitat

    Original von Martin
    Nein, bestellen ja, aber bezahlen wird IMMER von nem menschen überprüft .. insofern kriegt jemand, der nix zahlt auch keine ware :-)


    Na ja .. ich hab vorerst mal die ganze IP-Range des Hackers gesperrt (irgendwo in Vietnam .. also eh kein potentieller Kunde *g*) und den Programmierer des Webshops kontaktiert, damit der sich das mal in richtung Sicherheitslücken anschaut ..
    Außerdem hab ich das MySQL-Passwort geändert.


    Mal sehen, was draus wird.


    Naja, die IP-Range des Hackers zu sperren wird wohl nicht viel bringen, denn da warten schon andere, deren IP nicht gesperrt ist. Ich an deiner Stelle würde die Seite schnellst möglich offline nehmen und das Problem beheben. Denn ich gehe mal davon aus, dass in deiner Datenbank sehr sensible Daten gespeichert sind, wie z.b. Kontonummern, Kreditkartendaten, Adressdaten usw. .


    lg
    Stefan

  • Ja, ich hab die nächsten Tage jedenfalls ein genaues Aug auf die Logs ..
    Freitag kommt der Programmiere des Webshop, und soll sich die Sache mal ansehen. Sensible Daten sind keine in der Datenbank .. nur Namen, Mail-Adressen und Post-Adressen ..
    Die Kreditkarten-Infos liegen auf einem eigenen Server in einem geschützten File ..