Знайдіть скрипт php, який надсилає пошту


9

Чи є мені спосіб знайти скрипт php, який надсилає електронні листи.

У мене є апаш + php (ні mod_suphp, ні suexec) в "стандартній" установці, і я хочу дізнатися, що відьом PHP-скрипт надсилає електронні листи, коли я перевіряю журнали, я просто бачу uid користувача, який надсилає електронні листи (в мій випадок апачі), але я хочу дізнатися сценарій, який виник з електронної пошти.

Чи можливо це, або я повинен встановити suexec або mod_suphp, щоб зберегти trac цього?

Думає про допомогу.

Відповіді:


9

php 5.3 був прорізаний для кращого відстеження пошти, але я не впевнений, чи це сталося. (редагувати: так, у 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, де це вже за замовчуванням.


php 4.x тут (отримано кілька старих додатків, які не здатні переносити на php 5.x)
adam

Немає проблем, ця обгортка зробить трюк. Він зовнішній для php. Я згадав php 5.3 лише тому, що до цього часу відсутня функція ведення журналу була встановлена. Обгортка працює дуже добре, і ми змогли точно визначити недосконалий сценарій користувачем, який дозволяв спам.
labradort

Thks, я думаю, я буду використовувати ваш підхід. дякую
adam

1
Привіт, не роби чому, але "script = $ {SCRIPT_NAME}, ім'я файлу = $ {SCRIPT_FILENAME}" нічого не повертає див. 7 20:24:08 шлюз реєстратора: sendmail-php: client =, ім'я = var / www / html / mail, uid = 48, user = apache
adam

Ви впевнені, що він налаштований правильно? Якщо вона була невідома як заздалегідь визначена змінна у вашому середовищі PHP, ви повинні бачити також: "script =", у вхідному протоколі. Перевірте, що ви знову налаштували, дуже уважно. Ви можете спробувати: $ _SERVER ['SCRIPT_FILENAME'] Можливо, ви зможете знайти більше змінних для входу з документації PHP щодо заздалегідь визначених змінних: php.net/manual/en/reserved.variables.server.php
labradort

4

Для вирішення цього фактично потрібно кілька кроків. Наведене вище рішення labradort насправді не працює, оскільки скрипт реєстратора - це bash-скрипт, а не php, і скрипт bash не має доступу до змінних php, тому журнали виходять порожніми. В основному все, що ви хочете записати, потрібно зберегти до змінних оточення у php перед відправкою електронного листа, щоб реєстратор мав доступ до даних. Оскільки ви намагаєтеся виявити сценарії інших користувачів, не обов'язково власні, у вас немає контролю над php-кодом, тому вам потрібно використовувати функцію auto_prepend_file PHP, щоб гарантувати, що всі виконані 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/


Скрипт обгортки працював над реалізацією Redhat і Debian Linux введення параметрів php за замовчуванням ще тоді, коли це було php 5.2 і раніше. Я просто використовую mail.log = /var/log/apache-mail.log в ці дні, і він робить все, що мені потрібно.
лабрадорт

1
Саме так експлуатується клоп-черепашник. Я серйозно не рекомендую робити такі дії.
Бен Хічкок

Ти маєш рацію. Ви, безумовно, можете запустити змінні за допомогою функції санітарії, щоб викреслити щось шкідливе, наприклад "() {:;};". Насправді, мабуть, гарна ідея також встановити префікси імен змінних, на кшталт "PHP_", на всякий випадок, якщо зіткнеться ім'я змінної середовища.
Том МакКуаррі

2

Існує патч для PHP, який покаже, який сценарій генерує електронні листи, додаючи заголовок до відправленого електронного листа. Я не перевіряв його, оскільки не прагну до виправлення ядра PHP, але чув хороші речі.


1
Це звучить як відмінний шлях. +1. Однак якщо ви керуєте спільним хостом з кількома клієнтами, ви можете повідомити цих клієнтів про заголовок або натомість перенаправити вихід у файл журналу.
Pekka

Так, можливо, це шлях, але в певний момент це моє питання безпеки, всі люди зараз збираються, який сценарій надсилає електронну пошту, погано зроблений сценарій просто запрошує зламатись. Переадресація до журналу, можливо, це краще
adam

Погано складені сценарії не повинні бути на сервері в першу чергу, люди знайдуть їх, якщо вони є (особливо якщо вони є частиною популярної системи cms). Але я розумію, що проти цього рішення може бути справа.
WheresAlice

0

Вам доведеться зірвати журнали доступу за те, що відповідає терміну, коли повідомлення були додані до котушки.


для повторення, проблема полягає в тому, що це спільний хостинг, і для кожного домену це спеціальний журнал доступу.
adam

Так, на жаль, вам доведеться проглядати їх усі.
Річард Солт

0

Може бути лише пошук у вихідних файлах для "post (" substring)?


На це іноді варто звернути увагу, і, зокрема, подивитися на вихідний код, що його оточує, на наявність уразливості, яку можуть використовувати спамери. Але з великою кількістю складних PHP-скриптів, що належать багатьом людям на спільному хості, це не є вирішенням цієї проблеми.
WheresAlice

У спільному хостинговому середовищі це не може точно визначити точний сценарій або призведе до декількох помилкових позитивних результатів
Ерік Кігаті

0

Просто увімкніть їх на своєму php.ini

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

потім створіть цей файл і дайте дозвіл на запис. Погляньте на це після цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.