Знайдіть скрипт 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.