Re: Merkwuerdige Apache-Logs

Datumsansicht Baumansicht Betreffansicht Attachement-Sicht

Autor: Michael Lestinsky (michael_at_lestinsky.de)
Datum: 12. Oct 2002


Am 10.10.'02 schrieb Michael Lestinsky:
> sh: /var/www/cgi-bin/REMOTE_ADDR=: not found
> sh: /var/www/cgi-bin/REMOTE_ADDR=: not found
> sh: /var/www/cgi-bin/REMOTE_ADDR=: not found

Ich habe den Übeltäter gefunden:

root_at_charm:/home> find . -name '*php*' | xargs grep REMOTE_ADDR
./rabe/WWW/htdocs/doku/online-doku/noframes.php:<strong>Du bist Besucher Nummer <strong><? system("REMOTE_ADDR=$REMOTE_ADDR /home/beckerra/WWW/bin/counter.cgi") ?></strong>
./rabe/WWW/htdocs/doku/online-doku/linklist.php:Du bist Besucher Nummer <strong><? system("REMOTE_ADDR=$REMOTE_ADDR /home/beckerra/WWW/bin/counter.cgi") ?></strong>
./rabe/WWW/htdocs/files/kram/doku/online-doku/noframes.php:<strong>Du bist Besucher Nummer <strong><? system("REMOTE_ADDR=$REMOTE_ADDR /home/beckerra/WWW/bin/counter.cgi") ?></strong>
./rabe/WWW/htdocs/files/kram/doku/online-doku/linklist.php:Du bist Besucher Nummer <strong><? system("REMOTE_ADDR=$REMOTE_ADDR /home/beckerra/WWW/bin/counter.cgi") ?></strong>

Was daran falsch ist?

o in PHP 4.2 ist register_globals ausgeschaltet. $REMOTE_ADDR ist also in
   diesem Kontext nichtexistent. Wennschon, dann $_SERVER['REMOTE_ADDR'].
o putenv() existiert; falls man unbedingt darauf zurückgreifen muss.
   Eleganter wäre aber die Client-Adresse in argv zu übergeben.
o Obige Methode führt zwei weitere Forks durch, für die Shell, die das
   Kommando ausführt und das Child ruft dann noch ein weiteren Inter-
   preter (Perl, Sh, Sonstwas auf) für /home/beckerra/WWW/bin/counter.cgi.
   Ziemlich viel Overhead fuer einen Counter, IMO.
o PHPs system() ruft nicht das Libc-system(3) auf, sondern macht im
   Wesentlichen ein popen(3). Da unser PHP aber im safe_mode läuft, wird
   vorher der übergebene Parameter zerlegt und an den ersten String, der
   mit einem Leerzeichen endet safe_mode_exec_dir vorne angefügt. In
   diesem Fall wird also aus 'REMOTE_ADDR=' '/var/www/cgi-bin/REMOTE_ADDR=',
   welches natürlich nicht existiert. (Details dazu sind nachzulesen unter
   ext/standard/exec.c im PHP-Sourcebaum.)
o Last, but not least: /home/beckerra/WWW/bin/counter.cgi existiert nicht.

Warum man ein externes Programm aufruft um einen doofen Counter zu
schreiben ist mir schleierhaft.

<?php
  // read counter-file
  $f = fopen(COUNTERFILE, "r+");
  $last_remote = fgets($f, 4096);
  $count = fgets($f, 4096);

  if ($last_remote != $_SERVER['REMOTE_ADDR']) {
    // Oh, jemand anderes?

    fseek($f, 0, SEEK_SET);

    fputs($f, $_SERVER['REMOTE_ADDR']);
    fputs($f, ++$count);

  }
  echo $count;

  fclose($f);
?>

Als Übung bleibt es dem geneigten Leser selbst überlassen ein geeignetes
Locking zu implementieren und obigen Code zu debuggen.

Über den Sinn eines Counters und besondere des IP-Nummern-Vergleichs an
dieser Stelle braucht ihr mit mir nicht zu streiten. Ich hab hier nur
Raphaels Perl-Skript, an das ich mich noch vage erinnern kann, in PHP
nachgebildet.

Bye
Michael

-- 
It's like saying that a security vulnerability was discovered in Honda's
because they can't survive re-entry into the atmosphere...
    (Theo de Raadt in misc_at_openbsd.org)

Datumsansicht Baumansicht Betreffansicht Attachement-Sicht

Dieses Archiv wurde generiert von hypermail 2.1.4 : 12. Oct 2002 CEST