[PHP]mail() schreibt den Namen des Skripts in den Mailheader

HornOx

Registered User
Hallo,
bei mod_php und unsichere Skripten kann es vorkommen das Spam über den Server versendet wird ohne das man genau nachvollziehen kann welches Skript Schuld ist, im E-Mailheader steht bei mod_php nur die UserID von Apache :(
Deshalb hier eine kurze Anleitung wie man die PHP Sourcen so verändert das php immer den Namen des Skripts mit in den EMailheader schreibt wenn eine Mail mit mail() oder imap_mail() versendet wird.
Code:
wget http://www.php.net/get/php-5.1.2.tar.bz2/from/de3.php.net/mirror
tar -xvjf php-5.1.2.tar.bz2 
cd php-5.1.2
#mail.patch.txt (siehe Anhang) auf den Server laden
patch -p1 <mail.patch.txt
./configure [i]irgendwas[/i]
make
Anmerkungen:
  • Das schützt nicht vor Spamversand aber ermöglicht einem die Lücke schnell zu finden
  • Je nach Sicherheitseinstellungen kann man per php sendmail/exim/Postfix/qmail immer noch direkt aufrufen oder eine smtp Verbindung zu einem anderen Server aufbauen, sowas sollte man aber wenn man mod_php einsetzt eh am besten unterbinden
  • Exim (und vermutlich andere MTAs auch) kann recht komplexe Abfragen ausführen, z.b. sollte es möglich sein die Mails die ein User pro Zeiteinheit versenden darf so zu limitieren da er jetzt die User anhand der neuen Headerzeile auseinander halten kann :)
  • mail.patch.txt wurde mit den PHP 4.3.10 Sourcen erzeugt, bei anderen Versionen die ich getestet habe hat patch zwar gemerkt das sich die Zeilennummern geändert haben aber hat die paar neuen Zeilen dank dem zusätzlich im diff enthaltenen Kontext richtig eingefügt :)
 

Attachments

Last edited by a moderator:
Jetzt noch eine etwas kompliziertere Anleitung wie man gepatchte .deb Packete erstellt:
Code:
su root #damit das chroot klappt
cd
mkdir mytestchroot
apt-get install debootstrap
debootstrap sarge ./mytestchroot ftp://ftp2.de.debian.org/debian
cd mytestroot
chroot .
cat >/etc/apt/sources.list <<EOF
deb      ftp://ftp2.de.debian.org/debian sarge main contrib non-free
deb-src ftp://ftp2.de.debian.org/debian sarge main contrib non-free
deb      http://security.debian.org/ sarge/updates main contrib non-free
deb-src http://security.debian.org/ sarge/updates main contrib non-free
EOF
apt-get update
apt-get upgrade
apt-get build-dep libapache2-mod-php4
cd ~
mkdir phptemp
cd phptemp
apt-get source libapache2-mod-php4
cp -r php4-4.3.10 php4-4.3.10.orig
zcat php4_4.3.10-16.diff.gz | patch -u -p0
cp php4-4.3.10/ext/standard/mail.c php4-4.3.10/ext/imap/php_imap.c .
nano mail.c
Unter
Code:
#include "ext/standard/info.h"
das da schreiben:
Code:
#include "SAPI.h"
und unter
Code:
fprintf(sendmail, "To: %s\n", to);
(~Zeile 230)das da schreiben:
Code:
fprintf(sendmail, "X-PHP-Skript: %s\n", SG(request_info).path_translated);
Nächste Datei öffnen:
Code:
nano php_imap.c
Unter
Code:
#include "ext/standard/info.h"
das da schreiben:
Code:
#include "SAPI.h"
und unter
Code:
memset(bufferHeader, 0, bufferLen);
(~Zeile 3200 bei PHP 4) das da schreiben:
Code:
        strcat(bufferHeader, "X-PHP-Skript: ");
        strcat(bufferHeader, SG(request_info).path_translated); 
        strcat(bufferHeader, "\r\n");
und unter
Code:
if (sendmail) {
(~ Zeile 3290) das da schreiben:
Code:
fprintf(sendmail, "X-PHP-Skript: %s\n", SG(request_info).path_translated);
Jetzt wieder weiter in der Shell:
Code:
diff -u --label=php4/ext/standard/mail.c --label=php4/ext/standard/mail.c php4-4.3.10/ext/standard/mail.c mail.c >php4-4.3.10.orig/debian/patches/900-mail.patch
diff -u --label=php4/ext/imap/php_imap.c --label=php4/ext/imap/php_imap.c php4-4.3.10/ext/imap/php_imap.c php_imap.c >>php4-4.3.10.orig/debian/patches/900-mail.patch
cat php4-4.3.10.orig/debian/patches/900-mail.patch
#900-mail.patch sollte ungefähr so aussehen wie der Anhang vom obigen Beitrag
cd php4-4.3.10.orig
dpkg-buildpackage -b -uc
cd ..
ls *.deb
exit
cd root/phptemp/
dpkg -i [i]Packete[/i]
Ist zugegebenerweise für so eine kleine Codeänderung etwas schweres Geschütz, aber das kann man für andere Packete leicht abändern und die debootstrap/chroot Kombination ist für Experimente mit apt-get/spkg auch ganz nett, außerdem bleibt so das Hostsystem sauber.
Das geändete Packt hat den gleichen Namen wie das Orginalpacket und wird wenn es eine neues *php*.deb Packet gibt überschrieben, das ist in diesem Falle IMHO sinnvoll. Wer das nicht will muß den Packetnamen anpassen.
 
Last edited by a moderator:
Huschi said:
HornOx said:
Wenn mehr als 5(?) Leute Interesse[...] an einem Patch haben[...] dann erstelle ich einen.
Ich schätze hier sind ca. 3.000 User mit Interesse.
Ich bezweifel immer noch das sich mehr als eine Handvoll die Mühe machen vorbeugend Hilfsmittel selbst zu kompilieren. Aber das deb Packet verändern wollte ich eh mal ausprobieren ;)

btw, gibt's irgendwo eine vergleichbare Anleitung wie man ".src.rpm"s anpasst und in ".rpm"s umwandelt?

[edit]Auf 3 Beiträge verteilt damit man besser verlinken kann und damit's übersichtlicher wird[/edit]
 
Wenn ich (PHP 5.1.3)nach deinem ersten Post vorgehe, bleibe ich bei "patch -p1 mail.patch.txt" haengen. Das Programm scheint dann "ewig" zu laufen. Nach 10 Minuten habe ich es mit strg-c abgebrochen.

Aber wenn ich die 2 Dateien nach deinem 2. Post aendere und dann kompeliere, klappt es wunderbar.

Vielen Dank dafuer :)
 
Back
Top