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 内置的 Exception 类,把题目要求的字符串作为报错信息传进去$a=newException("ctfshow_i_love_36D");// 序列化看看结构echourlencode(serialize($a));?>url编码前:
url编码后:
我们现在只需要把生成的payload:传给ctfshow
就拿到flag
flag为:ctfshow{690aced9-44d5-4241-bfb7-e34a558c2b4d}
