Есть ли у меня способ найти php-скрипт, который отправляет электронные письма.
У меня есть apache + php (без mod_suphp и suexec) в "стандартной" установке, и я хочу узнать, как php-скрипт ведьмы отправляет электронные письма, когда я проверяю журналы, я просто вижу uid пользователя, отправляющего электронные письма (в мой случай apache), но я хочу узнать сценарий, из которого вышло письмо.
Возможно ли это, или я должен установить suexec или mod_suphp, чтобы отслеживать это?
Спасибо за помощь.
php 5.3 был выделен для улучшения отслеживания почты, но я не уверен, что это произошло. (edit: да, php 5.3 теперь имеет встроенное ведение журнала - php.ini имеет конфигурационную переменную mail.log, которая будет регистрировать использование почты из кода php.)
Мы решили проблему, сделав sendmail сценарием оболочки-оболочки.
В php.ini установите новый почтовик. Например.:
sendmail_path = /usr/local/bin/sendmail-php -t -i
Сценарий sendmail-php просто использует регистратор для получения информации, а затем вызывает систему 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 $*
Это приведет к тому, что ваш mail.info установлен в файле syslog.conf.
Другое предложение - установить расширение suhosin php, чтобы устранить лазейки в PHP, если вы не используете Debian или Ubuntu, где это уже установлено по умолчанию.
Решение этой проблемы на самом деле требует нескольких шагов. Приведенное выше решение labradort на самом деле не работает, поскольку сценарий регистратора - это сценарий bash, а не php, а сценарий bash не имеет доступа к переменным php, поэтому журналы остаются пустыми. По сути, все, что вы хотите регистрировать, необходимо сохранить в переменных среды в php перед отправкой электронной почты, чтобы регистратор имел доступ к данным. Поскольку вы пытаетесь обнаружить скрипты других пользователей, не обязательно свои собственные, у вас нет контроля над PHP-кодом, поэтому вам нужно использовать функцию PHP auto_prepend_file, чтобы гарантировать, что все выполняемые PHP запускают ваш код инициализации раньше всего остального. Я добавил следующий код через php.ini, чтобы убедиться, что у меня есть данные, которые мне нужны в регистраторе:
<?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");
?>
Я собрал полное руководство о том, как заставить это работать здесь: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/
Там есть патч для PHP, который покажет, какой сценарий генерирует электронные письма, добавив заголовок к отправляемому электронному письму. Я не тестировал его, так как не очень хочу исправлять ядро PHP, но слышал хорошие отзывы.
Вам нужно будет найти в журналах доступа что-то, что соответствует временным рамкам, когда сообщения были добавлены в спул.
Может быть, просто поискать в исходных файлах подстроку "mail ("?
Просто включите их на своем php.ini
mail.add_x_header = On
mail.log = /var/log/phpmail.log
затем создайте этот файл и дайте разрешение на запись. Взгляните на это после этого.