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


68

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

我想伪造一个请求:

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

我如何用PHP做到这一点?CURL可以这样做吗?

Answers:


112

我认为您的意思是远程伪造。简短的答案是可以。关于它多么容易的长答案取决于您要伪造它的方式。

如果您不希望收到响应,那么就像打开原始套接字到目标并伪造源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


17

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

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


此外,似乎需要对TCP堆栈和网卡驱动程序进行一些调整。
阿尔瓦罗·冈萨雷斯

12

Apache$_SERVER['REMOTE_ADDR'] 从用于与浏览器通信的TCP套接字填充。这是不可能的了,因为的开放的互联网来影响这个变量三方握手。如果客户端和服务器位于诸如wifi之类的广播网络上,则可以嗅探电线并完成握手。


9

如果您通过代理浏览,则$_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打开您的网站。


2
5年后,这仍然是可靠的解决方案吗?
乔纳森


3

REMOTE_ADDR

用户正在从中查看当前页面的IP地址。

您可以使用代理等请求脚本来更改IP地址,但是您无法在其中设置任何所需的文本。


3

这是由apache或您使用的任何服务器设置的变量。你不能欺骗它。您可能$_SERVER['REMOTE_ADDR']='127.0.0.1';在脚本的开头运行,但是我怀疑那是您要尝试执行的操作

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.