当前位置: 首页 > news >正文

ctf show web入门259

这是一道php反序列化和ssrf结合的题目,先看题目给的提示

这里的代码对 X-Forwarded-For(XFF)头进行了两次 array_pop(弹出尾部元素)。

意味着如果你的 XFF 头形如 127.0.0.1, 8.8.8.8,第一次 pop 弹出 8.8.8.8,第二次 pop 弹出的 $ip 就是 127.0.0.1。

因此,我们需要在请求 flag.php 时,携带特定的 HTTP 请求头:X-Forwarded-For: 127.0.0.1, 127.0.0.1
然后就是题目主题部分了

题目接收一个 GET 参数 vip 并对其进行反序列化

接着调用了 $vip->getFlag();
但是我们可以看到这里并没有定义getFlag()这个方法
通过查询可以知道,如果源码没给类的名字,通常暗示我们要利用 PHP 的内置类。
能够发起 HTTP 请求、并且经常在反序列化中被用来做 SSRF/触发特定方法的 PHP 内置类是:SoapClient
SoapClient 是 PHP 的内置类,用于处理 SOAP 协议请求
它有一个特性:当调用一个 SoapClient 实例上不存在的方法时,它会通过内置的 __call 魔术方法,自动向配置的 location 发送一个 HTTP/POST 请求
题目中调用的 $vip->getFlag(),如果 $vip 是一个 SoapClient 对象,由于它没有 getFlag 方法,就会触发 __call,从而自动向其指定的 URL 发送 POST 请求!这完美契合了我们需要向 flag.php 发送 POST 请求的需求
__call是当试图在一个对象上调用一个不存在或者不可访问的实例化方法时php不会直接报错崩溃,而是会自动自动触发并执行该类中定义的__call()方法

我们需要在本地写一个 PHP 脚本,来生成给 vip 参数传参的序列化字符串。

利用 SoapClient 伪造 POST 和 XFF 头
SoapClient 的构造函数允许我们传入 location(目标地址)和 options(配置项)。我们可以利用 user_agent 配置项来注入换行符(CRLF),从而在发送请求时强行加入我们自定义的 X-Forwarded-For 头和 POST 数据
下面是payload脚本:

<?php// 1. 设置我们要让服务器内部访问的目标(flag.php)$target='http://127.0.0.1/flag.php';// 2. 构造 POST 提交的数据$post_data='token=ctfshow';// 3. 利用 user_agent 注入 CRLF (\r\n) 来伪造 Content-Type, XFF 头 和 Content-Length$user_agent="Wget/1.14 (linux-gnu)\r\n"."X-Forwarded-For: 127.0.0.1, 127.0.0.1\r\n"."Content-Type: application/x-www-form-urlencoded\r\n"."Content-Length: ".strlen($post_data)."\r\n\r\n".$post_data;// 4. 实例化 SoapClient,uri 可以随便填,location 填目标地址$b=newSoapClient(null,array('location'=>$target,'uri'=>'http://127.0.0.1/','user_agent'=>$user_agent));// 5. 输出序列化后的字符串echourlencode(serialize($b));?>

我们在本地执行

得到的这串就是被url编码后的序列化内容


这是url编码前的样子
当题目执行 $vip->getFlag() 时,SoapClient 真正发送给 flag.php 的标准 HTTP 请求报文就会变成下面这样
POST /flag.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Wget/1.14 (linux-gnu)
X-Forwarded-For: 127.0.0.1, 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

token=ctfshow

我们将url编码后的内容传给vip

因为这里的X-Forwarded-For传入了两个值都是127.0.0.1通过了提示中的这个验证

flag.php 的第二个限制是必须通过 POST 方式 提交 token=ctfshow
根据 HTTP 协议规范,连续两个换行(即空一行)后面的所有内容,都会被识别为 POST 数据的正文(Body)
你在 _user_agent 的末尾连续注入了两个换行,然后紧跟了 token=ctfshow。同时,为了让后端服务器知道后面有数据、有多少数据,你还顺便伪造了:
Content-Type: application/x-www-form-urlencoded(告诉服务器这是表单提交)
Content-Length: 13(告诉服务器 POST 数据一共有 13 个字符长)
这样,flag.php 在读取请求时,不仅认为你是从本地合法的 IP 访问的,还成功在 $_POST[‘token’] 中收到了 ctfshow 值
最后就可以发起请求访问本地的flag.txt
我们只需要访问:flag.txt 就能拿到flag


flag为:ctfshow{3f303626-1446-4274-88f1-ad45ce2b1c58}

http://www.jsqmd.com/news/905898/

相关文章:

  • 硬件工程师别只懂技术,职场思维同样重要
  • 数据库基础概述
  • 2026 排烟防火阀厂家推荐盘点:3C 全认证 + GB15930-2024合规 - 资讯快报
  • 体验TaoToken聚合API的稳定性,在多日连续调用中观察延迟表现
  • 代码即玩法:非典型游戏开发的英文提示词实践
  • 卖真空泵怎么找客户?下游工厂都在哪里
  • Veo 2 API沙箱环境即将下线倒计时!仅剩最后14天迁移窗口,这份跨版本兼容性迁移矩阵请立刻保存
  • CAXA 标注间距
  • 揭秘Java世界中safepoint之调用过程和生命周期解析
  • 基于Arduino与NRF24L01的厨房油烟机智能联动控制系统设计与实现
  • 对比使用前后Taotoken如何让我的模型API账单变得清晰易懂
  • 2025-2026 AI全媒体营销服务商选型 - 资讯快报
  • Arduino驱动MAX7219点阵屏:从SPI通信原理到动态显示实战
  • 【TSP问题】基于遗传算法GA求解TSP问题附Matlab代码
  • 2026国内全域线上推广头部服务商评测:从技术到转化的全方位对决 - GEO优化
  • 基于Arduino与MAX6675的K型热电偶温度监测系统设计与实现
  • 2026论文双降终极榜单:10款降AI率平台,智能改写快速定稿成文
  • 【DeepSeek华为云部署实战指南】:20年架构师亲授5大避坑要点与3小时极速上线方案
  • 卖换热器怎么找客户?下游工厂在哪里
  • 3步解决B站缓存视频播放难题:m4s-converter一站式智能转换方案
  • 拒绝模板化:极具挑战性的英文前端页面需求
  • 什么是扫码出入库?从原理到落地一次讲清楚
  • 卖工业空压机怎么找客户?下游工厂在哪里
  • 3D打印机改造笔式绘图仪:硬件组装、固件配置与G代码生成全攻略
  • 2026年合肥高新区废品回收公司推荐排行榜TOP5 - 速递信息
  • 仅限首批200位架构师获取:Claude原生消息队列设计规范V2.1(含OpenTelemetry埋点模板+Schema Registry治理策略)
  • 算力时代结束,判断力时代开始
  • ctf show web入门260
  • LangGraph 动态工作流:如何在运行时修改 Agent 的执行图谱?
  • 基于Arduino的智能冰箱门未关提醒系统DIY全攻略