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

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

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

我如何用PHP做到这一点? CURL可以以某种方式做到这一点吗?

最佳答案

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

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

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

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

  • ServerFault Question
  • Symantec Article
  • Linux Security Article

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

    重要的

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

    编辑:相关

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

    How I Hacked StackOverflow

    10-01 15:50