一尘不染

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

php

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

我想伪造一个请求:

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

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


阅读 1454

收藏
2020-05-26

共1个答案

一尘不染

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

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

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

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

重要

如果您使用框架来访问此信息,请 绝对确保 它不检查X-HTTP-FORWARDED- FOR标题!否则,伪造IP地址很简单。例如,如果您使用的是ZendFramework的Zend_Controller_Request_Http::getClientIp方法,请绝对确保将其false作为参数传递!否则,有人只需要发送HTTP标头即可:X-Http- Forwarded-For: 127.0.0.1它们现在看来是本地的!在这种情况下,使用框架而不了解后端的工作原理确实很糟糕。

2020-05-26