Hablando con un nodero estábamos comentando sobre cómo vulnerar un phishing y obtener el máximo de información posible.
En este caso no he buscado vulnerabilidades pero creo que es un buen momento de explicar cómo funcionan los EmailInjection. Como yo soy guionista de películas todo lo que cuento es pura especulación y entretenimiento.
Los ataques Email Injection se producen por la misma causa por la que se producen los ataques SQL Injection: embeber código de otro lenguaje de programación. Cuando la aplicación tiene algún formulario cuyo resultado es enviar un email, el atacante puede manipular el formato MIME e introducir código adicional para modificar el comportamiento, pudiendo cambiar emisores, receptores, contenidos, etc.
El formato MIME utiliza un salto de línea para delimitar la información en un mensaje, y el mensaje raw determina su destinación, por lo que añadiendo saltos de línea a los datos del formulario puede hacer que se envíen miles de emails, que es lo que haría un spammer.
El ataque Email Injection en PHP es un tipo de ataque que va directo a la función email de PHP. Permite al atacante inyectar contenido extra en cualquiera de los campos como BCC, CC, Asunto, etc, y enviar miles de emails desde el servidor de la víctima. También se le llama mail form spamming. Esta vulnerabilidad no está limitada a PHP, afecta a cualquier lenguaje que acepte formularios de usuarios para enviar emails.
La función mail() de PHP es la siguiente:
Tiene 3 parámetros obligatorios y dos opcionales.
Vamos a ver un formulario de envío de mail con código vulnerable:
$from va como parámetro opcional en la función mail, pero cuando se envía un correo siempre ha de haber un From, puede establecerse también desde el php.ini. Si no está establecido en mail() o en php.ini dará error.
El principal problema de cualquier ataque Injection es confiar en los contenidos que el usuario va a introducir en el formulario, que hace que no se validen ni filtren correctamente. En el formulario anterior la función mail recibe los argumentos sin ningún tipo de validación previa: subject, message y from. Suponiendo que se rellena el formulario sin malas intenciones, la función podría recibir los siguientes argumentos. El remitente, el destinatario, el formulario en sí…
Desde el punto de vista del atacante, existen un gran número de campos adicionales que se pueden inyectar en el header del email. Se puede obtener más información sobre ello en el RFC 822. Por ejemplo puede añadir más CC que permite al atacante añadir más receptores, para ello tiene que añadir una nueva línea que separa cada campo (en los siguientes ejemplos el salto de línea es en formato hexadecimal 0x0A).
Inyectar más de un email como destinatarios:
En este caso no he buscado vulnerabilidades pero creo que es un buen momento de explicar cómo funcionan los EmailInjection. Como yo soy guionista de películas todo lo que cuento es pura especulación y entretenimiento.
Los ataques Email Injection se producen por la misma causa por la que se producen los ataques SQL Injection: embeber código de otro lenguaje de programación. Cuando la aplicación tiene algún formulario cuyo resultado es enviar un email, el atacante puede manipular el formato MIME e introducir código adicional para modificar el comportamiento, pudiendo cambiar emisores, receptores, contenidos, etc.
El formato MIME utiliza un salto de línea para delimitar la información en un mensaje, y el mensaje raw determina su destinación, por lo que añadiendo saltos de línea a los datos del formulario puede hacer que se envíen miles de emails, que es lo que haría un spammer.
El ataque Email Injection en PHP es un tipo de ataque que va directo a la función email de PHP. Permite al atacante inyectar contenido extra en cualquiera de los campos como BCC, CC, Asunto, etc, y enviar miles de emails desde el servidor de la víctima. También se le llama mail form spamming. Esta vulnerabilidad no está limitada a PHP, afecta a cualquier lenguaje que acepte formularios de usuarios para enviar emails.
La función mail() de PHP es la siguiente:
Código:
bool mail (string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters ]] )
Tiene 3 parámetros obligatorios y dos opcionales.
Vamos a ver un formulario de envío de mail con código vulnerable:
Código:
<form method="POST" action="<?=$_SERVER['PHP_SELF'];?>">
From: <input type="text" name="sender"> <br>
Subject : <input type="text" name="subject"> <br>
Message : <textarea name="message" rows="10" cols="60" lines="20"></textarea> <br>
Enviar : <input type="submit" name="send" value="Send">
</form>
<?php
// Email de la persona que recibirá el email
$to = "ejemplo@ejemplo.com";
if(isset($_POST["send"])){
$subject = $_POST['subject'];
$message = $_POST['message'];
$from = $_POST['sender'];
// Enviar email :
if (mail($to, $_POST['subject'], $_POST['message'], "From: $from\n")){
echo "Tu email se ha enviado correctamente";
} else {
echo "Ha ocurrido un error y no se ha podido enviar el email.";
}
}
$from va como parámetro opcional en la función mail, pero cuando se envía un correo siempre ha de haber un From, puede establecerse también desde el php.ini. Si no está establecido en mail() o en php.ini dará error.
El principal problema de cualquier ataque Injection es confiar en los contenidos que el usuario va a introducir en el formulario, que hace que no se validen ni filtren correctamente. En el formulario anterior la función mail recibe los argumentos sin ningún tipo de validación previa: subject, message y from. Suponiendo que se rellena el formulario sin malas intenciones, la función podría recibir los siguientes argumentos. El remitente, el destinatario, el formulario en sí…
Código:
mail("ejemplo@ejemplo.com", "Esto es un saludo", "Hola que tal, ¿Como estas?", "From: amigo@otraweb.com");
Desde el punto de vista del atacante, existen un gran número de campos adicionales que se pueden inyectar en el header del email. Se puede obtener más información sobre ello en el RFC 822. Por ejemplo puede añadir más CC que permite al atacante añadir más receptores, para ello tiene que añadir una nueva línea que separa cada campo (en los siguientes ejemplos el salto de línea es en formato hexadecimal 0x0A).
Inyectar más de un email como destinatarios:
Código:
From:amigo@otraweb.com**%0A**Cc:otro@dominio.com,**%0A**Bcc:otromas@otrodominio.com