¿Es posible enviar un paquete HTTP a través de una IP falsificada?

3

Tengo el siguiente código PHP que escribe accepted en un archivo llamado text.txt solo si la IP es igual a 127.0.0.1 (loopback). Si la IP no coincide, escribe denied .

<?php
$file = fopen('text.txt' , 'a');
if($_SERVER['REMOTE_ADDR'] === '127.0.0.1') {
$request = $_GET['output'];
if($request === '123') {
fwrite($file, "\x0D\x0A".'accepted - ' .$_SERVER['REMOTE_ADDR']);

}

}
else {  
    fwrite($file, "\x0D\x0A".'denied - ' .$_SERVER['REMOTE_ADDR']);
}
?>

¿Puedo enviar la solicitud de obtención (www.example.com/get.php?output=123) desde una red externa con una IP falsificada de 127.0.0.1? Si es posible, ¿cómo puedo hacerlo? Si no, ¿por qué?

    
pregunta Anders 25.05.2016 - 18:13
fuente

3 respuestas

5
  

¿Es posible enviar paquetes HTTP a través de IP falsificada?

No, no puedes.

HTTP es un protocolo en la parte superior de TCP y hacer la suplantación de IP con TCP es casi imposible debido a los elementos internos del protocolo. No solo tendría que enviar un solo paquete falsificado como en UDP, sino que también tendría que responder a los paquetes del interlocutor con los números de secuencia coincidentes sin poder ver los paquetes homólogos que contienen este número de secuencia que necesita. Y esta respuesta debe ocurrir solo para establecer la conexión, es decir, incluso antes de enviar su carga HTTP.

Aparte de eso, muchos sistemas simplemente eliminarán los paquetes que no se ajustan a las rutas, es decir, un paquete que se afirma que es 127.0.0.1 (localhost) nunca debe ingresar en la tarjeta de red conectada a la red local.

if($_SERVER['REMOTE_ADDR'] === '127.0.0.1') {

Pero dado su código, podría estar más interesado si el valor en $_SERVER['REMOTE_ADDR'] pudiera ser falsificado. Aunque la mayoría asume que esta es la dirección IP de origen del cliente, en realidad puede ser diferente de la IP de origen real de la conexión HTTP e incluso podría ser manipulable por un atacante.

En el caso de un proxy inverso (o equilibrador de carga) frente al servidor web, el servidor web no conoce la IP real del cliente porque la conexión del cliente realmente termina en el proxy inverso. Por lo tanto, no es infrecuente que el proxy inverso propague la IP de origen de los clientes originales insertando un encabezado HTTP, generalmente X-Forwarded-For . Algunos servidores web están configurados para poner el valor de este encabezado en $_SERVER['REMOTE_ADDR'] en lugar de la IP de origen real. Y, en algunas situaciones, el atacante puede explotarlo para omitir el control de acceso basado en IP como el empleado en su caso.

Para un ejemplo específico de este tipo de bypass, vea Anatomía de un Ataque: Cómo hackeé StackOverflow .

    
respondido por el Steffen Ullrich 25.05.2016 - 18:23
fuente
7

No es posible

Un paquete http falso tendría que viajar a través de una conexión TCP.

TCP tiene un protocolo de enlace de 3 vías que evitaría que la comunicación de una dirección IP falsificada llegara al código PHP del servidor.

Antes de que se empiecen a enviar los datos de la aplicación, esto es lo que sucedería:

USTED envía TCP SYN con IP falsificada

SERVIDOR responde con SYN-ACK a esa IP y espera un ACK, el paquete de datos de esa IP.

Fin de la conversación!

Su pila TCP solo enviará el paquete SYN y el sistema remoto intentará enviar un paquete SYN-ACK de nuevo a la IP falsificada que envió. Nunca obtendría una respuesta al SYN-ACK de esa IP falsificada, incluso si existiera y recibiera el paquete SYN-ACK porque sabe que nunca envió el paquete SYN.

    
respondido por el mcgyver5 25.05.2016 - 18:26
fuente
3

Spoiler: no puedes.

Pantalón inteligente: si puede ajustar la solicitud en un solo paquete TCP, puede hacerlo. O si controla el enrutamiento a la IP falsificada. O la máquina con la IP que está falsificada.

Pero: probablemente no podrás hacer eso.

El problema es: si bien HTTP no tiene estado, usa TCP, que no lo es. Especialmente, antes de enviar los datos reales, se realiza un apretón de manos para establecer "reglas básicas" para la comunicación.

Si se envía un paquete con una IP falsificada, la respuesta del servidor se enviará a esa IP, no a la suya.

Eso significa que no puede completar el protocolo de enlace, por lo tanto, no envíe ninguna solicitud HTTP.

Más precisamente, si falsifica un paquete TCP SYN de IP por un tiempo, solo verá que los paquetes se envían a IP b, no verá el paquete TCP ACK que el servidor envía a. Por lo tanto, no puede crear otro paquete falsificado para establecer correctamente una conexión TCP.

Para obtener más información, sugiero su motor de búsqueda favorito y "TCP".

    
respondido por el Tobi Nary 25.05.2016 - 18:22
fuente

Lea otras preguntas en las etiquetas