Znajdź skrypt php wysyłający maile

9

Czy jest jakiś sposób, aby znaleźć skrypt php, który wysyła e-maile.

Mam apache + php (bez mod_suphp ani suexec) w „standardowej” instalacji i chcę dowiedzieć się, w którym skrypcie php wysyła się e-maile, kiedy sprawdzam logi, po prostu widzę identyfikator użytkownika wysyłającego e-maile (w mój przypadek apache), ale chcę znaleźć skrypt, z którego pochodzi wiadomość e-mail.

Czy to możliwe, czy muszę zainstalować suexec lub mod_suphp, aby śledzić to?

Prosi o pomoc.

Adam
źródło

Odpowiedzi:

9

php 5.3 został wprowadzony, aby uzyskać lepsze śledzenie poczty, ale nie jestem pewien, czy tak się stało. (edycja: tak php 5.3 ma teraz wbudowane logowanie - php.ini ma zmienną konfiguracyjną mail.log, która będzie rejestrować użycie poczty z kodu php.)

Rozwiązaliśmy problem, czyniąc sendmail skryptem powłoki.

W php.ini ustaw nowy mailer. Na przykład:

sendmail_path = /usr/local/bin/sendmail-php -t -i

Skrypt sendmail-php po prostu używa rejestratora, aby uzyskać informacje, a następnie wywołuje system sendmail:

#!/bin/bash

logger -p mail.info -t sendmail-php "site=${HTTP_HOST}, client=${REMOTE_ADDR}, script=${SCRIPT_NAME}, filename=${SCRIPT_FILENAME}, docroot=${DOCUMENT_ROOT}, pwd=${PWD}, uid=${UID}, user=$(whoami)"

/usr/sbin/sendmail -t -i $*

Spowoduje to zalogowanie do dowolnego ustawienia mail.info w pliku syslog.conf.

Inną sugestią jest zainstalowanie rozszerzenia php suhosin, aby zmniejszyć luki w PHP, chyba że używasz Debiana lub Ubuntu, gdzie jest to już domyślne.

labradort
źródło
php 4.x tutaj (mam kilka starych aplikacji, które nie nadają się do przeniesienia do php 5.x)
Adam
Nie ma problemu, to opakowanie załatwi sprawę. To jest zewnętrzne dla php. Wspomniałem o php 5.3, ponieważ ten brak funkcji logowania miał zostać naprawiony. Opakowanie działa bardzo dobrze i byliśmy w stanie wskazać wadliwy skrypt użytkownika, który zezwalał na spam.
labradort
dzięki, chyba zamierzam przyjąć twoje podejście. dziękuję
Adam
1
Cześć, nie wiem dlaczego, ale „skrypt = $ {SCRIPT_NAME}, nazwa pliku = $ {SCRIPT_FILENAME}” nic nie zwraca: 7 20:24:08 rejestrator bramy: sendmail-php: klient =, nazwa pliku, pwd = / var / www / html / mail, uid = 48, user = apache
adam
Czy na pewno został poprawnie skonfigurowany? Jeśli nie była znana jako predefiniowana zmienna w twoim środowisku PHP, powinieneś zobaczyć także: „script =,” w logowanym wyjściu. Sprawdź, co skonfigurowałeś ponownie bardzo uważnie. Możesz spróbować: $ _SERVER ['SCRIPT_FILENAME'] Możesz znaleźć więcej zmiennych do rejestrowania z dokumentacji PHP na temat predefiniowanych zmiennych: php.net/manual/en/reserved.variables.server.php
labradort
4

Rozwiązanie tego wymaga kilku kroków. Powyższe rozwiązanie labradort tak naprawdę nie działa, ponieważ skrypt rejestrujący jest skryptem bash, a nie php, a skrypt bash nie ma dostępu do zmiennych php, więc logi są puste. Zasadniczo wszystko, co chcesz zarejestrować, musi zostać zapisane w zmiennych środowiskowych w php przed wysłaniem wiadomości e-mail, aby rejestrator miał dostęp do danych. Ponieważ próbujesz wykryć skrypty innych użytkowników, niekoniecznie własne, nie masz kontroli nad kodem php, więc musisz użyć funkcji auto_prepend_file PHP, aby upewnić się, że wszystkie uruchomione php uruchomią kod inicjujący przed wszystkim innym. Dodałem następujący kod za pośrednictwem php.ini, aby upewnić się, że mam potrzebne dane w rejestratorze:

<?php
/**
 * This passes all SERVER variables to environment variables, 
 * so they can be used by called bash scripts later
 */
foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
?>

Przygotowałem pełny samouczek, jak to zrobić, tutaj: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/

Tom McQuarrie
źródło
Skrypt otoki działał na implementacji domyślnych ustawień php przez Redhat i Debian Linux, gdy był to php 5.2 i wcześniejszy. Teraz używam po prostu mail.log = /var/log/apache-mail.log i robi to, czego potrzebuję.
labradort
1
Właśnie w ten sposób wykorzystywany jest błąd shellshock. Poważnie nie polecam robić tego w ten sposób.
Ben Hitchcock
Masz rację. Z pewnością można uruchomić zmienne za pomocą funkcji dezynfekcji, aby usunąć wszelkie szkodliwe elementy, takie jak „() {:;};”. Właściwie prawdopodobnie dobrym pomysłem jest też prefiks nazwy zmiennych, np. „PHP_”, na wypadek konfliktu nazw zmiennych środowiskowych.
Tom McQuarrie,
2

Istnieje łatka dla PHP, która pokaże, który skrypt generuje wiadomości e-mail, dodając nagłówek do wysyłanej wiadomości e-mail. Nie testowałem tego, ponieważ nie lubię łatać rdzenia PHP, ale słyszałem dobre rzeczy.

WheresAlice
źródło
1
To brzmi jak doskonała droga. +1. Jeśli jednak zarządzasz hostem współdzielonym z wieloma klientami, możesz chcieć poinformować tych klientów o nagłówku lub zamiast tego przekierować dane wyjściowe do pliku dziennika.
Pekka
Tak, być może jest to właściwa droga, ale w pewnym momencie może to być problem z bezpieczeństwem, wszyscy ludzie teraz robią to, co skrypt wysyła e-maile, źle wykonane skrypty tylko zachęcają do zhakowania. Przekieruj do dziennika, może lepiej
Adam
Źle wykonane skrypty nie powinny znajdować się na serwerze, ludzie je znajdą, jeśli tam są (szczególnie jeśli są częścią popularnego systemu cms). Ale rozumiem, że może istnieć argument przeciwko temu rozwiązaniu.
WheresAlice,
0

Będziesz musiał przeszukać dzienniki dostępu w celu dopasowania ich do przedziału czasowego, w którym wiadomości zostały dodane do bufora.

Richard Salts
źródło
dziękuję za powtórkę, problem polega na tym, że jest to hosting dzielony, a dla każdej domeny jest to dedykowany dziennik dostępu.
adam
Tak, niestety będziesz musiał przejrzeć je wszystkie.
Richard Salts,
0

Może po prostu przeszukiwać pliki źródłowe pod kątem „mail (” podciąg?

Dmitrij Trukhanov
źródło
Czasami warto na to spojrzeć, a zwłaszcza na otaczający go kod źródłowy pod kątem luk w zabezpieczeniach, z których mogą korzystać spamerzy. Ale przy wielu skomplikowanych skryptach php należących do wielu osób na wspólnym hoście, nie jest to rozwiązanie tego problemu.
WheresAlice,
We współdzielonym środowisku hostingowym może to nie wskazywać dokładnego skryptu lub powodować wiele fałszywych alarmów
Eric Kigathi
0

Po prostu włącz je na swoim php.ini

mail.add_x_header = On
mail.log = /var/log/phpmail.log

następnie utwórz ten plik i udziel zezwolenie na zapis. Potem spójrz na to.

Kevin Nguyen
źródło