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

2022-08-30 08:57:54

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

我想伪造一个请求:

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

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


答案 1

我假设你的意思是远程伪造它。简短的回答是肯定的,你可以。关于它有多容易的长答案取决于你想如何伪造它。

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

但是,如果您可以破坏IP关闭的网关,则可以执行任何操作。因此,如果您破坏了计算机连接到的wifi路由器,则可以假装是该计算机,并且服务器不会区分。如果您破坏了ISP的出站路由器,您可以(至少在理论上)假装是计算机,服务器不会区分。

有关详细信息,请参阅以下链接:

但是,只有在实际破坏本地计算机/服务器的情况下,您才能在TCP下伪造环回地址。在这一点上,这真的重要吗?127.0.0.1

重要

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

编辑:相关

我最近写了一篇博客文章,讲述了我如何偶然发现StackOverflow应用程序中的漏洞。它在这里非常相关,因为它利用了与这个问题所寻找的非常相似的机制(尽管围绕它的情况有些狭窄):

我如何破解堆栈溢出


答案 2

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

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


推荐