CTF-Web27(涉及请求头伪造--基础)

"本文详细解读如何利用PHP函数GetIP()绕过伪造IP限制,通过调整header和代理设置获取1.1.1.1 IP,揭示了remote_addr和HTTP_X_FORWARDED_FOR的工作原理及实战应用,最终揭示flag Sim_CTF{daima_shengji}
摘要由CSDN通过智能技术生成

 27. 貌似有点难



分析:

<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    $cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
    $cip = $_SERVER["REMOTE_ADDR"];
else
    $cip = "0.0.0.0";
return $cip;
}
?>

很显然这是一道伪造ip,从而获取flag。

思路:

我们需要想方法使得代码中的GetIP函数获得的IP地址为1.1.1.1,我们就能得到flag。

好,那么现在我们再来查看这个函数,在这个函数中我们可以这样去进行理解,首先查看是否存在$_SERVER["HTTP_CLIENT_IP"],如果存在IP就是它,否则接下来看$_SERVER["HTTP_X_FORWARDED_FOR"],最后看$_SERVER["REMOTE_ADDR"],如果以上三个变量都不存在的话则返回0.0.0.0。

首先检测是HTTP_CLIENT_IP,它对应的是header中的client-ip,所在头文件中设置client-ip:1.1.1.1 就可以满足条件

client-ip 处理

x-forwarded-for 处理

Remote-addr 处理却是乱码

我们在浏览器通过F12进入到 开发者模式 也能进行伪造:

Sim_CTF{daima_shengji}

 

知识点补充:https://blog.csdn.net/smilefyx/article/details/52120461

做网站时经常会用到remote_addrx_forwarded_for这两个头信息来获取客户端的IP,然而当有反向代理或者CDN的情况下,这两个值就不够准确了,需要调整一些配置。

什么是 remote_addr

  remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

什么是 x_forwarded_for

  正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP  (注意:只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。

使用HAProxy做反向代理

  通常网站为了支撑更大的访问量,会增加很多web服务器,并在这些服务器前面增加一个反向代理(如HAProxy),它可以把负载均匀的分布到这些机器上。你的浏览器访问的首先是这台反向代理,它再把你的请求转发到后面的web服务器,这就使得web服务器会把remote_addr设为这台反向代理的IP,为了能让你的程序获取到真实的客户端IP,你需要给HAProxy增加以下配置

option forwardfor

它的作用就像上面说的,增加一个x_forwarded_for的头信息,把你上网机器的ip添加进去

使用Nginx的realip模块

  当Nginx处在HAProxy后面时,就会把remote_addr设为HAProxy的IP,这个值其实是毫无意义的,你可以通过nginx的realip模块,让它使用x_forwarded_for里的值。使用这个模块需要重新编译Nginx,增加--with-http_realip_module参数

  1. set_real_ip_from 10.1.10.0/24;

  2. real_ip_header X-Forwarded-For;

上面的配置就是把从10.1.10这一网段过来的请求全部使用X-Forwarded-For里的头信息作为remote_addr

将Nginx架在HAProxy前面做HTTPS代理

  网站为了安全考虑通常会使用https连接来传输敏感信息,https使用了ssl加密,HAProxy没法直接解析,所以要在HAProxy前面先架台Nginx解密,再转发到HAProxy做负载均衡。这样在Web服务器前面就存在了两个代理,为了能让它获取到真实的客户端IP,需要做以下配置。

首先要在Nginx的代理规则里设定

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

这样会让Nginx的https代理增加x_forwarded_for头信息,保存客户的真实IP。

其次修改HAProxy的配置

option     forwardfor except 10.1.10.0/24

这个配置和之前设定的差不多,只是多了个内网的IP段,表示如果HAProxy收到的请求是由内网传过来的话(https代理机器),就不会设定x_forwarded_for的值,保证后面的web服务器拿到的就是前面https代理传过来的。

为什么PHP里的HTTP_X_FORWARDED_FOR和Nginx的不一样

当你的网站使用了CDN后,用户会先访问CDN,如果CDN没有缓存,则回源站(即你的反向代理)取数据。CDN在回源站时,会先添加x_forwarded_for头信息,保存用户的真实IP,而你的反向代理也会设定这个值,不过它不会覆盖,而是把CDN服务器的IP(即当前remote_addr)添加到x_forwarded_for的后面,这样x_forwarded_for里就会存在两个值。Nginx会使用这些值里的第一个,即客户的真实IP,而PHP则会使用第二个,即CDN的地址。为了能让PHP也使用第一个值,你需要添加以下fastcgi的配置。

fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;

它会把nginx使用的值(即第一个IP)传给PHP,这样PHP拿到的x_forwarded_for里其实就只有一个值了,也就不会用第二个CDN的IP了。

忽略x_forwarded_for

  其实,当你使用了Nginx的realip模块后,就已经保证了remote_addr里设定的就是客户端的真实IP,再看下这个配置

  1. set_real_ip_from 10.1.10.0/24;

  2. real_ip_header X-Forwarded-For;

它就是把x_forwarded_for设为remote_addr,而nginx里的x_forwarded_for取的就是其中第一个IP。

使用这些设置就能保证你的remote_addr里设定的一直都是客户端的真实IP,而x_forwarded_for则可以忽略了

  

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
CTF 竞赛中的 Web 方向主要涉及Web 安全的相关知识和技术。以下是一些常见的 Web CTF 题目类型和相关知识点: 1. 基础知识: - HTTP 协议:了解 HTTP 请求和响应的基本结构,常见的 HTTP 方法和状态码,以及常用请求头和响应头。 - HTML、CSS 和 JavaScript:理解基本的前端开发知识,包括页面结构、样式和交互等。 2. Web 漏洞: - XSS(跨站脚本攻击):了解反射型、存储型和 DOM 型 XSS 攻击,学会如何防范和利用这些漏洞。 - CSRF(跨站请求伪造):掌握 CSRF 攻击的原理和防御方法。 - SQL 注入:了解 SQL 注入的原理、不同类型的注入攻击和防御策略。 - 文件上传漏洞:学会利用文件上传漏洞执行恶意代码,并了解如何防止上传漏洞。 - 文件包含漏洞:了解文件包含漏洞的原理和利用方式。 - SSRF(服务器端请求伪造):掌握 SSRF 攻击的原理和应对方法。 3. Web 安全工具: - Burp Suite:熟悉使用 Burp Suite 进行请求拦截、修改和重放,进行 Web 安全测试。 - SQLMap:学会使用 SQLMap 进行自动化的 SQL 注入漏洞检测和利用。 - XSS 攻击工具:了解常用的 XSS 攻击工具,如 BeEF、XSStrike 等。 4. Web 框架和技术: - 常见的 Web 框架:了解常见的 Web 框架(如 Django、Flask、Express 等)的基本原理和安全特性。 - NoSQL 注入:了解 NoSQL 数据库中的注入漏洞和防御策略。 - RESTful API 安全:学习如何保护 RESTful API 免受常见的攻击,如身份验证、访问控制等。 除了上述知识点,还可以通过参加线上的 CTF 竞赛、阅读相关的 Web 安全文章和书籍来不断提升自己的技能。希望这些信息能对你有所帮助!如有更多问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值