register_globals = Off
Marco
- webserver
hallo,
ich habe ein script, ein witzscript. womit meine user witze eintragen können und ich natürlich auch.
mein problem ist dass das script nur mit register_globals = On funkioniert. und bei mir ist register_globals auf Off.
Also wollte ich das script umschreiben. Damit es mit register_globals = Off funkioniert. da ich aber überhaupt keine kenntnisse darin habe. habe ich erstmal versucht mich ein bisschen schlau zumachen. über turoials, google, beispiele usw. versuche das jetzt seid einer woche. aber ich verstehe das einfach nicht. ich bin am verzweifeln. könnte mein pc aus dem fensterschmeißen.
man hört immer lies diese seite oder die usw. aber ich werde daraus überhaupt nicht schlau. ich hoffe ihr könnt mir ein bisschen zur seite stehn.
erstmal hier ist das original script.(ohne veränderungen)
http://www.send-sms-4-free.de/whwitzeportal.zip
hier ist die index.php die ich versucht habe anzupassen ohne erfolg.
http://www.send-sms-4-free.de/bla/index.php
ich hoffe jemand hat mal kurz zeit um sich das anzugucken. ich denke mal das auch bestimmt die admin.php angepasst werden muss oder?
ich bin die ganze nacht on. habe morgen frei stehe euch für imformation zur verfügung. vielen dank für eure große hilfe
PS: wieso gibt es nur diese sche... hacker. ohne die könnte ich register_globals auf on stellen. haben die nichts anderes zutun ausser uns zu nerven.
ich wünsche allen noch einen wunderschönen abend
mfg Marco
Hi,
hatte ich auch gemacht bevor der Provider auf Off geschaltet hat
Habe bei mir das ganz oben eingebaut.
if(!empty($_GET)) extract($_GET);
if(!empty($_POST)) extract($_POST);
probier mal ob es klappt
hallo,
ich habe ein script, ein witzscript. womit meine user witze eintragen können und ich natürlich auch.
mein problem ist dass das script nur mit register_globals = On funkioniert. und bei mir ist register_globals auf Off.Also wollte ich das script umschreiben. Damit es mit register_globals = Off funkioniert. da ich aber überhaupt keine kenntnisse darin habe. habe ich erstmal versucht mich ein bisschen schlau zumachen. über turoials, google, beispiele usw. versuche das jetzt seid einer woche. aber ich verstehe das einfach nicht. ich bin am verzweifeln. könnte mein pc aus dem fensterschmeißen.
man hört immer lies diese seite oder die usw. aber ich werde daraus überhaupt nicht schlau. ich hoffe ihr könnt mir ein bisschen zur seite stehn.
erstmal hier ist das original script.(ohne veränderungen)
http://www.send-sms-4-free.de/whwitzeportal.zip
hier ist die index.php die ich versucht habe anzupassen ohne erfolg.
http://www.send-sms-4-free.de/bla/index.php
ich hoffe jemand hat mal kurz zeit um sich das anzugucken. ich denke mal das auch bestimmt die admin.php angepasst werden muss oder?
ich bin die ganze nacht on. habe morgen frei stehe euch für imformation zur verfügung. vielen dank für eure große hilfe
PS: wieso gibt es nur diese sche... hacker. ohne die könnte ich register_globals auf on stellen. haben die nichts anderes zutun ausser uns zu nerven.
ich wünsche allen noch einen wunderschönen abend
mfg Marco
Hallo,
if(!empty($_GET)) extract($_GET);
if(!empty($_POST)) extract($_POST);
das klapp nicht. er zeigt mir zwar die startseite an(index.php). aber die ganzen links funkionieren nicht.
kann auf auf die links klicken, aber er öffnet immer wieder die startseite.
mfg maeggi
hallo
puhhhhhhh soviele lücken, dann sind da bestimmt noch mehr drin.
SCHADE und ich fand das script so toll. dann werde ich mir wohl ein neues script suchen müssen. *treurig*
auf jedenfall vielen dank für eure hilfe.
falls ihr vieleicht so ein ähnliches script kennt. was so aufgebaut ist. dann immer her damit
wünsche euch noch einen wunderschönen abend
mfg marco
echo $begrüßung;
hatte ich auch gemacht bevor der Provider auf Off geschaltet hat
Habe bei mir das ganz oben eingebaut.if(!empty($_GET)) extract($_GET);
if(!empty($_POST)) extract($_POST);
Das ist keine besonders gute Idee, wird doch damit das Sicherheitsbestreben des Providers im Allgemeinen konterkarriert.
Das Feature register_globals und Funktionen mit ähnlicher Wirkung kann man aus sicherheitstechnischer Sicht nur dann ungestraft einsetzen, wenn man eins der sonst gern von PHP-Anfängern vernachlässigten Grundprinzipien des Programmierens beachtet: Jede Variable ist vor ihrer Erstverwendung mit einem definierten Wert zu initialisieren. Das muss so erfolgen, dass auch durch bedingte Programmschritte diese Initialisierung nicht vergessen wird. Ein während der Entwicklung auf E_ALL gestelltes error_reporting hilft dabei, indem es Hinweise bei der Verwendung nicht initialisierter Variablen ausgibt.
echo "$verabschiedung $name";
Hi Marco,
Ein ernst gemeinter Tipp: Finger weg von diesem Script!! Es ist gemeingefährlich!
Mal ein paar Beispiele aus dem Quellcode:
eval("\$tpl->out(\"".$tpl->get("index")."\");");
eval("\$insert_bit .= \"".$tpl->get("insert_bit")."\";");
Dort wird eval() als Templatesystem (zur Ersetzung der Variablen durch Inhalte) genutzt. Dies birgt insofern Gefahren, als hier fremder Code eingeschleust werden könnte (über das Template, als auch direkt über globale Variablen in eval()) und Fehler im Template das ganze System lahmlegen können.
Anderes Beispiel:
if($katid2 == "") {
// [...]
exit;
}
// [...]
$rows = mysql_query("SELECT * FROM ".$prefix."log where kat = $katid2 && free = 0");
Die Variable $prefix wird in der config.php gesetzt, die ist nicht das Problem (auch wenn man für solch einen Fall unbedingt eine Konstante verwenden sollte), aber die Variable $katid2 wird dank Register-Globals auf $_GET['katid2'] gesetzt und im Programm nirgendwo auf gültige Werte geprüft, geschweige denn für den SQL-String entsprechend escaped.
Was das heißt? Dass das ein dickes Sicherheitsloch ist, über welches man nach belieben an deiner Datenbank rumspielen (Daten auslesen, manipulieren, löschen) kann.
Übrigens ist die Programmierung alles andere als konsequent. So sieht man an obigem SQL-Query z.B. schön, dass teilweise Variablen in doppelte Anführungszeichen gesetzt werden (spricht prinzipiell auch nichts dagegen), im gleichen Atemzug aber Einzelteile über den Verkettungsoperator zusammengesetzt werden.
Desweiteren werden in der config.php die Klassen TPL und DB deklariert (was bitte hat das mit Konfiguration zu tun?) und danach wird direkt noch eine Instanz davon erzeugt, im Falle von DB sogar gleich 3 Instanzen erzeugt. So etwas sollte Aufgabe des End-Scriptes sein und nicht gleich bei der Definition der Klassen geschehen.
Zu guter Letzt hat die Klasse DB ja immerhin eine Methode query(), welche einen SQL-Query absendet. Dies wird im Script teilweise auch genutzt ($db->query(...)), aber bloß verwendet der Autor dann auf einmal (siehe obiges Beispiel) die Funktion mysql_query() statt seiner eigenen Methode?
Ich wiederhole mich gerne noch einmal: Nutze das Script nicht, lass die Finger davon!
Viele Grüße,
~ Dennis.
echo $begrüßung;
$rows = mysql_query("SELECT * FROM ".$prefix."log where kat = $katid2 && free = 0");
[...] aber die Variable $katid2 wird dank Register-Globals auf $_GET['katid2'] gesetzt und im Programm nirgendwo auf gültige Werte geprüft, geschweige denn für den SQL-String entsprechend escaped.
Was das heißt? Dass das ein dickes Sicherheitsloch ist, über welches man nach belieben an deiner Datenbank rumspielen (Daten auslesen, manipulieren, löschen) kann.
Prinzipiell stimme ich der Nicht-Empfehlung für dieses Script zu, aber dieses Argument kann ich so nicht stehen lassen. PHP und MySQL lassen pro mysql_query()-Aufruf nur ein Statement zu und ein SELECT-Statement kann man nicht so verbiegen, dass man damit Daten ändern oder löschen kann.
Du wolltest vermutlich diese Sicherheitslücke als allgemeine Lücke beschreiben, und nicht nur auf dieses SELECT-Statement bezogen sehen. Dann stimmt die Warnung wieder, denn im Admin-Script sieht man UPDATE- und DELETE-Statements, die ebenfalls die Eingabedaten nicht MySQL-gerecht aufbereiten. Stattdessen wird da htmlspecialchars() verwendet, eine in diesem Kontext völlig unbrauchbare Methode.
Da der Autor auf register_globals=on setzt, wird er sicher auch auf eingeschaltete Magic Quotes gesetzt haben. Das ist ein gut gemeintes PHP-Feature, aber ebenfalls nicht wirklich verwendbar, denn es manipuliert die Eingabedaten ohne Rücksicht auf das später verwendete konkrete Ausgabemedium. Aber immerhin verhindert es einfache SQL-Injection-Angriffe, das jedoch mit einigem Kollateralschaden (Betreibt man ein Affenformular mit eingeschalteten MQ freut man sich bei jeder Korrekturrunde besonders über die Vermehrung der \ vor eingegebenen " oder ').
Genug gewarnt, doch wie macht man es richtig? Grundsätzlich: Wenn Werte in einen bestimmten Kontext gebracht werden sollen, müssen sie dem Kontext gemäß behandelt werden. Und zwar nur für diesen und keinen anderen (vielleicht irgendwann später mal verwendeten) Kontext.
Für MySQL gibt es mysql_real_escape_string() oder mysqli::escape_string() oder Prepared Statements.
Für HTML ist htmlspecialchars() gedacht.
Gelegentlich muss man Eingabedaten aus einer Transportsicherung befreien, und bei PHP gegebenenfalls die Magic Quotes entfernen. Auf alle Fälle sollte man die Eingabedaten einer Plausibilitätsprüfung unterziehen. Möchte ich eine E-Mail-Adresse eingegeben wissen, darf darin beispielsweise kein Zeilenumbruch vorkommen. Ein Zahlenwert darf auch keine Buchstaben enthalten (Exponentialdarstellung und Hex-Werte mal außen vor gelassen).
echo "$verabschiedung $name";
Hi dedlfix,
Prinzipiell stimme ich der Nicht-Empfehlung für dieses Script zu, aber dieses Argument kann ich so nicht stehen lassen. PHP und MySQL lassen pro mysql_query()-Aufruf nur ein Statement zu und ein SELECT-Statement kann man nicht so verbiegen, dass man damit Daten ändern oder löschen kann.
Jein, ich dachte da eher an Sub-Querys… Ich habe es jetzt nicht ausprobiert, aber bist du dir sicher, dass man da nicht irgendwie einen inneren Query mit UPDATE oder DELETE machen kann? Letztendlich gibts dann natürlich aber auch noch die Lücken im Admin-Center, genau ;-)
Da der Autor auf register_globals=on setzt, wird er sicher auch auf eingeschaltete Magic Quotes gesetzt haben.
Da dieses „Feature” sowohl aktiviert wie auch deaktiviert sein kann, gehe ich natürlich von dem in dieser Situation schlechtesten Zustand aus, so wie man es als Programmierer wohl immer tuen sollte.
Dem Rest deiner Erläuterungen stimme ich aber natürlich zu ;-)
Viele Grüße,
~ Dennis.
echo $begrüßung;
Jein, ich dachte da eher an Sub-Querys… Ich habe es jetzt nicht ausprobiert, aber bist du dir sicher, dass man da nicht irgendwie einen inneren Query mit UPDATE oder DELETE machen kann?
Der einleitende Satz in dem verlinkten Kapitel lautet: »A subquery is a SELECT statement within another statement.« Man spricht auch von SubSELECT. Ein Subquery/Subselect muss eine Ergebnismenge zurückliefern. Die kann ein einzelner Wert, eine Zeile, eine Spalte oder eine Tabelle sein. DELETE, INSERT und UPDATE haben keine Ergebnismenge, sind deshalb für ein Subselect ungeeignet. Eine Stored Procedure scheidet auch aus, da diese nicht über ein SELECT aufgerufen wird. Bleibt noch eine Stored Function übrig, die über SELECT aufgerufen werden kann und Daten manipulieren kann. Doch das ist ein ziemlich unwahrscheinliches, wenn auch nicht völlig ausschließbares Szenario. Ich kann mir jedoch schlecht vorstellen, dass jemand in seiner Entwicklung so weit fortgeschritten ist, Stored Functions schreiben zu können, dabei aber um das Thema sichere Programmierung einen großen Bogen machen konnte. Und wer SF schreibt, mit der man wesentliche Daten ändern kann, hat vermutlich den Unterschied zwischen SP und SF nicht verstanden und ein Lehrgeld verdient :-) Aber gut, man kann ja auch durch Unachtsamkeit eine Lücke ins System einbauen.
Fazit: Mit Subquerys kann man theoretisch Unfug anstellen, die Wahrscheinlichkeit ist aber aufgrund der speziellen Voraussetzungen eher gering.
echo "$verabschiedung $name";