web-dev-qa-db-fra.com

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

Est-il possible de truquer ou de détourner un contenu de $_SERVER['REMOTE_ADDR'] variable?

Je voudrais simuler une demande avec:

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

Comment pourrais-je faire ça avec PHP? CURL peut-il le faire d'une manière ou d'une autre?

64
Richard Knop

Je suppose que vous voulez faire semblant à distance. La réponse courte est oui, vous le pouvez. La longue réponse sur la facilité de cette opération dépend de la façon dont vous voulez la simuler.

Si vous ne vous souciez pas de recevoir une réponse, c'est aussi trivial que d'ouvrir un socket brut à la destination et de forger l'adresse IP source. Je ne sais pas si c'est vraiment facile à faire dans PHP puisque toutes les implémentations de socket de PHP sont au niveau ou au-dessus du niveau TCP. Mais je suis sûr c'est possible. Maintenant, comme vous ne contrôlez pas le réseau, la réponse ne vous reviendra pas. Cela signifie donc que vous ne pouvez pas (de toute façon de manière fiable) créer une connexion TCP via un trivial forged TCP header (puisque le syn-ack empêche cela en exigeant une communication bidirectionnelle).

Cependant, si vous pouvez compromettre la passerelle hors IP, vous pouvez faire ce que vous voulez. Donc, si vous compromettez le routeur wifi auquel un ordinateur est connecté, vous pouvez prétendre être cet ordinateur et le serveur ne fera pas la différence. Si vous compromettez le routeur sortant du FAI, vous pouvez (en théorie du moins) prétendre être l'ordinateur et le serveur ne fera pas la différence.

Pour plus d'informations, consultez ces 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/le serveur local. Et à ce stade, est-ce vraiment important?

Important

Si vous utilisez un framework pour accéder à ces informations, soyez absolument sûr qu'il ne vérifie pas le X-HTTP-FORWARDED-FOR entête! Sinon, il est trivial de truquer l'adresse IP. Par exemple, si vous utilisez Zend Framework Zend_Controller_Request_Http::getClientIp , assurez-vous de passer false comme paramètre! Sinon, quelqu'un a juste besoin 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ù l'utilisation d'un framework sans comprendre comment il fonctionne dans le backend peut vraiment être mauvaise ...

Modifier: pertinent

J'ai récemment écrit un article de blog sur la façon dont je suis tombé sur une vulnérabilité dans l'application StackOverflow. C'est très pertinent ici, car il exploite un mécanisme très similaire à ce que recherche cette question (bien que les circonstances qui l'entourent soient quelque peu étroites):

Comment j'ai piraté StackOverflow

106
ircmaxell

L'adresse distante n'est pas quelque chose ajouté par courtoisie, elle est utilisée dans le protocole IP pour router les packages, donc si vous envoyez un package avec une fausse adresse , vous ne recevrez pas de réponse, et puisque vous ' re parler d'une demande HTTP, qui est délivrée sur une TCP, qui prend plusieurs paquets IP (et les réponses correspondantes) pour configurer:

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

17
Michael Borgwardt

Apache remplit $_SERVER['REMOTE_ADDR'] à partir d'un socket TCP qu'il utilise pour communiquer avec votre navigateur. Il est [~ # ~] impossible [~ # ~] pour influencer cette variable sur l'internet ouvert à cause 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 flairer le fil et terminer la poignée de main.

12
rook

Si vous naviguez via un proxy, $_SERVER['REMOTE_ADDR'] peut être défini sur l'adresse IP du proxy plutôt que sur 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 l'utilisateur final:

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

Cependant, si l'utilisateur procède à un proxy en utilisant un proxy mal configuré, ou un proxy malveillant, ou conçu pour anonymiser l'utilisateur final, vous ne pourrez garantir aucun des en-têtes autres que REMOTE_ADDR (ce qui ne vous mènerait qu'au proxy).

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

8
Spudley

Vous pouvez remplacer n'importe quel élément dans le $_SERVER tableau, y compris celui que vous mentionnez, dans votre serveur; bien sûr, pas chez quelqu'un d'autre.

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

7
Álvaro González

REMOTE_ADDR

L'adresse IP à partir de laquelle l'utilisateur affiche la page actuelle.

Vous pouvez demander un script à l'aide d'un proxy, etc. pour modifier l'adresse IP, mais vous ne pouvez pas y définir le texte de votre choix.

3
hsz

Il s'agit d'une variable définie par Apache ou quel que soit le serveur que vous utilisez. Vous ne pouvez pas l'usurper. Vous pouvez exécuter $_SERVER['REMOTE_ADDR']='127.0.0.1'; au début des scripts, mais je doute que c'est ce que vous essayez de faire

3
Quamis