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}

相关推荐
IT_陈寒16 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端
kyriewen16 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Yeyu16 小时前
刷新一帧的艺术:invalidate / postInvalidate / postInvalidateOnAnimation全解析
android
牧艺17 小时前
从零到协同:构建类飞书在线文档系统的五个技术重难点
前端·人工智能
红尘散仙17 小时前
想写一个像样的终端 App?试试把 React 的开发体验搬进 Rust TUI
前端·rust
袋鼠云数栈UED团队18 小时前
一套 Spec-First 的 AI 编程工作流
前端·人工智能
袋鼠云数栈前端18 小时前
一套 Spec-First 的 AI 编程工作流
前端·ai+
angerdream18 小时前
Android手把手编写儿童手机远程监控App之vue3 路由守卫
前端
不服老的小黑哥18 小时前
AI规范驱动编程-harness工程项目实战
前端
vivo互联网技术18 小时前
从 Web 到桌面:基于 Tauri 2.0 + Vue 3 打造 vivo 线下门店「大头贴」拍照体验系统
前端·rust