1、阅读题目:php绕过类型。
2、分析题目:
(1)get传参 "str",string转化为字符串,用 is_valid() 函数来进行过滤,要求传入的字符串的每一位字符的ASCII码都在32~125之间。
(2)对于FileHandler类,由于在反序列化中,先调用__destruct()析构方法,所以需要设计op的值绕过与 "2" 的强相等。又因为在__destruct()析构方法中又要调用process()方法,所以又要让op与 "2" 满足弱相等。
(3)所以当op = 2时,一方面利用弱相等,可以调用read()方法和output()方法,另一方面也可以绕过强相等,避免执行在__destruct()时 op 赋值为 1。
(4)在read()函数中,因为用file_get_contents($this->filename)读取filename中的值,所以要通过
php://filter伪协议读取文件,最后用output()函数输出结果。
3、编写php代码:
(1)由于在原代码中,op等的属性为protected,因此只有当前类的成员与继承该类的类才能访问,所以在进行反序列化时无法正常显示。
(2)改正方法:
将protected属性改为public属性(公共的 任何成员都可以访问),即可解决该问题。
4、得到base64,解密得到flag。