PDA

Bekijk Volledige Versie : Spam?



CharlieRoot
28/11/05, 08:58
Ik heb het idee dat er heel veel spam verzonden word vanaf een van onze servers. Ik heb dus meteen chkrootkit en rkhunter laten draaien maar niets gevonden.

Hoe kan ik goed zien welke klant dit op zijn geweten heeft ?

JayvD
28/11/05, 09:00
Ehm.. je geeft aan dat je het idee hebt dat het gebeurd.. Zou het misschien niet handig zijn om precies te weten of het wordt gedaan of niet?

Swiftway-UK
28/11/05, 10:15
Ook even alle php zaken nalopen, vaak is het een lek script. Is je /tmp directory non executable?

Spam word meestal niet verzonden van een server die geroot is ;)

ju5t
28/11/05, 11:22
Wat dacht je eens van simpelweg je mail logs nalopen?

CharlieRoot
28/11/05, 15:04
Origineel geplaatst door getUP
Wat dacht je eens van simpelweg je mail logs nalopen?

Gedaan, maar kon niets vinden.. anders zou ik het hier niet vragen he?

Iemand een idee hoe ik er achter kom? Krijg veel bounces terug van AOL, afzender van de spammail is iets van bla@server.domein.nl en dus een niet bestaand adres.

Deimos
28/11/05, 15:22
Ik heb het vermoeden dat je het slachtoffer bent van PHP email header injections. Wat je moet doen is toch je maillog nalopen op het message-id van het bericht dat niet kon worden afgeleverd.

®on
28/11/05, 15:30
Origineel geplaatst door CharlieRoot
Krijg veel bounces terug van AOL
Gokje: http://www.anders.com/cms/75/Crack.Attempt/Spam.Relay

Deimos
28/11/05, 16:38
Veel klanten hebben er overigens ook last van gehad. Bij de gevonden fouten hebben wij voor de klant de volgende PHP code geintegreerd (gebaseerd op het voorbeeld op de php site)



/**
* Valideer stuk erin gooien om SPAM tegen te gaan
*/

require_once('Validate.php'); // Standaard PEAR validate class op de server

// Host names from where the form is authorized
// to be posted from:

$authHosts = array("domeinnaam.nl","domeinnaam2.nl");

// Where have we been posted from?
$fromArray = parse_url(strtolower($_SERVER['HTTP_REFERER']));

// Test to see if the $fromArray used www to get here.
$wwwUsed = strpos($fromArray['host'], "www.");

// Make sure the form was posted from an approved host name.
if(!in_array(($wwwUsed === false ? $fromArray['host'] : substr(stristr($fromArray['host'], '.'), 1)), $authHosts)){
header("HTTP/1.0 403 Forbidden");
exit;
}

// Attempt to defend against header injections:
$badStrings = array("Content-Type:",
"MIME-Version:", "Content-Transfer-Encoding:",
"bcc:",
"cc:");

// Loop through each POST'ed value and test if it contains
// one of the $badStrings:
foreach($_POST as $k => $v){
foreach($badStrings as $v2){
if(strpos($v, $v2) !== false){
header("HTTP/1.0 403 Forbidden");
exit;
}
}
}




Verder wordt er op de email velden de validate functie uit Pear gebruikt. Deze controleert het email veld.



if(Validate::email(trim($_POST['from_mail'])))
echo 'Valid';

CharlieRoot
29/11/05, 00:36
Origineel geplaatst door headout

Gokje: http://www.anders.com/cms/75/Crack.Attempt/Spam.Relay
Precies!

Gek genoeg, ik krijg hem ook terug van een site die ik zelf gescript heb. Die is absoluut niet daarvoor te gebruiken (Hij pakt de TO of BCC niet uit post fields maar uit harde code)

Iemand enig idee?

Deimos
29/11/05, 00:38
Paste die source anders even, dan kunnen we kijken. Nu weten we niet wat de constructie is en blijft het gissen.

CharlieRoot
29/11/05, 00:50
Een van de sites waar dit om draait hééft niet eens een contact script (maar in de header staat wel die site opgegeven).

klant heeft dit

<?

//Checks to see if the name, message or email fields are empty. You can delete or add fields as needed.^M

$name = $_POST["name"];

if ( (!empty($name)) && (!empty($_POST["message"])) && (!empty($_POST["email"])) )

$name = stripslashes($_POST["name"]);
$message = stripslashes($_POST["message"]);
$headers = 'From: '.$_POST["email"].'';

mail($youremail, $subject,"
naam: ".$_POST["name"]."
email: ".$_POST["email"]."
onderwerp: ".$_POST["department"]."
boodschap:". $_POST["message"] ."

",$headers);

?>

maxnet
29/11/05, 01:51
Het probleem zit hem in de volgende regel:


Origineel geplaatst door CharlieRoot

$headers = 'From: '.$_POST["email"].'';


Als er in $_POST["email"] newlines worden meegegeven is het mogelijk headers toe te voegen waaronder Bcc.

Zorg er altijd voor dat je invoer van de gebruiker eerst door een reguliere expressie haalt of anderzijds controleert.

Digiover
29/11/05, 08:22
Origineel geplaatst door maxnet
Als er in $_POST["email"] newlines worden meegegeven is het mogelijk headers toe te voegen waaronder Bcc.

Zorg er altijd voor dat je invoer van de gebruiker eerst door een reguliere expressie haalt of anderzijds controleert.
http://securephp.damonkohler.com/index.php/Email_Injection


<?PHP
function doCheckInput ( $Input )
{

/*
* Function to check for bad input, such as linefeed and/or carriage return characters
* linefeed (ASCII code 10, \n) is: 0x0A / %0A
* carriage return (ASCII code 13, \r) is 0x0D / %0D
*
*/

if (eregi("\r",$Input) || eregi("\n",$Input) || eregi("%0A",$Input) || eregi("%0D",$Input) )
{
die("Wrong value submitted in form.<br><a href=\"javascript:history.back(-1)\">Go back and try again</a>.");
}
return $Input;
}

?>

En dan in je mailscript:
$fromName = doCheckInput ( $_POST['fromName'] );
$subject = doCheckInput ( $_POST['subject'] );
$fromEmail = doCheckInput ( $_POST['fromEmail'] );
...

Overigens is deze "bug" (om het zo maar te noemen) al jaren bekend en geldt het niet alleen voor PHP. In ASP is het net zo goed mogelijk.