메일을 보내는 PHP 스크립트 찾기


9

이메일을 보내는 PHP 스크립트를 찾을 수있는 방법이 있습니까?

나는 "표준"설치에서 apache + php (no mod_suphp none suexec)를 가지고 있으며, 마녀 PHP 스크립트가 이메일을 보내고 있는지 확인하고 싶습니다. 로그를 확인할 때 이메일을 보내는 사용자의 uid 만 보입니다 (in 내 경우는 apache)하지만 이메일을 보낸 스크립트를 찾고 싶습니다.

가능합니까, 아니면 trac를 유지하려면 suexec 또는 mod_suphp를 설치해야합니까?

도움을 주셔서 감사합니다.

답변:


9

PHP 5.3은 더 나은 메일 추적을 위해 슬롯되었지만, 그 일이 발생했는지 확실하지 않습니다. (편집 : 예 php 5.3에는 로깅 기능이 내장되어 있습니다-php.ini에는 php 코드의 메일 사용을 기록하는 구성 변수 mail.log가 있습니다.)

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 extension을 설치하여 PHP의 허점을 강화하는 것입니다.


php 4.x here (php 5.x로 포팅 할 수없는 오래된 앱이 있음)
adam

문제 없습니다.이 래퍼가 트릭을 수행합니다. PHP 외부에 있습니다. 로깅 기능이 부족하여 수정 될 예정이므로 PHP 5.3을 언급했습니다. 래퍼는 매우 잘 작동하며 스팸을 허용 한 사용자가 결함이있는 스크립트를 찾아 낼 수있었습니다.
labradort

thks, 나는 당신의 접근 방식을 취할 것 같아요. 감사합니다
adam

1
안녕하세요, 왜 "script = $ {SCRIPT_NAME}, filename = $ {SCRIPT_FILENAME}"이 (가) 아무것도 반환하지 않습니다 : 7 20:24:08 게이트웨이 로거 : sendmail-php : client =, filename =, pwd = / 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

이에 대한 해결책은 실제로 몇 단계가 필요합니다. 로거 스크립트는 PHP가 아닌 bash 스크립트이고 bash 스크립트는 PHP 변수에 액세스 할 수 없으므로 로그가 공백으로 표시되므로 위의 labradort 솔루션은 실제로 작동하지 않습니다. 기본적으로 로거가 데이터에 액세스 할 수 있도록 이메일을 보내기 전에 로그하려는 모든 것을 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/


래퍼 스크립트는 Redhat 및 Debian Linux의 PHP 기본값 구현에서 PHP 5.2 이전 버전에서 작동했습니다. 요즘 단순히 mail.log = /var/log/apache-mail.log를 사용하고 있으며 필요한 작업을 수행합니다.
labradort

1
이것이 바로 쉘 쇼크 버그가 어떻게 악용되는지입니다. 나는 이런 식으로 일하는 것을 진지하게 권장하지 않습니다.
벤 히치콕

당신은 요점이 있습니다. "() {:;};"와 같이 유해한 것을 제거하기 위해 살균 기능을 통해 변수를 실행할 수 있습니다. 실제로 환경 변수 이름이 충돌하는 경우를 대비하여 변수 이름 앞에 "PHP_"와 같은 접두어를 붙이는 것이 좋습니다.
Tom McQuarrie

2

전송되는 이메일에 헤더를 추가하여 이메일을 생성하는 스크립트를 보여주는 PHP 용 패치 가 있습니다 . 핵심 PHP 패치에 관심이 없기 때문에 테스트하지는 않았지만 좋은 소식을 들었습니다.


1
이것은 훌륭한 방법처럼 들립니다. +1. 그러나 여러 클라이언트가있는 공유 호스트를 관리하는 경우 해당 클라이언트에 헤더를 알리거나 출력을 로그 파일로 리디렉션 할 수 있습니다.
페카

예, 갈 수있는 방법 일지 모르지만 특정 시점에서 보안 문제가 될 수 있습니다. 모든 사람들이 스크립트를 이메일로 보내는 내용으로 가고 있습니다. 더 나은 로그로 리디렉션
아담

잘못 작성된 스크립트는 처음에 서버에 있으면 안됩니다. 사람들은 스크립트가있는 경우 (특히 인기있는 cms 시스템의 일부인 경우) 스크립트를 찾습니다. 그러나이 솔루션에 대한 사례가있을 수 있다고 생각합니다.
WheresAlice

0

메시지가 스풀에 추가 된 시간에 맞는 액세스 로그를 가져와야합니다.


재생에 대한 문제는 문제는 공유 호스팅이며 각 도메인마다 전용 액세스 로그라는 것입니다.
adam

예, 불행히도 당신은 그들 모두를 파헤쳐 야 할 것입니다.
Richard Salts

0

"mail ("하위 문자열에 대한 소스 파일을 검색 할 수 있습니까?


스패머가 사용할 수있는 취약점이 있는지 살펴볼 가치가 있으며, 특히 소스 코드를 살펴 보는 것이 좋습니다. 그러나 공유 호스트의 많은 사람들이 소유 한 복잡한 PHP 스크립트가 많기 때문에이 문제에 대한 해결책은 아닙니다.
WheresAlice

공유 호스팅 환경에서 이것은 정확한 스크립트를 정확하게 지적하지 못하거나 여러 오탐 (false positive)을 초래할 수 있습니다.
Eric Kigathi

0

php.ini에서 간단히 활성화하십시오.

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

그런 다음 해당 파일을 작성하고 쓰기 권한을 부여하십시오. 그 후에 그것을 주시하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.