X-Forwarded-For 客户端 IP 伪造过程及防范
漏洞名称:存在IP地址伪造漏洞
漏洞等级:中危
关联bug:
漏洞描述:
应用系统存在IP地址伪造漏洞,攻击者可通过修改HTTP请求包伪造IP地址绕过IP地址限制,访问或执行系统相关功能。
漏洞功能点:
账户设置—系统日志
漏洞地址:
/
测试身份:
数据包:
DPOST /yuser-server/managers/testtest/resetPassword HTTP/1.1
Host: 10.200.1.145
Content-Length: 407
Accept: application/json, text/plain, */*
language: zh_CN
appid: ymall
platform: ADMIN
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.68
token: 579b137de27649dba7bc03fdeccedff5
Content-Type: application/json
Origin: http://10.200.1.145
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
X-Forwarded-For:127.0.0.1
Connection: close
{"accountType":"STANDARD","userId":"fffb11418abe4929aa3838a75828ff54","username":"testtest","deptName":null,"jobTitle":null,"mobile":null,"pricePermission":"Phone","lastLoginTime":null,"lockVersion":1,"roleId":"yl0005","roleName":"销售","name":"testtest","activeStatus":0,"email":"chenxd@yealink.com","menuList":null,"partnerList":null,"notifyConfigs":[],"managerAccountId":null,"managerAccountName":null}}
漏洞流程:
1、随便一个会记录日志的操作处,这里以重置密码为例,通过XFF属性头伪造IP地址为127.0.0.1
2、查看日志管理可以看到伪造的IP地址
修复方案:
1.直接对外提供服务的web应用,应通过REMOTE ADDRESS获取IP。
2.对于使用了nginx反向代理的web应用,正确配置应该是在最靠近用户端的代码服务器上强制设定X-Forwarded-For的值为REMOTE ADDRESS。
https://blog.csdn.net/xiaowangku/article/details/112796338
X-Forwarded-For 客户端IP伪造的防范
我们知道 X-Forwarded-For可以被伪造,但是客户端请求来源IP其实是不能被伪造的,因为在客户端和服务端进行通信的时候,我们需要进行三次握手,如果这个来源IP是假的,那么我们的握手是不会成功的,就好像我们给对方写信,如果发件人的地址写错了,那么我们就收不到对方的回信。
在 nginx 中,还有一个配置
proxy_set_header X-Real-IP $remote_addr
$remote_addr 是 nginx 的内置变量,代表客户端的真实IP。
既然我们能够直接获得真实的客户端 IP,那么我们为什么还要获得 X-Forwarded-For 呢?原因在于如果配置了多层的代理,那么这个 X-Real-IP 将会是上一层代理的真实 IP。
我们直接获得 X-Forwarded-For 将会有 IP 被伪造的风险,而使用 X-Real-IP 将会无法获得真实的 IP 地址。我们将两者的优势进行结合,便可防止客户端 IP 伪造。
对于最外层的代理服务器,我们可以进行如下配置:
proxy_set_header X-Forwarded-For $remote_addr
注释掉原配置:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
新增配置:proxy_set_header X-Forwarded-For $remote_addr;