如何伪造$ _SERVER ['REMOTE_ADDR']变量?

Ric*_*nop 66 php security

伪造或劫持$_SERVER['REMOTE_ADDR']变量内容是否可能?

我想伪造一个请求:

$_SERVER['REMOTE_ADDR']='127.0.0.1';
Run Code Online (Sandbox Code Playgroud)

我怎么能用PHP做到这一点?CURL能以某种方式做到这一点吗?

irc*_*ell 109

我认为你的意思是远程伪造它.简短的回答是肯定的.关于它是多么容易的长期答案取决于你想要伪造它的方式.

如果您不关心接收响应,那么打开原始套接字到目的地并伪造源IP地址就像是微不足道的.我不确定在PHP中是否真的很容易,因为所有PHP的套接字实现都达到或高于TCP级别.但我相信这是可能的.现在,由于您无法控制网络,因此响应不会再回复给您.这意味着你不能(可靠地)通过一个简单的伪造TCP头创建一个TCP连接(因为syn-ack通过要求双向通信来防止这种情况).

但是,如果你可以破坏IP关闭的网关,你可以做任何你想做的事情.因此,如果你破坏了计算机连接到的wifi路由器,你可以假装是那台计算机,而服务器将无法区分.如果您破坏了ISP的出站路由器,您(理论上至少)可以假装是计算机而服务器不能区分它们.

有关更多信息,请参阅以下链接:

但是,127.0.0.1如果您实际危及本地计算机/服务器,则只能在TCP下伪造环回地址.那时真的很重要吗?

重要

如果您使用框架来访问此信息,请确保它不检查X-HTTP-FORWARDED-FOR标头!否则,伪造IP地址是微不足道的.例如,如果您使用Zend Framework的Zend_Controller_Request_Http::getClientIp方法,请绝对确保您false作为参数传递!否则,有人只需要发送HTTP标头:X-Http-Forwarded-For: 127.0.0.1它们现在看起来是本地的!这是一个使用框架而不了解它在后端如何工作的情况可能真的很糟糕......

编辑:相关

我最近写了一篇关于我如何偶然发现StackOverflow应用程序中的漏洞的博客文章.这里非常相关,因为它利用了一个与这个问题所寻求的非常相似的机制(虽然它周围的情况有点狭窄):

我是如何破解StackOverflow的


Mic*_*rdt 17

远程地址不是出于礼貌添加的东西,它在IP协议中用于路由包,因此如果您发送带有虚假地址的包,您将不会收到响应,并且因为您正在谈论HTTP请求,这是通过TCP连接传递的,它需要几个IP数据包(以及匹配的响应)来设置:

不,这是不可能的(当然,实际上通过环回接口从同一主机发送请求).


roo*_*ook 12

Apache $_SERVER['REMOTE_ADDR'] 从用于与浏览器通信的TCP套接字填充.由于三次握手,在开放式互联网上影响这个变量是不可能的.如果客户端和服务器在广播网络上,如wifi,那么你可以嗅探线路并完成握手.


Spu*_*ley 8

如果您通过代理浏览,$_SERVER['REMOTE_ADDR']可能会设置为代理的IP地址而不是最终用户的IP地址.

在这种情况下,您可以使用其他标题:此页面提供了一个检查所有可能性并提供最有可能是最终用户的地址的函数:

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

但是,如果用户使用配置错误的代理或恶意代理,或者设计用于匿名最终用户的代理进行代理,那么您将无法保证除了之外的任何标头REMOTE_ADDR(这只会引导您到达目的地)代理).

如果您的最终用户通过HTTPS浏览,那么REMOTE_ADDR将始终是他的IP地址; 您无法通过HTTPS使用代理转发.因此,绝对确定他的地址的一种方法是让他用HTTPS打开你的网站.

  • 5年后,这仍然是一个可靠的解决方案吗? (2认同)

Álv*_*lez 7

您可以将在覆盖任何物品$_SERVER阵列,包括你提到的,在一个你的服务器; 当然,不是别人的.

但是,它不会更改计算机的IP地址.