68 votes

Comment falsifier la variable $_SERVER['REMOTE_ADDR'] ?

Est-il possible de falsifier ou de détourner le contenu d'un site Web ? $_SERVER['REMOTE_ADDR'] variable ?

Je voudrais faire une fausse demande avec :

$_SERVER['REMOTE_ADDR']='127.0.0.1';

Comment puis-je faire cela avec PHP ? CURL peut-il le faire d'une manière ou d'une autre ?

114voto

ircmaxell Points 74865

Je suppose que vous voulez dire faire semblant à distance. La réponse courte est oui, vous le pouvez. La réponse longue, à savoir si c'est facile, dépend de la façon dont vous voulez le simuler.

Si vous ne vous souciez pas de recevoir une réponse, il suffit d'ouvrir un socket brut vers la destination et de falsifier l'adresse IP source. Je ne suis pas sûr que ce soit vraiment facile à faire en PHP puisque toutes les implémentations de socket de PHP sont au niveau ou au-dessus du niveau TCP. Mais je suis sûr que c'est possible. Maintenant, puisque vous ne contrôlez pas le réseau, la réponse ne vous sera pas renvoyée. Cela signifie donc que vous ne pouvez pas (de manière fiable) créer une connexion TCP via un faux en-tête TCP trivial (puisque le syn-ack empêche cela en exigeant une communication bidirectionnelle).

Cependant, si vous pouvez compromettre la passerelle d'où provient l'IP, vous pouvez faire ce que vous voulez. Ainsi, si vous compromettez le routeur wifi auquel un ordinateur est connecté, vous pouvez vous faire passer pour cet ordinateur et le serveur ne fera pas la différence. Si vous compromettez le routeur de sortie du FAI, vous pouvez (en théorie du moins) vous faire passer pour l'ordinateur et le serveur ne fera pas la différence.

Pour plus d'informations, consultez les liens suivants :

Cependant, vous ne pourrez forger que le 127.0.0.1 adresse de bouclage sous TCP si vous compromettez réellement la machine/serveur local. Et à ce moment-là, est-ce vraiment important ?

Important

Si vous utilisez un cadre pour accéder à ces informations, soyez absolument sûr qu'il ne vérifie pas le X-HTTP-FORWARDED-FOR en-tête ! Sinon, il est trivial de falsifier l'adresse IP. Par exemple, si vous utilisez L'interface de Zend Framework Zend_Controller_Request_Http::getClientIp soyez absolument sûr que vous passez false comme paramètre ! Sinon, il suffit d'envoyer un en-tête HTTP : X-Http-Forwarded-For: 127.0.0.1 et ils semblent maintenant être locaux ! C'est un cas où utiliser un framework sans comprendre comment il fonctionne en arrière-plan peut vraiment être mauvais...

Edit : Relevant

J'ai récemment écrit un article de blog sur la façon dont j'ai découvert par hasard une vulnérabilité dans l'application de StackOverflow. Elle est très pertinente ici, car elle exploite un mécanisme très similaire à celui que recherche cette question (bien que les circonstances qui l'entourent soient un peu plus restreintes) :

Comment j'ai piraté StackOverflow

18voto

Michael Borgwardt Points 181658

L'adresse distante n'est pas ajoutée par courtoisie, elle est utilisée dans le protocole IP pour acheminer les paquets. envoyer un colis avec une fausse adresse vous ne recevrez pas de réponse, et comme il s'agit d'une demande HTTP, celle-ci est transmise par une connexion TCP, qui nécessite plusieurs paquets IP (et les réponses correspondantes) pour se mettre en place :

Non, c'est impossible (sauf bien sûr en envoyant réellement la requête depuis le même hôte via l'interface de bouclage).

0 votes

De plus, il semble que cela nécessite une modification de votre pile TCP et du pilote de votre carte réseau.

12voto

Rook Points 34698

Apache remplit $_SERVER['REMOTE_ADDR'] à partir d'un socket TCP qu'il utilise pour communiquer avec votre navigateur. Il s'agit IMPOSSIBLE d'influencer cette variable sur l'internet ouvert en raison de la poignée de main à trois . Si le client et le serveur sont sur un réseau de diffusion, comme le wifi, alors vous pouvez renifler le fil et compléter la poignée de main.

9voto

Spudley Points 85371

Si vous naviguez via un proxy, $_SERVER['REMOTE_ADDR'] peut être défini sur l'adresse IP du proxy plutôt que sur celle de l'utilisateur final.

Il existe d'autres en-têtes que vous pouvez utiliser à la place dans ce cas : Cette page donne une fonction qui vérifie toutes les possibilités et fournit l'adresse la plus susceptible d'être celle de l'utilisateur final :

http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html

Cependant, si l'utilisateur utilise un proxy mal configuré, ou un proxy malveillant, ou encore un proxy conçu pour rendre l'utilisateur final anonyme, alors vous ne pourrez garantir aucun des en-têtes autres que REMOTE_ADDR (ce qui ne vous mènerait que jusqu'à la procuration).

Si votre utilisateur final navigue via HTTPS, alors REMOTE_ADDR sera toujours son adresse IP ; vous ne pouvez pas utiliser la redirection par proxy via HTTPS. Par conséquent, la seule façon d'être absolument sûr de son adresse est de l'amener à ouvrir votre site en HTTPS.

2 votes

Est-ce toujours une solution fiable 5 ans après ?

6voto

Álvaro G. Vicario Points 57607

Vous pouvez écraser n'importe quel élément du $_SERVER dont celui que vous mentionnez, dans votre serveur ; bien sûr, pas dans celui d'un autre.

Cependant, cela ne changera pas l'adresse IP de votre ordinateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X