WEB255
这题可以看出,是从cookie处触发了反序列化。只需要$isVip是True的状态,vipOneKeyGetFlag()即可返回flag
注意,由于此处是从cookie处触发,所以payload需要url加密
<?php
class ctfShowUser{
public $isVip=true;
}
$a=new ctfShowUser();
echo urlencode(serialize($a));
?>
WEB256
该题多了个对username和password值的对比
所以,我们只需要增加个通过反序列化修改他们值的操作便好
WEB257
首先,我们知道__construct()函数会被new调用,所以这里我们可以修改其调用的函数,修改至backDoor().并修改$code的值来进行反序列化攻击。
所以,这里我们仅需要保证username和password不为空就够执行该后门了(后面我又发现当cat flag.php时不被执行,所以利用tac进行绕过)
WEB258
/[oc]:\d+:/i
这个正则的意思就是。匹配第一个是0或c,第二个字符是:,第三个字符跟随着数字的这种形式
\d: 匹配一个数字字符。等价于 [0-9]。
+: 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
/i: 表示匹配的时候不区分大小写
所以说如果要绕过这个正则,我们可以把0:数字这种形式改成0:+数字
放一个加号可以直接退出序列处理,从而绕过正则匹配。
详情可以参考https://www.phpbug.cn/archives/32.html
WEB260
额。这题不知道有什么意义
WEB261
在php7.4.0开始,如果类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法,则只有
__unserialize() 方法会生效,__wakeup() 方法会被忽略
__invoke()则要在将对象当做方法来使用才能触发,__sleep()则是被serialize调用,所以也可以忽略不计。
所以现在只需要梳理下图即可
$this->code==0x36d
由于这是双==,即php弱类型,所以只要传递的是877跟上字母即可