如何伪造$ _SERVER variables?
是否有可能伪造或劫持$_SERVER['REMOTE_ADDR']
variables的内容?
我想伪造一个请求:
$_SERVER['REMOTE_ADDR']='127.0.0.1';
我怎么能用PHP做到这一点? CURL可以做到这一点吗?
我假设你的意思是远程伪装。 简短的回答是,你可以。 关于这是多么容易的长答案取决于你想如何伪造它。
如果你不关心接收响应,就像打开一个原始套接字到目的地并伪造源IP地址一样简单。 我不确定在PHP中执行真的很容易,因为所有的PHP套接字实现都在TCP级别之上或之上。 但我相信这是可能的。 现在,由于你不在networking的控制之下,这个回应不会回复给你。 这意味着你不能(可靠地)通过一个微不足道的TCP报头来创build一个TCP连接(因为syn-ack通过要求双向通信来防止这种情况)。
但是,如果你可以妥协网关的IP,你可以做任何你想要的。 所以,如果你妥协的计算机连接到无线路由器,你可以假装是那台计算机,服务器将无法区分。 如果你妥协了ISP的出站路由器,你可以(至less在理论上)假装是电脑,服务器不会分辨出来。
有关更多信息,请参阅以下链接:
- ServerFault问题
- 赛门铁克文章
- Linux安全文章
但是,如果实际损害本地计算机/服务器,则只能在TCP下伪造127.0.0.1
环回地址。 在那一点上它真的很重要吗?
重要
如果您使用框架来访问此信息,请确保它不检查X-HTTP-FORWARDED-FOR
标头! 否则,伪造IP地址是微不足道的。 例如,如果您使用的是Zend Framework的Zend_Controller_Request_Http::getClientIp
方法,请确保您传递false
作为参数! 否则,有人只需要发送一个HTTP头: X-Http-Forwarded-For: 127.0.0.1
,他们现在似乎是本地的! 这是一个使用框架而不理解它在后端工作的情况真的很糟糕的情况。
编辑:相关
我最近写了一篇关于如何偶然发现StackOverflow应用程序中的漏洞的博文。 这里非常相关,因为它利用了一个非常类似的机制来解决这个问题(尽pipe周围的情况有些狭窄):
我如何入侵StackOverflow
远程地址不是出于礼貌的目的,在IP协议中用于路由软件包,所以如果你发送一个虚假地址的软件包 ,你将不会收到响应,而且由于你正在谈论一个HTTP请求,它是通过一个TCP连接传递的,它需要几个IP数据包(和匹配的响应)来build立:
不,这是不可能的(当然除了通过回送接口实际发送来自同一主机的请求)。
Apache从它用来与浏览器通信的TCP套接字填充$_SERVER['REMOTE_ADDR']
。 由于三方握手 ,在开放的互联网上影响这个variables是不可能的 。 如果客户端和服务器在广播networking上,比如wifi,那么你可以通过嗅探线来完成握手。
您可以覆盖服务器中$_SERVER
数组中的任何项目,包括您提到的项目; 当然不是在别人的。
但是,它不会更改您的计算机的IP地址。
如果您通过代理浏览, $_SERVER['REMOTE_ADDR']
可能被设置为代理的IP地址,而不是最终用户的IP地址。
在这种情况下,还可以使用其他标题:此页面提供了一个检查所有可能性并提供最可能成为最终用户的地址的函数:
http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html
但是,如果用户使用configuration不当的代理或恶意代理,或者devise为隐藏最终用户的代理,那么您将无法保证除REMOTE_ADDR
以外的任何标头(这只会导致您至远作为代理)。
如果您的最终用户正在通过HTTPS进行浏览,那么REMOTE_ADDR
将始终是他的IP地址; 您不能通过HTTPS使用代理转发。 因此,确保他的地址的一个方法就是让他用HTTPS打开你的网站。
REMOTE_ADDR
用户正在查看当前页面的IP地址。
您可以使用代理等请求脚本来更改IP地址,但不能在其中设置任何您想要的文本。
这是由apache或任何你使用的服务器设置的variables。 你不能欺骗它。 你可以运行$_SERVER['REMOTE_ADDR']='127.0.0.1';
在脚本的开头,但我怀疑你正在尝试做什么