真实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值发现两者果然一致。

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

  1. 获取当前客户端ip,并且根据ip获取当前城市和天气

    获取天气的接口来自网友,我是连接地址 获取当前客户端真实ID:(此方法不可用,为网络爬虫)如果百度找不到方法的朋友来着看看吧https://www.cnblogs.com/pojdd/p/864761 ...

  2. X-Forwarded-For详解、如何获取到客户端IP

    我们先看看官方定义 X-Forwarded-For X-Forwarded-For (XFF) 在客户端访问服务器的过程中如果需要经过HTTP代理或者负载均衡服务器,可以被用来获取最初发起请求的客户端 ...

  3. PHP 获取用户客户端IP的解决方案

    使用PHP获取用户客户端真实IP的解决方案 获取客户端ip其实不是个简单的活儿,因为存在Ip欺骗,和代理问题,所以获取客户端的IP的真实性会打折扣的,不能百分百准确.但是我们还是尽量找一个比较完善的获 ...

  4. java 本机局域网真实ip_Java获取本机ip地址,并扫描本机所在局域网的电脑设备

    Java获取本机IP地址,并根据IP地址的网段,扫描局域网里面的电脑设备; import java.io.IOException; import java.net.Inet4Address; impo ...

  5. php获取虚拟机ip,php如何获取用户的ip地址

    直接上代码 /** * 获取客户端IP地址 */ function real_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (isset($_SERVER['HTT ...

  6. python切换ip群发邮件_python获取外网IP并发邮件的实现方法

    第一步:通过ip138来爬取外网ip 第二步:通过python的smtplib模块和email来发送邮件,具体用法去网上搜索, 下面是代码示例: #!/usr/bin/env python #codi ...

  7. 利用JS获取IE客户端IP及MAC的实现

    B/S结构的系统时,我们常常需要获取客户端的一些信息,如IP和MAC,以结合身份验证.在ASP.NET中,要获取服务器端的MAC很容易,但是要获取客户端的MAC的地址确要花费一翻心思,通常的做法是调用 ...

  8. 【转】C#获取电脑客户端IP地址及当前用户名

    在C#中获取一台电脑名,IP地址及当前用户名是非常简单,以下是我常用的几种方法: 1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息: ...

  9. javascript获取浏览器客户端IP

    <script language="JavaScript"> function GetLocalIPAddr(){ var oSetting = null; var i ...

最新文章

  1. 2012年上海市高等学校计算机等级考试试卷,2012年上海市高等学校计算机等级考试A试卷...
  2. 【微信小程序】token/session失效了该怎么跳转页面
  3. django models中批量导入数据
  4. c语言遗传算法实例ppt,遗传算法的C语言程序案例.doc
  5. java微信公众号授权登录
  6. Duplicate Finder and Remover for Mac(重复文件查找删除工具)
  7. 五大学科竞赛奖项&106所综合评价院校对照表(分省统计)
  8. 2019成长复盘2020成长规划
  9. 实用机器学习-学习笔记
  10. 字节跳动2020秋招笔试题
  11. pr模板.mogrt格式安装方法
  12. 视频直播APP开发的主要功能
  13. Exchange2007新建邮件页面里加涉密信息提示的实现方法(世博局)
  14. 什么是 ARIMA模型
  15. python中的列表生成式 | 字典生成式
  16. 南开大学python编程基础_[南开大学]20春学期《Python编程基础》在线作业(答案100分)...
  17. lyx的快乐的密室逃脱汇总记录(严重剧透+长期更新)
  18. 零基础怎么学手绘,多久能学会?
  19. 多普达586短信中心号码设置
  20. 线下python培训班哪个好

热门文章

  1. Rust泛型Generics
  2. 关于快捷支付,你需要了解的
  3. 区块链 (数据结构)
  4. 禁止ftp用户ssh登录,允许ftp登录
  5. AR9344中ethernet处理方式分析
  6. ROS入门21讲---ROS命令行工具的使用
  7. 轻音乐背后的故事_研究背后的故事
  8. 夜幕团队成员的工资究竟几 K ?
  9. Android LiveData crash: Cannot add the same observer with different lifecycles
  10. c# 微光互联 TX200 -wf 二次开发