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

问题描述 投票:67回答:8

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

我想用以下方法伪造请求:

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

我该如何使用PHP? CURL可以这样做吗?

php security
8个回答
110
投票

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

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

但是,如果您可以破坏IP所在的网关,则可以执行任何您想做的事情。因此,如果您破坏了与计算机连接的wifi路由器,则可以装作是那台计算机,而服务器不会告诉您区别所在。如果您破坏了ISP的出站路由器,则可以(至少在理论上)假装是计算机,而服务器则无法分辨出区别。

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

但是,如果您实际上损害了本地计算机/服务器,则只能在TCP下伪造127.0.0.1回送地址。那时候真的重要吗?

重要

如果您正在使用框架来访问此信息,请绝对确定不要检查X-HTTP-FORWARDED-FOR标头!否则,伪造IP地址很简单。例如,如果您使用的是Zend Framework's Zend_Controller_Request_Http::getClientIp方法,请务必确保将Zend_Controller_Request_Http::getClientIp作为参数传递!否则,有人只需要发送一个HTTP标头:false,它们现在看来是本地的!这是一种情况,在不了解后端如何工作的情况下使用框架确实很糟糕...

编辑:相关

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

X-Http-Forwarded-For: 127.0.0.1


17
投票

远程地址不是出于礼貌而添加的,它在IP协议中用于路由程序包,因此,如果您单击How I Hacked StackOverflow,您将不会收到响应,并且由于您正在谈论的是HTTP请求,因此通过TCP连接进行传输,该连接需要几个IP数据包(以及匹配的响应)进行设置:

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


12
投票

Apache从用于与浏览器通信的TCP套接字填充send a package with a fake address。由于$_SERVER['REMOTE_ADDR'],在开放的Internet上影响此变量是IMPOSSIBLE。如果客户端和服务器位于诸如wifi之类的广播网络上,则可以嗅探电线并完成握手。


8
投票

如果通过代理浏览,three-way-handshake可能设置为代理的IP地址,而不是最终用户的IP地址。>

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

$_SERVER['REMOTE_ADDR']

但是,如果用户使用配置错误的代理,恶意的代理或旨在匿名化最终用户的代理进行代理,则您将无法保证http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html以外的任何标头(带领您到达代理服务器)。

如果最终用户正在通过HTTPS浏览,则REMOTE_ADDR将始终是其IP地址;您不能通过HTTPS使用代理转发。因此,一种绝对确定其地址的方法是让他使用HTTPS打开您的网站。


7
投票

您可以在[[您的


3
投票
$_SERVER

3
投票
这是由apache或您使用的任何服务器设置的变量。你不能欺骗它。您可以在脚本的开头运行REMOTE_ADDR,但我怀疑那是您要执行的操作

0
投票
Guzzle Cliente HTTP,路由器和冈比亚La Clave和nombre de la红色wifi。[西班牙文] [西班牙文] [西班牙文] [西班牙文] [西班牙文] [西班牙文]
© www.soinside.com 2019 - 2024. All rights reserved.