Tìm tập lệnh php gửi thư


9

Có cách nào để tôi tìm tập lệnh php đang gửi email không.

Tôi có apache + php (không có mod_suphp cũng không suexec) trong bản cài đặt "chuẩn" và tôi muốn tìm hiểu tập lệnh php phù thủy đang gửi email, khi tôi kiểm tra nhật ký tôi chỉ thấy uid của người dùng đang gửi email (trong trường hợp của tôi apache) nhưng tôi muốn tìm hiểu kịch bản bắt nguồn từ email.

Có thể hoặc tôi phải cài đặt suexec hoặc mod_suphp để giữ trac điều đó?

Thks cho sự giúp đỡ.

Câu trả lời:


9

php 5.3 đã được thiết kế để có được dấu vết thư tốt hơn, nhưng tôi không chắc điều đó có xảy ra không. (chỉnh sửa: có php 5.3 đã đăng nhập được xây dựng ngay bây giờ - php.ini có biến cấu hình mail.log sẽ ghi nhật ký sử dụng thư từ mã php.)

Chúng tôi đã giải quyết vấn đề bằng cách biến sendmail thành tập lệnh shell shell.

Trong php.ini đặt một trình gửi thư mới. Ví dụ:

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

Tập lệnh sendmail-php chỉ cần sử dụng logger để lấy thông tin và sau đó gọi sendmail của hệ thống:

#!/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 $*

Điều này sẽ đăng nhập vào bất cứ điều gì mail.info của bạn được đặt thành trong tệp syslog.conf.

Một đề xuất khác là cài đặt phần mở rộng php suhosin để thắt chặt các lỗ hổng trong PHP, trừ khi bạn đang chạy Debian hoặc Ubuntu, nơi đây đã là mặc định.


php 4.x tại đây (có một số ứng dụng cũ không thể chuyển sang php 5.x)
adam

Không có vấn đề, trình bao bọc này sẽ thực hiện các mẹo. Nó là bên ngoài của php. Tôi đã đề cập đến php 5.3 chỉ vì việc thiếu tính năng ghi nhật ký này dự kiến ​​sẽ được sửa chữa sau đó. Trình bao bọc hoạt động rất tốt và chúng tôi có thể xác định chính xác một tập lệnh bị lỗi bởi người dùng cho phép spam.
labradort

Thks, tôi đoán tôi sẽ có cách tiếp cận của bạn. cảm ơn bạn
adam

1
Xin chào, không phải tại sao nhưng "script = $ {SCRIPT_NAME}, filename = $ {SCRIPT_FILENAME}" không trả về bất cứ thứ gì nhìn thấy: 7 20:24:08 logger gateway: sendmail-php: client =, filename =, pwd = / var / www / html / mail, uid = 48, user = apache
adam

Bạn có chắc chắn rằng nó đã được thiết lập chính xác? Nếu nó không được biết đến như một biến được xác định trước trong môi trường PHP của bạn, bạn cũng sẽ thấy: "script =," trong đầu ra được ghi. Kiểm tra những gì bạn thiết lập lại rất cẩn thận. Bạn có thể thử: $ _SERVER ['SCRIPT_FILENAME'] Bạn có thể tìm kiếm thêm các biến để đăng nhập từ tài liệu PHP trên các biến được xác định trước: php.net/manual/en/reserved.variabled.server.php
labradort

4

Giải pháp cho việc này thực sự cần một vài bước. Giải pháp của labradort ở trên không thực sự hoạt động vì tập lệnh logger là tập lệnh bash, không phải php và tập lệnh bash không có quyền truy cập vào các biến của php, vì vậy các bản ghi bị trống. Về cơ bản, bất cứ điều gì bạn muốn đăng nhập đều cần được lưu vào các biến môi trường trong php trước khi gửi email để logger có quyền truy cập vào dữ liệu. Vì bạn đang cố gắng phát hiện các tập lệnh của người dùng khác, không nhất thiết là tập lệnh của riêng bạn, bạn không có quyền kiểm soát mã php, vì vậy bạn cần sử dụng tính năng auto_prepend_file của PHP để đảm bảo rằng tất cả php đã thực thi chạy mã khởi tạo của bạn trước mọi thứ khác. Tôi đã chuẩn bị mã sau thông qua php.ini để đảm bảo tôi có dữ liệu tôi cần trong logger:

<?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");
?>

Tôi tập hợp một hướng dẫn đầy đủ về cách để làm việc này ở đây: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicy-php-spam-scripts/


Kịch bản trình bao bọc đã hoạt động trên triển khai php mặc định của Redhat và Debian Linux khi nó là php 5.2 trở về trước. Tôi chỉ đơn giản là sử dụng mail.log = /var/log/apache-mail.log những ngày này và nó làm những gì tôi cần.
labradort

1
Đây chính xác là cách khai thác lỗi shellshock. Tôi thực sự không khuyên bạn nên làm mọi thứ theo cách này.
Ben Hitchcock

Bạn có một điểm. Bạn chắc chắn có thể chạy các biến thông qua chức năng khử trùng để loại bỏ mọi thứ có hại, như "() {:;};". Trên thực tế có lẽ là một ý tưởng tốt để thêm tiền tố vào tên biến, với một cái gì đó như "PHP_", trong trường hợp có xung đột tên biến môi trường.
Tom McQuarrie

2

một bản vá cho PHP sẽ hiển thị tập lệnh nào đang tạo email bằng cách thêm tiêu đề vào email được gửi. Tôi đã không kiểm tra nó vì tôi không thích vá PHP lõi, nhưng tôi đã nghe thấy những điều tốt.


1
Điều này nghe có vẻ như một cách tuyệt vời để đi. +1. Tuy nhiên, nếu bạn đang quản lý một máy chủ được chia sẻ với nhiều khách hàng, bạn có thể muốn thông báo cho các khách hàng đó về tiêu đề hoặc chuyển hướng đầu ra thành một tệp nhật ký.
Pekka

Có thể đó là cách để đi nhưng đến một lúc nào đó, đây là vấn đề bảo mật của tôi, tất cả mọi người sẽ chuyển sang tập lệnh nào đang gửi email, tập lệnh được tạo ra kém chỉ đang mời bị hack. Chuyển hướng đến một bản ghi có thể tốt hơn
adam

Các tập lệnh được tạo kém không nên có trên máy chủ ngay từ đầu, mọi người sẽ tìm thấy chúng nếu chúng ở đó (đặc biệt nếu chúng là một phần của hệ thống cms phổ biến). Nhưng tôi có quan điểm của bạn rằng có thể có một trường hợp chống lại giải pháp này.
WheresAlice

0

Bạn sẽ phải grep các nhật ký truy cập cho một cái gì đó phù hợp với khung thời gian khi các tin nhắn được thêm vào ống chỉ.


Thks cho phát lại, vấn đề là một lưu trữ được chia sẻ và đối với mỗi tên miền là một nhật ký truy cập dành riêng.
adam

Vâng, thật không may, bạn sẽ phải grep qua tất cả chúng.
Richard Salts

0

Có thể chỉ tìm kiếm thông qua các tập tin nguồn cho chuỗi con "mail ("?


Điều đó đôi khi đáng để xem xét, và đặc biệt là xem xét mã nguồn xung quanh nó để biết bất kỳ lỗ hổng nào cho những kẻ gửi thư rác sử dụng. Nhưng với rất nhiều tập lệnh php phức tạp thuộc sở hữu của nhiều người trên một máy chủ chia sẻ, đó không phải là giải pháp cho vấn đề này.
WheresAlice

Trong môi trường lưu trữ được chia sẻ, điều này có thể không xác định chính xác tập lệnh hoặc có thể dẫn đến nhiều kết quả sai
Eric Kigathi

0

Chỉ cần kích hoạt những thứ này trên php.ini của bạn

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

sau đó tạo tập tin đó và cho phép ghi. Hãy để mắt đến nó sau đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.