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}

相关推荐
柳鲲鹏3 小时前
股票打新,中签为什么难?
笔记
亮工硬件3 小时前
1-8 简易串口通讯协议(UART + 自定义帧协议)
笔记·stm32·单片机·嵌入式硬件·学习
做萤石二次开发的哈哈3 小时前
海康班班通交互一体机技能接入实战:ISAPI透传+OTAP双协议封装,Web/App/小程序教学管理应用一站生成
前端·物联网·小程序·交互·萤石开放平台·蓝海aiot一站式工作台·aiot开发
计算机魔术师3 小时前
Anthropic一次性锁死十年算力,5170亿美元买什么
前端
IT_陈寒3 小时前
Redis的订阅丢失消息?你可能忘了这个配置
前端·人工智能·后端
头茬韭菜4 小时前
第 3 篇:「Pydantic 即 Schema」—— 工具生态三层解剖
前端·chrome·ai·openmanus
脚踏实地,坚持不懈!4 小时前
Android 系统工程师(性能/功耗/稳定性)岗位问题深度解析:从内核源码到实战排查(完善版)
android·linux·运维·服务器
志尊宝4 小时前
Vue3 零基础每日笔记(004):模板语法初识——插值表达式、v-bind、v-on 一次学会
javascript·vue.js·笔记
Kapaseker4 小时前
适配小米“中”折屏,非得买一台吗
android·kotlin