[Web/IP]真实IP获取原理/客户端IP伪造测试

真实IP获取和客户端IP伪造

近期比赛又做到了用户IP伪造的题目,想来不如就总结一下。

为什么要确认IP?

在Web应用下,部分逻辑需要确认用户的客户端IP。如对大量频繁发送危险请求的IP进行封禁。

进行用户IP确认的方法有很多,但是部分方法降低了IP获取的难度,确牺牲了安全性,产生了IP可伪造的风险。

服务器是如何确定IP的?

REMOTE_ADDR

标识发出请求的主机IP地址,代表客户端IP。这个标识完全由服务器决定,除了路由之外无法伪造,通过TCP协议根据直接请求来源的远程主机确定,服务端根据请求TCP包的IP指定的,简单说就是,客户端和服务器握手时的IP。

代理服务器

上面介绍了REMOTE_ADDR,当客户端访问Web服务器时,请求经过了代理服务器,上述方法将无法获得最终客户端IP。

当客户端使用匿名代理(anonymous)时,本地发送的请求经由代理IP转发后到达目标服务器,因此,目标服务器会将直接和它交互的那个代理IP的REMOTE_ADDR当作客户端的IP,然而事实并非如此,但仍具有参考意义。

XFF头

自定专用消息头可通过’X-’ 前缀来添加,非规范类,标准头部实际为Forwarded。

在未被篡改、不考虑安全性的条件下,这个标识代表的是客户端的真实IP。如果一个请求经过了多个代理服务器,那么每一个代理服务器的IP地址都会被依次记录在内。

来源: 代理服务器。请求经过带有HTTP代理和负载均衡功能的服务器时,为了防止Web服务器无法获取客户端真实IP,代理服务器会添加XFF头来保存请求的最终来源。

Client-Ip

和XFF一样,同样是代理服务器发送的HTTP头,如果使用“超级匿名代理”,返回值为none

Host

指明了请求将要发送到的服务器主机名和端口号,非可控的参数,安全。

Referer

引导用户代理到当前页的前一页的地址,,可修改不可信。

PHP$_SERVER

PHP 服务器和执行环境信息

哪些可能会有伪造

Client-Ip: 127.0.0.1
X-Forwarded-For: 127.0.0.1
Referer: www.abc.com
测试
<?php
$content = $_GET['txt'];
........
file_put_contents($dir_path."/request.txt",print_r($_SERVER,true));

通过向服务器上的此脚本发送使用Burp添加了下列内容的请求,

请添加图片描述

打开保存到文件的请求$_SERVER记录,可以看到

请添加图片描述

三项均被修改,而REMOTE_ADDR为握手客户端IP,此三项确实可以伪造。

另外,

注意到$_SERVER[‘SERVER_ADDR’]为一个局域网IP,开始感到很奇怪,查到以下内容

$_SERVER[‘SERVER_ADDR’] 是当前运行脚本所在的服务器的 IP 地址。继续查询,某位不知名大佬回答,“谁是调用 php 的服务器,就是谁”,带着疑问在服务器上ifcongfig,对比网卡etho0的IP值发现两者果然一致。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值