Aviso si está a salvo de la inyección del encabezado de correo PHP [duplicado]

2

Dado que solo comencé a aprender sobre la inyección de cabecera en la función de correo () de PHP, no estoy seguro de si el formulario / código a continuación es vulnerable al ataque y estoy pidiendo consejo.

He estado construyendo esto lentamente durante un largo período de tiempo, y no sería un "Camper Feliz" si estuviera sujeto a ataques.

Formulario integrado de PHP y envío

<?php

$target_site = 'http://www.somewhere.xxx/some_folder/try_to_access.php';

if (isset($_SERVER['HTTP_REFERER']) && preg_match("/".preg_quote($target_site,"/")."/i",$_SERVER['HTTP_REFERER'])) {


$file = "good_emails.txt";

$lines = count(file($file));


if ($lines > 100) {


header("Location: not_available_to_submit.php");

}

else {


if(isset($_POST['submit'])) {

if(trim($_POST['email']) == '')  {
$hasError = true;
} else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$",   trim($_POST['email']))) {
$hasError = true;

echo "<font color=\"#CC3300\"><b>ERROR! Please enter a valid E-mail address.</b></font>";

} 

else {


if(trim($_POST['accept_terms']) == '') {
$hasError = true;

echo "<font color=\"#CC3300\"><b>ERROR! Please accept the terms and conditions.</b></font>";


} else {

$accept_terms = trim($_POST['accept_terms']);

}

$email = trim($_POST['email']);


}


if(!isset($hasError)) {

include 'form_validater.php';

}
}

}


}

else {


header("Location: improper_referer.php");

}


?>


<!DOCTYPE html>
<head>

</head>

<body>

<h2>Enter your E-mail address.</h2>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

<input type="checkbox" name="accept_terms" value="accepted-terms" id="accept_terms" />
<i>Check the box if you accept the terms and conditions.</i>

<br><br>

<input type="text" size="35" name="email"> 
<input id="button" type="submit" name="submit" value="Submit" />

</form>
<br>
<b><u>Privacy policy:</u></b>
<br>
Email remains safe and not resold. You will receive an E-mail shortly after your submission, in order to <b>confirm.</b>

</body>
</html>

Y mi script de validación de formularios: form_validater.php

<?php

$emails = file_get_contents("good_emails.txt");

$email = $_POST['email'];

if ( preg_match( "/(?:^|\W){$email}(?:\W|$)/", $emails ) ) {


header('Location: exists_sorry.php');

}

else {

header('Location: thank_you.php');

$server_address = $_SERVER['SERVER_ADDR'];
$port_used = $_SERVER['SERVER_PORT'];
$ip_address = $_SERVER['REMOTE_ADDR'];


$today = mktime(0, 0, 0, date("m"), date("d"), date("y"));

$today2 = date('Y-m-d H:i:s', time() );


$currenttime = date('h:i:s:u');
list($hrs,$mins,$secs,$msecs) = split(':',$currenttime);


$email = $_POST['email'];

$to = "[email protected]";
$subject = "New Email Address sent";
$headers = "From: $email\n";

$message = "A visitor to your site has sent the following email address to be added.\n
Email Address: $email

Used on Date: $today2

IP Address: $ip_address
Server address: $server_address
Port used: $port_used";

$user = "$email";

$usersubject = "Please confirm your email.";

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

$hash = hash('sha256', "mysalt".$email."addingmoresalt");


$usermessage = "Please click the link below to confirm your E-mail address: \n\nhttp://www.somewhere.xxx/confirm.php?email=".urlencode($email)."&hasher=$hash
\n
If you feel that you did not authorize this, simply ignore this message.";

mail($to,$subject,$message,$headers);

mail($user,$usersubject,$usermessage,$userheaders);

$f = fopen('tmp_emails.txt', 'a+');

fwrite($f, $email." ");

fwrite($f, "Used on ".date("m/d/Y", $today). (" $hrs:$mins:$secs")." ");

fwrite($f, "IP address: ".$ip_address."\n");

fclose($f);


}

?>
    
pregunta Funk Forty Niner 14.06.2012 - 23:46
fuente

1 respuesta

3

La función mail() usa un parámetro additional_headers , que podría usarse para establecer otros encabezados. Solo tienes que separarlos por un carácter de nueva línea.

Esto es lo que tienes que verificar: Digamos que tienes una entrada que te permite escribir To: e-mail. Usted escribe allí por ejemplo. [email protected] y el correo electrónico se envía a esa dirección. Intente inyectar otro encabezado, digamos Bcc: :

No debe olvidarse de verificar si el código no es vulnerable a la inyección SMTP. Digamos que su script genera comandos SMTP:

MAIL FROM: [email protected]
RCPT TO: [email protected]
DATA
From: [email protected]
To: [email protected]
Subject: Important e-mail
text

.

Estos comandos se pueden generar a solicitud: [email protected]&Subject=Important+e-mail&message=text .

Sin embargo, podría intentar inyectar otros comandos en el parámetro Asunto de la siguiente manera: [email protected]&Subject=Important+e-mail%0d%0a%2e%0d%0aMAIL+FROM:[email protected]%0d%0aRCPT+TO:[email protected]%0d%0aDATA%0d%0aFrom:[email protected]%0d%0aTo:[email protected]%0d%0aSubject:+Bum%0d%0ainjected%0d%0a%2e%0d%0a&message=text Si su aplicación web es vulnerable, generará dos mensajes de correo electrónico diferentes:

MAIL FROM: [email protected]
RCPT TO: [email protected]
DATA
From: [email protected]
To: [email protected]
Subject: Important e-mail
text

.
MAIL FROM: [email protected]
RCPT TO: [email protected]
DATA
From: [email protected]
To: [email protected]
Subject: Bum
injected

.

    
respondido por el p____h 12.07.2012 - 17:24
fuente

Lea otras preguntas en las etiquetas