ctf show web入门260

这是一道反序列化题,让我们先看代码

这串代码前面告诉我们flag在flag.php中,后面才是校验

要想拿到 $flag,必须满足 if 语句。也就是说:把你通过 GET 传入的 ctfshow 参数进行序列化(serialize)后,得到的字符串里必须包含 ctfshow_i_love_36D 这个子串

但是 PHP 标识符的命名规则为: * PHP 的类名、变量名不能以数字开头,而36D是以数字开头,不符合标识符命名规则

利用 PHP 内置的原生类 Exception 或 Error

PHP 自带的内置类(如 Exception 或 Error)在被序列化时,会把传入的错误/异常信息(Message)原封不动地序列化进去。而这个 Message 只是一个普通的字符串,字符串里包含数字和字母是完全合法的

当我们把这个 Exception 对象送去 serialize() 序列化时,PHP 会把这个对象的所有内部属性和它们对应的值全部转换成文本

序列化后的真实文本结构:

O:9:"Exception":7:{s:7:"*message";s:19:"ctfshow_i_love_36D";s:9:"*string";s:0:"";s:7:"*code";i:0;s:7:"*file";s:18:"D:\phpstudy_pro\WWW\test.php";s:7:"*line";i:3;s:9:"*trace";a:0:{}s:11:"*previous";N;}

O:9:"Exception":这里的类名是 Exception,符合 PHP 命名规范

s:19:"ctfshow_i_love_36D":题目要找的字符串,作为 message 属性的具体值,完完整整地保存在了整个序列化结果中

所以现在我们在本地构造payload:

php 复制代码
<?php
// 实例化一个 PHP 内置的 Exception 类,把题目要求的字符串作为报错信息传进去
$a = new Exception("ctfshow_i_love_36D");

// 序列化看看结构
echo urlencode(serialize($a));
?>

url编码前:

url编码后:

我们现在只需要把生成的payload:传给ctfshow

就拿到flag

flag为:ctfshow{690aced9-44d5-4241-bfb7-e34a558c2b4d}

相关推荐
私人珍藏库4 分钟前
[Android] 发票制作器-内置多行业专业模板
android·人工智能·app·软件·多功能
snpgroupcn30 分钟前
SAP实施风险管控注意事项:四大风险域与防范策略
前端·数据库·人工智能
阿成学长_Cain1 小时前
Linux talk 命令详解:经典终端实时聊天工具,无需图形界面即可对话
linux·运维·前端
lichenyang4531 小时前
从零开始写 HarmonyOS Web 容器:先让 ArkWeb 加载本地 H5
前端
kyriewen1 小时前
一个看不见的撇号,让Claude Code追踪了中国开发者三个月
前端·ai编程·claude
莫生灬灬1 小时前
DY联系人聊天Web面板支持获取联系人/聊天记录/发送消息
前端·chrome·websocket·c#
郑州光合科技余经理1 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
悲凉的紫菜2 小时前
dariy
android·ide·android studio
一tiao咸鱼2 小时前
前端转 agent # 02 - FastAPI 框架入门与原理
前端·python
wanghowie2 小时前
LangGraph4j 落地(二)— ReAct 多步工具与 trace 扩展
前端·react.js·前端框架