首先了解X-Forwarded-for(简称:XFF)

X-Forwarded-for:简称XFF,它代表客户端,也就是HTTP的请求真实的IP,只有在通过了HTTP代理
或者负载均衡器时才会添加该项。它不是RFC中定义的标准请求头信息,Squid 缓存代理服务器的开发人
员最早引入了这一HTTP头字段,在squid缓存代理服务器开发文档中可以找到详细的介绍。
360百度百科:请点击链接https://baike.so.com/doc/7045641-7268547.html)
==============================================================
一、产生背景00
X-Forwarded-For是用来识别通过HTTP代理或负载均衡方式连接到WEB服务器的客户端最原始的
ip地址请求字段。
获取客户端ip地址的常用方法有两种①Remote Address ②X-Forwarded-for
在java中,获取客户端ip地址最简单的方式就是request.getRemoteAddr()——即第一种。这种方
式能直接获取到连接服务器的客户端ip,“在中间没有代理的情况下,的确是最简单有效的方式”。但
是目前互联网web应用很少会将应用服务器直接对外服务,有的甚至可能有多层代理。在有反向代理的
情况下直接使用request.getRemoteAddr(),获取到的ip地址是Nginx(或其他的代理服务器的ip地址)
,而不是客户端的ip地址。而HTTP协议是基于TCP协议的,由于request.getRemoteAddr()获取到的
是TCP层直连的客户端ip,对于web应用服务器来说直接连接它的客户端实际上是Nginx,也就是说TCP
层是拿不到真是的客户端的ip的。
为了解决上面的问题,很多HTTP代理会在HTTP协议头中添加 X-Forwarded-for头,用于追踪请求
来源最真实的ip地址。
-----------------------------------------------------------------------------------------------------
二、格式:
该HTTP头一般如下:
X-Forwarded-For:client1,proxy1,proxy2,proxy3
服务端收到的信息:X-Forwarded-For:IP0,IP1,IP2

三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0
其中实物值通过一个 逗号+空格 把多个IP地址区分隔开,最左边(client1)是最原始客户端的IP地址
代理服务器每成功收到一个请求,就把 《“请求来源的IP地址”》添加到右边。在上面的例子中,这个
请求成功通过了三台代理服务器:proxy1,proxy2,proxy3。
注意:①添加的是“请求来源的IP地址”
②是“添加ip地址”而不是“覆盖ip地址”
③列表中之所以没有IP3,是因为proxy3直连服务器,他会给XFF追加IP2,表示它是在帮proxy
2转发请求,而IP3可以在服务端通过Remote Address 字段获得。由于HTTP是基于TCP连
接,HTTP协议中没有IP的概念,Remote Address 来自于TCP 连接,表示与服务器建立TCP
连接的设备IP,在这个例子里就是 IP3。
@具体的请求过程:在请求刚从client1中发出的时候,XFF是空的,当请求“通过”第一个
代理的时候,由于添加的是“请求来源的IP地址”,所以该代理服务器会把客户端/浏览器的IP
地址(即最原始的IP地址)添加为client1;当“通过”第二个代理的时候,由于添加的是“请求来源的IP
地址”,所以该代理服务器会把第一个代理的ip地址“添加”到proxy1;当通过第三个代理的时候,由
于添加的是“请求来源的IP地址”,所以该代理服务器会把第二个代理的IP地址“添加”到proxy2;。

从该过程便可以发现:由于添加的是“请求来源的IP地址”,所以导致在“第一个代理处”添加“最
原始的ip地址”,在“第二个代理”处添加“第一个代理的ip地址”。。这样的错位的关系。
-----------------------------------------------------------------------------------------------------
三、简单用法举例:
public String getClientIp(HttpServletRequest request) {
    String xff = request.getHeader("X-Forwarded-For");
  if (xff == null) {
    return request.getRemoteAddr();
  } else {
    return xff.contains(",") ? xff.split(",")[0] : xff;
  }
}
---------------------
另外,要让Nginx支持X-Forwarded-For头,需要配置:
roxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
以上就是一种常用的获取客户端真实ip的方法:首先从HTTP头中获取X-Forwarded-For,如果X-Forwarded-For
头存在就按逗号分隔取“最左边”第一个ip的地址,不存在就直接通过request.getRemoteAddr()获取ip地址
$proxy_add_x_forwarded_for会将和Nginx直接连接的客户端ip追加在原有的X-Forwarded-For值得
右边。
注意:在使用X-Forwarded-For获取ip是,默认获取的是最左边的值(即client1)
-------------------------------------------------------------------------------------------------------
四、利用X-Forwarded-For伪造客户端ip漏洞:
首先,Remote Address是无法伪造的,因为是直接从TCP连接信息中获取到的,而建立TCP连接需要
三次握手,如果伪造了源ip,便无法建立TCP连接,更不会有后面的HTTP请求。
但是,X-Forwarded-For头是可以伪造的。
一般的客户端(eg:浏览器)在发送请求的时候是没有X-Forwarded-For头的,当请求到达第一个代理
服务器的时候,代理服务器会加上X-Forwarded-For请求头,并将值设为客户端的ip地址(也就是最左边
的第一个值),后面如果还有多个代理,会依次将ip追加到X-Forwarded-For都的最右边,最终请求到达
web应用服务器,应用通过获取X-Forwarded-For头取左边第一个ip即为客户端真实ip
但是如果客户端在发送请求时,在请求头上带上一个伪造的X-Forwarded-For,由于后续每层代理只
会追加为不会代理,那么最终到达应用服务器时,获取的左边第一个ip地址将会是客户端伪造的ip。也就
是上面的java代码中getClientIp()方法获取的ip地址很有可能是伪造的ip地址,如果没有加以限制,则会
造成巨大的安全隐患
可以利用工具Postman或burpsuite进行XFF攻击%e6%b5%85%e6%98%93%e6%b7%b1
-------------------------------------------------------------------------------------------------------
五、如何防范(略)
==============================================================
CTF----管理员系统:(再此使用的是burpsuite)
打开之后首先很容易想到是sql注入,但是在输入值并submit之后发现并不是,并且出现一句提示
“ip禁止访问,请联系本地管理员登录,ip已被记录”,发现在提示中有“本地管理员”,便想到:
可以伪装成本地访问。
另外,通过看源代码发现在最底部有一条用base64编码的注释,解码得到“text123”,由于是用管理员
登录,所以用户名应该是admin,那么text123就应该是密码了
然后
使用burpsuite进行抓包,发送到Repeater进行改包:即在Headers中添加一对键值对:X-Forwarded-
For:127.0.0.1,在GO一下,就可以得到flag了。

X-Forwarded-for漏洞解析的更多相关文章

  1. Web安全测试中常见逻辑漏洞解析(实战篇)

    Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...

  2. XSS漏洞解析(一)

    以前写程序没有怎么关注这些网络安全问题,随着自己写的程序越来越多,开始关注了网络安全了. 一.什么是XSS XSS(Cross-Site Scripting) 跨站脚本是一种经常出现在web应用程序的 ...

  3. glassfish任意文件读取漏洞解析

    一.背景: glassfish是一款java编写的跨平台的开源的应用服务器. 二.漏洞原理: 与宽字节SQL注入一致,都是由于unicode编码歧义导致的.具体payload如下构造: http:// ...

  4. 2. Web渗透测试中常见逻辑漏洞解析与实战

    注:以下漏洞示例已由相关厂商修复,切勿非法测试! 0x01 漏洞挖掘 01  注册 注册中最常见的有两个,一个是恶意注册,另一个是账户遍历.一个好的注册界面应该是这样 或者这样的 而不是这样的 要么使 ...

  5. XSS漏洞解析(三)

    系统存在xss漏洞就容易引发CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为: ...

  6. XSS漏洞解析(二)

    上篇我们讲了XSS的一些相关的内容,这篇我们就直接上代码demo解决实际问题吧. 主要的问题是xssfilter的编写,我们直接去网上找一下框架,一般有js,php,java等语言都有相关的XSS的相 ...

  7. pikachu-暴力破解漏洞解析

    本篇blog导航 ~暴力破解&暴力破解漏洞概述 ~基于表单的暴力破解实验 ~暴力破解的绕过和防范(验证码&Token)     ~验证码的基础知识     ~验证码绕过(on clie ...

  8. URL重定向漏洞解析

    参考文章 悟空云课堂 | 第二期:URL重定向(跳转)漏洞 CWE-601: URL Redirection to Untrusted Site ('Open Redirect') 分享几个绕过URL ...

  9. 渗透测试学习 十五、 文件上传&&解析漏洞

    大纲:文件解析漏洞 上传本地验证绕过 上传服务器验证绕过 文件解析漏洞 解析漏洞主要说的是一些特殊文件被IIS.Apache.Nginx在某些情况下解释成脚本文件格式的漏洞. IIS 5.x/6.0解 ...

随机推荐

  1. 如何利用火焰图定位 Java 的 CPU 性能问题

     常见 CPU 性能问题 你所负责的服务(下称:服务)是否遇到过以下现象: 休息的时候,手机突然收到大量告警短信,提示服务的 99.9 line 从 20ms 飙升至 10s: 正在敲代码实现业务功能 ...

  2. CTF 自动拼图

    忘记在哪个群里面看见有师傅说过这样一句加,百度搜索"CTF拼图脚本,有惊喜". 在做JUSTCTF的题时候,看到一道拼图题.就想着试一试. 先百度搜了,看到了fjh1997师傅的一 ...

  3. 初探Windows用户态调试机制

    我们在感叹Onlydbg强大与便利的同时,是否考虑过它实现的原理呢? 作为一个技术人员知其然必知其所以然,这才是我们追求的本心. 最近在学习张银奎老师的<软件调试>,获益良多.熟悉Wind ...

  4. Arcpy按属性(字段值)不同将shp分割为多个独立shp_适用点线面矢量

    利用代码可以进行批量处理,安装有10.5及以上版本ArcGIS可以使用工具Split by attributes完成上述任务 # -*- coding: utf-8 -*- # Import syst ...

  5. Excel数据导出功能

    HTML代码: <a id="aExportData" hidden><span>Export</span></a> <div ...

  6. Linux下使用JDK11部署Nacos启动报错:Could not find or load main class

    Linux下使用JDK11部署Nacos 错误日志 /nacos/jdk-11.0.12/bin/java -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize ...

  7. JAVA获取昨天、今天、明天等日期

    /** * 获取明天的日期字符串 * @return */ public static String tomorrowDateStr(){ Date date=new Date();//取时间 Cal ...

  8. linux 设备文件的操作

    文件:包含数据,具有属性,通过目录中的名字被标识, 可以从文件读数据,可以向文件写数据. 设备也支持文件的操作. 每个设备都被当作一个文件,具有文件名,i-节点号,文件所有者,权限位的集合,最新修改时 ...

  9. js中字符串和数组的常用转换处理方法

    1.split("分割条件(正则表达式或者字符)") 字符串 ==> 数组 默认返回数组 (1) 将单词分割为字符 "hello".split(" ...

  10. 1170 - Counting Perfect BST

    1170 - Counting Perfect BST   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...