ค้นหาสคริปต์ PHP ที่ส่งอีเมล


9

มีวิธีใดบ้างที่ฉันจะพบสคริปต์ php ที่ส่งอีเมล

ฉันมี apache + php (ไม่มี mod_suphp ทั้ง suexec) ในการติดตั้ง "มาตรฐาน" และฉันต้องการค้นหาแม่มด php สคริปต์กำลังส่งอีเมลเมื่อฉันตรวจสอบบันทึกฉันเห็น uid ของผู้ใช้ที่ส่งอีเมล (ใน apache เคสของฉัน) แต่ฉันต้องการค้นหาสคริปต์ที่มีต้นกำเนิดมาจากอีเมล

เป็นไปได้หรือไม่ฉันต้องติดตั้ง suexec หรือ mod_suphp เพื่อติดตาม trac ของมัน?

ขอบคุณสำหรับความช่วยเหลือ

คำตอบ:


9

php 5.3 ถูก slotted เพื่อให้ได้การติดตามเมลที่ดีขึ้น แต่ฉันไม่แน่ใจว่าเกิดอะไรขึ้น (แก้ไข: ใช่ php 5.3 มีการบันทึกในตัวแล้ว - php.ini มีตัวแปร config mail.log ซึ่งจะบันทึกการใช้จดหมายจากรหัส php)

เราแก้ไขปัญหาด้วยการทำให้ sendmail เป็นเชลล์สคริปต์ของ wrapper

ใน 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

ข้อเสนอแนะอีกประการหนึ่งคือการติดตั้งส่วนขยาย php suhosin เพื่อกระชับช่องโหว่ใน PHP ยกเว้นว่าคุณกำลังใช้ Debian หรือ Ubuntu ซึ่งนี่เป็นค่าเริ่มต้นอยู่แล้ว


php 4.x ที่นี่ (มีแอปเก่าที่ไม่สามารถย้ายไปยัง php 5.x ได้)
adam

ไม่มีปัญหากระดาษห่อนี้จะทำเคล็ดลับ เป็นภายนอกกับ php ฉันกล่าวถึง php 5.3 เพียงเพราะขาดคุณสมบัติการบันทึกนี้ถูกกำหนดให้แก้ไขโดยแล้ว เสื้อคลุมทำงานได้ดีมากและเราสามารถระบุสคริปต์ที่มีข้อบกพร่องโดยผู้ใช้ที่อนุญาตสแปม
ลาบราดอร์

ขอบคุณฉันคิดว่าฉันจะใช้แนวทางของคุณ ขอบคุณ
adam

1
สวัสดีอย่าตอนนี้ทำไม แต่ "script = $ {SCRIPT_NAME}, filename = $ {SCRIPT_FILENAME}" ไม่ได้ส่งคืนสิ่งที่เห็น: 7 20:24:08 ตัวบันทึกเกตเวย์: sendmail-php: client =, ชื่อไฟล์ =, pwd = / var / www / html / mail, uid = 48, ผู้ใช้ = apache
adam

คุณแน่ใจว่าตั้งค่าถูกต้องหรือไม่ หากไม่ทราบว่าเป็นตัวแปรที่กำหนดไว้ล่วงหน้าในสภาพแวดล้อม PHP ของคุณคุณควรเห็นด้วยเช่น: "script =," ในเอาต์พุตที่บันทึกไว้ ตรวจสอบสิ่งที่คุณติดตั้งอีกครั้งอย่างระมัดระวัง คุณสามารถลอง: $ _SERVER ['SCRIPT_FILENAME'] คุณอาจสามารถค้นหาตัวแปรเพิ่มเติมสำหรับการบันทึกจากเอกสารประกอบ PHP ในตัวแปรที่กำหนดไว้ล่วงหน้า: php.net/manual/th/reserved.variables.server.php
labradort

4

วิธีการแก้ปัญหานี้ต้องใช้จริง ๆ ไม่กี่ขั้นตอน วิธีการแก้ปัญหาของ labradort ด้านบนใช้งานไม่ได้เนื่องจากสคริปต์ตัวบันทึกเป็น bash script ไม่ใช่ 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
นี่เป็นวิธีที่ข้อบกพร่องของ shellshock ถูกใช้อย่างแม่นยำ ฉันไม่แนะนำให้ทำสิ่งนี้อย่างจริงจัง
Ben Hitchcock

คุณมีประเด็น แน่นอนคุณสามารถเรียกใช้ตัวแปรผ่านฟังก์ชัน sanitize เพื่อกำจัดสิ่งที่เป็นอันตรายเช่น "() {:;};" อาจเป็นความคิดที่ดีที่จะใส่คำนำหน้าชื่อตัวแปรด้วยเช่น "PHP_" ในกรณีที่มีชื่อตัวแปรสภาพแวดล้อมขัดแย้งกัน
Tom McQuarrie

2

มีโปรแกรมแก้ไขสำหรับ PHP ที่จะแสดงสคริปต์ที่สร้างอีเมลโดยการเพิ่มส่วนหัวของอีเมลที่ถูกส่ง ฉันยังไม่ได้ทดสอบเพราะฉันไม่กระตือรือร้นที่จะแก้ไข core PHP แต่ฉันได้ยินสิ่งดีๆ


1
ดูเหมือนจะเป็นวิธีที่ยอดเยี่ยมที่จะไป +1 อย่างไรก็ตามหากคุณจัดการโฮสต์ที่ใช้ร่วมกันกับไคลเอนต์หลายรายคุณอาจต้องการแจ้งไคลเอ็นต์เหล่านั้นเกี่ยวกับส่วนหัวหรือเปลี่ยนเส้นทางเอาต์พุตไปยังล็อกไฟล์แทน
Pekka

ใช่บางทีมันเป็นวิธีที่จะไป แต่ ณ จุดหนึ่งมันเป็นปัญหาด้านความปลอดภัยของฉันทุกคนกำลังจะไปตอนนี้สิ่งที่สคริปต์จะส่งอีเมลสคริปต์ที่ทำไม่ดีเพียงแค่เชิญให้แฮ็ค เปลี่ยนเส้นทางไปยังบันทึกอาจจะดีกว่า
adam

สคริปต์ที่ทำมาไม่ดีไม่ควรอยู่บนเซิร์ฟเวอร์ในตอนแรกผู้คนจะพบพวกเขาหากมี (โดยเฉพาะถ้าพวกเขาเป็นส่วนหนึ่งของระบบ cms ที่เป็นที่นิยม) แต่ฉันทราบว่าอาจมีกรณีต่อโซลูชันนี้
WheresAlice

0

คุณจะต้อง grep บันทึกการเข้าถึงสำหรับสิ่งที่เหมาะกับกรอบเวลาของเมื่อมีการเพิ่มข้อความในสปูล


ขอบคุณสำหรับการเล่นซ้ำปัญหาคือโฮสติ้งที่ใช้ร่วมกันและสำหรับแต่ละโดเมนนั้นเป็นบันทึกการเข้าถึงเฉพาะ
ดัม

ใช่น่าเสียดายที่คุณต้อง grep ผ่านพวกเขาทั้งหมด
Richard Salts

0

อาจเป็นเพียงการค้นหาผ่านไฟล์ต้นฉบับเพื่อหา "mail (" substring?


นั่นเป็นสิ่งที่ควรค่าแก่การดูและโดยเฉพาะอย่างยิ่งการดูซอร์สโค้ดโดยรอบเพื่อหาช่องโหว่ที่ผู้ส่งสแปมจะใช้ แต่ด้วยสคริปต์ php ที่ซับซ้อนจำนวนมากที่หลาย ๆ คนเป็นเจ้าของบนโฮสต์ที่ใช้ร่วมกันจึงไม่ใช่วิธีแก้ปัญหานี้
WheresAlice

ในสภาพแวดล้อมการโฮสต์ที่ใช้ร่วมกันสิ่งนี้อาจไม่ได้ระบุสคริปต์ที่แน่นอนหรืออาจส่งผลให้เกิดผลบวกปลอมหลายอย่าง
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.