È possibile inviare pacchetti HTTP tramite IP falsificato?

3

Ho il seguente codice PHP che scrive accepted in un file denominato text.txt solo se l'IP è uguale a 127.0.0.1 (loopback). Se l'IP non corrisponde, scrive 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']);
}
?>

Posso inviare la richiesta get (www.example.com/get.php?output=123) da una rete esterna con un IP falsificato di 127.0.0.1? Se è possibile, come posso farlo? In caso negativo, perché?

    
posta Anders 25.05.2016 - 18:13
fonte

3 risposte

6

Is it possible to send HTTP packet via spoofed IP?

No non puoi.

HTTP è un protocollo su TCP e fare lo spoofing IP con TCP è quasi impossibile a causa degli interni del protocollo. Non solo avresti bisogno di inviare un singolo pacchetto spoofato come in UDP, ma dovresti effettivamente rispondere ai pacchetti del peer con i numeri di sequenza corrispondenti senza poter guardare i pacchetti peer che contengono questo numero di sequenza che devi abbinare. E questa risposta deve accadere solo per stabilire la connessione, cioè prima ancora di inviare il payload HTTP.

A parte il fatto che molti sistemi abbandonano semplicemente pacchetti che non si adattano ai percorsi, vale a dire che un pacchetto che dichiara di provenire da 127.0.0.1 (localhost) non dovrebbe mai entrare nella scheda di rete connessa alla rete locale.

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

Ma dato il tuo codice potresti essere più interessato se il valore in $_SERVER['REMOTE_ADDR'] potrebbe essere falsificato. Mentre la maggior parte suppone che questo sia l'indirizzo IP di origine del client, in realtà può essere diverso dal reale IP sorgente della connessione HTTP e potrebbe anche essere manipolabile da un utente malintenzionato.

In caso di proxy inverso (o bilanciamento del carico) di fronte al server Web, l'IP reale del client non è noto al server Web perché la connessione dal client termina effettivamente sul proxy inverso. Pertanto, non è raro che il proxy inverso propaghi l'IP di origine dei client originali inserendo un'intestazione HTTP, in genere X-Forwarded-For . Alcuni server Web sono configurati per mettere il valore di questa intestazione in $_SERVER['REMOTE_ADDR'] invece del reale IP sorgente. E in alcune situazioni questo è effettivamente sfruttato dall'attaccante per aggirare il controllo degli accessi basato su IP come nel tuo caso.

Per un esempio specifico di questo tipo di bypass vedi Anatomia di un Attack: come ho hackerato StackOverflow .

    
risposta data 25.05.2016 - 18:23
fonte
7

Non è possibile

Un pacchetto http spoofed dovrebbe viaggiare su una connessione TCP.

TCP ha un handshake a 3 vie che impedisce alla comunicazione da un indirizzo IP falsificato di raggiungere mai il codice PHP del server.

Prima che i dati dell'applicazione inizino a essere inviati, ecco cosa succederebbe:

TU invia TCP SYN con IP falsificato

SERVER risponde con SYN-ACK a quell'IP e attende un ACK, pacchetto di dati da quell'IP.

Fine della conversazione!

Lo stack TCP invierà solo il pacchetto SYN e il sistema remoto tenterà di inviare un pacchetto SYN-ACK all'IP spoofato inviato. Non otterrebbe mai una risposta a SYN-ACK da quel IP falsificato anche se esisteva e riceveva il pacchetto SYN-ACK perché sapeva che non ha mai inviato il pacchetto SYN.

    
risposta data 25.05.2016 - 18:26
fonte
4

Spoiler: non puoi.

Smart pants: se riesci ad adattare la richiesta in un singolo pacchetto TCP, puoi farlo. O se controlli il routing sull'IP spoofato. Oppure la macchina con l'IP che è stata falsificata.

Ma probabilmente non sarai in grado di farlo.

Il problema è: mentre HTTP è senza stato, usa TCP, che non lo è. Soprattutto, prima di inviare qualsiasi dato reale, viene eseguita una stretta di mano per stabilire "regole di base" per la comunicazione.

Se viene inviato un pacchetto con un IP falsificato, la risposta dal server verrà inviata a quell'IP, non al tuo.

Questo significa che non puoi completare l'handshake, quindi non inviare richieste HTTP.

Più precisamente, se si contraffa un pacchetto TCP SYN dall'IP a mentre si vedono solo i pacchetti inviati a IP b, non si vedrà il pacchetto TCP ACK che il server invia a. Quindi, non è possibile creare un altro pacchetto spoofato per stabilire correttamente una connessione TCP.

Per ulteriori letture, ti suggerisco il tuo motore di ricerca preferito e "TCP".

    
risposta data 25.05.2016 - 18:22
fonte

Leggi altre domande sui tag