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}

相关推荐
石小石Orz3 小时前
我发现了开发者AI产品营收的新方向
前端·虚拟现实
老马识途2.03 小时前
关于跨域问题的总结
java·前端
别惊醒渔人5 小时前
Vue3 Diff 优化:最长递增子序列 LIS
前端·javascript·vue.js
颜酱5 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
用户059540174465 小时前
把AI长期记忆测试从手动验证换成pytest,2天揪出11个隐藏Bug
前端·css
solo_995 小时前
用 LSPosed 模拟录屏音频编码器卡顿:从思路到落地
android
FellAveal5 小时前
【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)
笔记·学习·golang
zzq77975 小时前
别把大模型 API Key 写进 APK:移动 AI 应用接口防盗刷实践
android·人工智能·安全·app加固·御盾安全·安卓加固
xqqxqxxq6 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
龙仔7256 小时前
人大金仓OS_Core数据库自动备份实施笔记(银河麒麟Linux)
linux·数据库·笔记·备份·人大金仓