O:表示这是一个对象
3:对象的名称Sel有3个字符
Sel:对象的名称
3:对象属性的个数
s:变量名数据类型为string
i:变量age的名字长度
*ss:变量名称(protected属性的变量名会在序列化时会在变量名前加上一个" %00*%00")
P rivate属性的变量名会在序列化时会在变量名前加上一个“ %00类名%00",
例题 1
打开后界面如下:
抓包查看index默认有一个post请求,func引用了date方法,查看当前日期时间对应Y-m-d h:i:s a
可以判断出func引用php函数,p则对应value。构造一下func=file_get_contents&p=index.php,来查看一下当前index.php的源码
可以看到过滤了很多不安全的函数,但是没有禁用反序列化函数unserialize,且存在一个class类:class Test
解题思路:
(1)目前Test并没有实例化,所以无法触发__destruct()
(2)解题目标是规避掉func的黑名单检查,所以需要利用call_user_func函数执行反序列化函数,从而创建一个Test实例,然后触发__destruct()函数
(3)利用其触发__destruct()后会将Test实例中的func值和p值传递给gettime,因为此前已经通过了黑名单检查,所以此时可以执行system等命令。