首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

WEB安全-伪造X-Forwarded-For绕过服务器IP地址过滤

  • 25-02-16 18:21
  • 4185
  • 6632
blog.csdn.net

转自:http://www.jianshu.com/p/98c08956183d

在正常的TCP/IP 通信中,是可以伪造数据包来源 IP 的,但这会让发送出去的数据包返回到伪造的IP上,无法实现正常的通信。

实现TCP/IP层级别的伪造很难,因为很难实现正常的TCP连接;但是在应用层协议HTTP上的实现较容易,通过伪造IP,能欺骗多数服务器应用程序实现通信。对于绕过服务器的IP地址过滤或者伪造来源IP特别有用,导致的后果就是非授权IP能访问服务器,甚至能钻服务器的漏洞。

这其中的关键就是伪造X-Forwarded-For。

一、X-Forwarded-For介绍

我们知道 HTTP 连接基于 TCP 连接,HTTP 协议中没有 IP 的概念,只能通过X-Forwarded-For来实现。

X-Forwarded-For位于HTTP协议的请求头, 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入RFC 7239(Forwarded HTTP Extension)标准之中。

X-Forwarded-For 请求头格式非常简单:

X-Forwarded-For: client, proxy1, proxy2

可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3 可以在服务端通过 Remote Address 字段获得。Remote Address来自 TCP 连接,表示与服务端建立 TCP 连接的设备 IP,在这个例子里就是 IP3。

Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求。不同语言获取Remote Address的方式不一样,例如Node.js 是req.connection.remoteAddress,原理都一样。

二、X-Forwarded-For伪造

这里我用node.js进行测试

node.js路由级中间件:


中间件

模板引擎:


XLindex.jade

运行node.js应用后,node.js监听3000端口。用Firefox请求链接,结果如下(由于是本机浏览器访问本机搭建的服务器,地址为空。本机地址为127.0.0.1):


http://localhost:3000/

很明显,X-Forwarded-For参数并不是浏览器当前的地址,在这个例子中成功伪造了X-Forwarded-For信息。如果服务器以X-Forwarded-For中的地址(而不是remote address)作为用户的IP地址实行IP地址过滤,很可能让用户通过伪造X-Forwarded-For获取权限,从而导致服务器应用出现漏洞。

三、结语

目前很多Web 应用(例如获取用户所在地区,基于 IP 做访问频率控制,禁止某些IP访问等等),为了获取用户真正的 IP,从 HTTP 请求头中获取 IP地址。这些情况下,必须确保获取到的IP地址是真实可靠的。
经过前面的分析和测试,
1.对于直接使用的 Web 应用,必须使用从TCP连接中得到的 Remote Address,才是用户真实的IP;
2.对于使用 nginx 反向代理服务器的Web应用,nginx必须使用Remote Address正确配置set Headers,后端服务器则使用nginx传过来的相应IP地址作为用户真实IP;同时,后端服务器应使用X-Real-IP 或 X-Forwarded-For最后1段IP作为限制,允许自己的nginx服务器访问,禁止其它IP访问,禁止对外提供服务。

注:本文转载自blog.csdn.net的xiewenbo的文章"https://blog.csdn.net/xiewenbo/article/details/72834964"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top