web-dev-qa-db-fra.com

Est-il possible d'envoyer des paquets HTTP via une IP usurpée?

J'ai le PHP qui écrit accepted dans un fichier nommé text.txt uniquement si l'IP est égal à 127.0.0.1 (bouclage). Si l'IP ne fonctionne pas match it écrit 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']);
}
?>

Puis-je envoyer la demande get (www.example.com/get.php?output=123) à partir d'un réseau externe avec une adresse IP falsifiée de 127.0.0.1? Si c'est possible, comment faire? Sinon, pourquoi?

6
user111609

Est-il possible d'envoyer des paquets HTTP via une IP usurpée?

Non tu ne peux pas.

HTTP est un protocole au-dessus de TCP et faire de l'usurpation d'adresse IP avec TCP est presque impossible en raison des internes du protocole. Vous n'auriez pas seulement besoin d'envoyer un seul paquet usurpé comme dans UDP mais vous devrez en fait répondre aux paquets de l'homologue avec les numéros de séquence correspondants sans pouvoir regarder les paquets homologues qui contiennent ce numéro de séquence que vous devez associer. Et cette réponse doit se produire juste pour établir la connexion, c'est-à-dire avant même d'envoyer votre charge utile HTTP.

En dehors de cela, de nombreux systèmes abandonneront simplement les paquets qui ne correspondent pas aux routes, c'est-à-dire qu'un paquet prétendant provenir de 127.0.0.1 (localhost) ne devrait jamais arriver sur la carte réseau connectée au réseau local.

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

Mais étant donné votre code, vous pourriez en fait être plus intéressé si la valeur dans $_SERVER['REMOTE_ADDR'] pourrait être usurpé. Bien que la plupart supposent qu'il s'agit de l'adresse IP source du client, elle peut en fait être différente de l'IP source réelle de la connexion HTTP et elle peut même être manipulable par un attaquant.

Dans le cas d'un proxy inverse (ou équilibreur de charge) devant le serveur Web, la véritable IP du client n'est pas connue du serveur Web car la connexion du client se termine réellement au proxy inverse. Par conséquent, il n'est pas rare que le proxy inverse propage l'IP source des clients d'origine en insérant un en-tête HTTP, généralement X-Forwarded-For. Certains serveurs Web sont configurés pour mettre la valeur de cet en-tête dans $_SERVER['REMOTE_ADDR'] au lieu de l'IP source réelle. Et dans certaines situations, cela est en fait exploitable par l'attaquant pour contourner le contrôle d'accès basé sur IP comme dans votre cas.

Pour un exemple spécifique de ce type de contournement, voir Anatomie d'une attaque: comment j'ai piraté StackOverflow .

8
Steffen Ullrich

Ce n'est pas possible

Un paquet http usurpé devrait voyager sur une connexion TCP.

TCP a une poignée de main à 3 voies qui empêcherait la communication d'une adresse IP usurpée d'atteindre le code PHP PHP) du serveur.

Avant que les données d'application ne soient envoyées, voici ce qui se passerait:

VOUS envoyez TCP SYN avec IP usurpée

SERVEUR répond avec SYN-ACK à cette IP et attend un ACK, paquet de données de retour de cette IP.

Fin de la conversation!

Votre pile TCP n'enverrait que le paquet SYN et le système distant tenterait de renvoyer un paquet SYN-ACK à l'adresse IP usurpée que vous avez envoyée. Il n'obtiendrait jamais de réponse au SYN-ACK à partir de cette adresse IP usurpée même si elle existait et a reçu le paquet SYN-ACK car elle sait qu'elle n'a jamais envoyé le paquet SYN.

9
mcgyver5

Spoiler: vous ne pouvez pas.

Pantalon intelligent: si vous pouvez adapter la demande dans un seul paquet TCP, vous pouvez. Ou si vous contrôlez le routage vers l'adresse IP usurpée. Ou la machine avec l'adresse IP usurpée.

Mais: vous ne pourrez probablement pas le faire.

Le problème est le suivant: alors que HTTP est sans état, il utilise TCP, ce qui n'est pas le cas. En particulier, avant d'envoyer des données réelles, une poignée de main est effectuée pour établir des "règles de base" pour la communication.

Si un paquet avec une adresse IP usurpée est envoyé, la réponse du serveur sera envoyée à cette adresse IP, pas à la vôtre.

Cela signifie que vous ne pouvez pas terminer la négociation, donc n'envoyez aucune demande HTTP.

Plus précisément, si vous usurpez un paquet TCP SYN depuis IP a alors que vous ne voyez que les paquets envoyés à IP b, vous ne verrez pas le TCP ACK paquet que le serveur envoie à A. Par conséquent, vous ne pouvez pas créer un autre paquet usurpé pour établir correctement une connexion TCP.

Pour plus de lecture, je suggère votre moteur de recherche préféré et "TCP".

4
Tobi Nary